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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime
    Извиняюсь, стормозил. ДУмал про экспорт в обратную сторону.
    Рекомендую посмотреть книжку Integrating Excel and Access.
    Я здесь давал недавно ссылку.
    http://forum.ru-board.com/topic.cgi?forum=93&topic=0461&start=120#5
    Если уже затерли, сообщи.
     
     
    Добавлено:
    Anton T
    По-моему, тебе The okk уже ответил. Или не устраивает?
     
    Добавлено:
    The okk
    А где этот ListView можно взять?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 18:05 14-12-2006
    RDVAS

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть Help для VBA  Office2003 на русском языке?

    Всего записей: 4 | Зарегистр. 11-12-2006 | Отправлено: 19:02 14-12-2006
    Anton T

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Yuk
    Устраиваю, но не все, там 1 столбец по фамилию и все, а надо все - имя, отечество и т.д.

    Всего записей: 325 | Зарегистр. 12-04-2006 | Отправлено: 19:35 14-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Что-то я совсем запутался, что тебе надо.  
    Давай еще раз, с начала и поподробнее.
    Если долго объяснять, может файл выложишь?

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 20:24 14-12-2006
    The okk



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
    Это майкрософтовский контрол, он у тебя должен быть. Лежит в system32\mscomctl.ocx
    В VBA заходишь в tools - additional controls и там будет "Microsoft Listview Control" (у меня 6-я версия).
     
    Добавлено:
    Anton T
    Т.е. в листах фамилия, имя и отчество в разных столбцах, а надо, чтобы в листбоксе было все в одном столбце - и имя и отчество и фамилия?
    Тогда используй конкатенацию. Вместо strAA = ls.Cells(Rowcounter,1) пиши:
    Код:
     
    strAA = ls.Cells(Rowcounter,1) & " " & ls.Cells(Rowcounter,2) & " " & ls.Cells(Rowcounter,3)

    Это если у тебя Фамилия - в первой колонке, Имя - во второй, Отчество - в третьей.
     
     
    Добавлено:
    хотя, лучше не ставить каждый раз ls., а использовать With.
     
    Добавлено:
    RDVAS
    Нет. Только книги.

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

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

    Цитата:
    хотя, лучше не ставить каждый раз ls., а использовать With

    ок.
     
    Yuk
    вот The okk он написал, правильно!
     
    Добавлено:
    Еще есть один вопрос. Как можно преобразовать 6420/43 в 6420 и 43?

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    Идея там примерно такая:

    Код:
     
    Sub SplitNum(BaseNum As String) 'берем базовую строку
    Dim FirstNum As Integer, SecondNum As Integer 'ее будем разделять на 2 числа
     
    FirstNum = CInt(Left(BaseNum, InStr(1, BaseNum, "/") - 1)) 'первое число - это
    ' первые N-1 символов базовой строки, где N - номер символа "/" в базовой строке
     
    SecondNum = CInt(Right(BaseNum, Len(BaseNum) - InStr(1, _
    BaseNum, "/"))) 'второе число - это все, что после знака дроби.
     
    End Sub

     
    Добавлено:
    Блин, вот я ступил-то! В Listview поставил отображение List (список) и долго ломал голову, почему это у меня SubItems не отображаются .
    С добавлением элементов по одному вроде разобрался:
    Код:
     
    UserForm1.ListView1.ListItems.Add(1) = Cells (1,1)

    С добавлением данных в столбцы элемента - тоже:

    Код:
    UserForm1.ListView1.ListItems.Item(1).ListSubItems.Add(1, "b") = _
    Cells(1, 2) ' заполняет в первом элементе столбец с ключом b

    Включаем сетку:

    Код:
    UserForm1.ListView1.Gridlines = True

     
    Сейчас ищу, как сюда сразу несколько элементов добавить (участок таблицы например) и подсвечивать отдельные строки.
     
    Добавлено:
    И еще интересно, для чего нужен Tag в закладке с свойствами столбца?
     
    Добавлено:
    И как тут ширину столбцов подогнать так, чтобы граница последнего проходила ровно по границе объекта ListView.

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

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    The okk
    Куда вставлять? в модуле, да и не запускается макрос?
    Я так понял, в стольбце Н имеется 6420/43, надо разделять 6420 на столбце Н и 43 на столбце I. Правда, в строке много числовой записи надо разделять.

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Anton T
    в ТАКОМ виде - никуда. Смысла нет - даже если на вход ты что-то и дашь, процедура только изменит свои внутренние переменные. А вот если в этот код вставить доп. действия по размещению результата в ячейке или форме, тогда - другое дело.
    Ты скажи толком, откуда брать эту дробь и куда совать её компоненты. Тогда напишу частное решение.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
     
    Книга судя по всему отменная, но ссылки - мертвые.
    На Рапиде файл грохнули.
    2-я открывает архив .rar к скачиванию, но ничего не качается - Браузер выдает, что сервер недоступен.
    3-я (на зеркале) - выдает какую-то билиберду с просьбой регистрации, причем ни тени намека на нужный мне файл.

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 15:28 15-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mrdime
    _http://fileho.com/download/cf52fe879187/iea.zip.html

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите советом!
    1) Имеется лист, на котором значения в ячейках A1, A2, A3, A4 (связь с базой данных) увеличиваются, через каждые ~2 сек. Задача следующая: пользователь заносит в ячейку F1 какое-либо условие (выбор из списка), в этот момент значения из ячеек A1…A4, должны копироваться в ячейки B1…E1.
    Далее, через некоторое время, пользователь заносит в ячейку F2 какое-либо условие (выбор из списка), в этот момент в ячейки B2…E2 должны заносятся значения после вычисления B2=A1-B1, C2=A2-C1, D2=A3-D1, E2=A4-E1.  
    Затем, через некоторое время, пользователь заносит в ячейку F3 какое-либо условие (выбор из списка), в этот момент ячейки B3…E3 должны заносятся значения после вычисления  B3=A1-(B1+B2), C3=A2-(C1+C2), D3=A3-(D1+D2), E3=A4-(E1+E2).  
    Т.е. нужно получать разницу между значениями столбца A1….A4 и теми значениями, которые были получены ранее в строке B1…E1, B2…E2 и т.д.
    Заранее благодарен!
    2) Как можно обратится к базе Access с меньшими тормозами чем Web Service References… По этому методу слишком долго идет обсчет данных?

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 21:59 15-12-2006 | Исправлено: alin, 11:42 18-12-2006
    mrdime



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Yuk
     
    ОГРОМНОЕ СПАСИБО! Спасибо, что хватает времени и энтузиазма отвечать на все вопросы и всем помогать.
     

    Всего записей: 2975 | Зарегистр. 04-01-2005 | Отправлено: 16:44 16-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как сделать так чтобы при выделении любой из ячеек диапазона A1:L1 выделялся бы весь диапазон ячеек A1:L1 и т.д. A2:L2, A3:L3
     
    и как получить при этом значение A1, A2 , ...

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



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    aalleexxaa
     
    вроде бы, чтобы выделить весь столбец от A1:L1 до A65536:L65536 надо просто по заголовкуам выделять. Или тебя интересует код на vba???
    тогда что-то вроде  
     

    Код:
       ActiveSheet.Columns("A:L").Select  

    Всего записей: 324 | Зарегистр. 20-05-2005 | Отправлено: 15:24 17-12-2006
    aalleexxaa



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jONES1979
    не, если ты так сделаеш, то веделится весь диапазон от A1 до L ****
    а мне нужно чтоб только эта строчка выделялась.
    значения я уже получил

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



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

    Код:
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim RowCounter As Long
     
    For RowCounter = 1 To ActiveSheet.UsedRange.Rows.Count
    If Not Intersect(Target, Range(Cells(RowCounter, 1), Cells(RowCounter, 12))) _
    Is Nothing Then
        Application.EnableEvents = False
        Range(Cells(RowCounter, 1), Cells(RowCounter, 12)).Select
        Application.EnableEvents = True
    End If
    Next
     
    End Sub

    Пропиши эту обработку события в нужный лист и будет тебе счастье.
     
    Добавлено:
    aalleexxaa
    Кстати, а зачем это надо? - По опыту знаю, что можно почти всегда обойтись без выделения ячеек. Или это нужно исключительно для удобства пользователя?
     
    Добавлено:
    кстати, сразу предупреждаю - при таком обработчике события клик по строчке с номером более 10000 (если, конечно, в этой строке или после нее что-то есть) вызывает уже существенные тормоза от 0.5 до 4 секунд.

    Всего записей: 327 | Зарегистр. 16-11-2006 | Отправлено: 07:34 18-12-2006 | Исправлено: The okk, 07:51 18-12-2006
    Yuk



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    aalleexxaa
    Типа такого:
    Код:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column < 13 Then
        Application.EnableEvents = False
        Range(Cells(Target.Row, 1), Cells(Target.Row, 12)).Select
        Debug.Print Selection.Cells(1, 1).Value
        Application.EnableEvents = True
    End If
    End Sub

     
    The okk
    А цикл-то зачем? Вроде надо только выделять конкретный ряд, если я правильно понял.

    Всего записей: 1182 | Зарегистр. 02-07-2001 | Отправлено: 09:42 18-12-2006 | Исправлено: Yuk, 09:52 18-12-2006
    The okk



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

    Цитата:
    А цикл-то зачем?

    ну, чтобы при желании можно было сделать так:

    Код:
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim RowCounter As Long
    Dim SelectedRows As Long
    Application.EnableEvents = False
    For RowCounter = 1 To ActiveSheet.UsedRange.Rows.Count
    If Not Intersect(Target, Range(Cells(RowCounter, 1), Cells(RowCounter, 12))) _
    Is Nothing Then
        SelectedRows = SelectedRows + 1
    End If
    Next
    Range(Cells(Target.Row, 1), Cells(Target.Row + SelectedRows, 13)).Select
     
    Application.EnableEvents = True
    End Sub

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

    Код:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim RowCounter As Long
    Dim SelectedRows As Long
     
    If Target.Column < 13 Then
        Application.EnableEvents = False
        Range(Cells(Target.Row, 1), Cells(Target.Row + Target.Rows.Count - 1, 12)).Select
        Application.EnableEvents = True
    End If
     
    End Sub

     
    Добавлено:
    Значит, если нам не важны сами ячейки, цикл там, получается, и не нужен .
     
    Добавлено:
    Yuk
    Кстати, не смотрел ListView?
    Если я Checked с элемента убираю, это за событие ItemCheck считается? EnableEvents на него будет действовать?

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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("BD30:BG30").Select
        Selection.Copy
        Range("BD25:BG25").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        Range("BC25").Select
        Else
        ToggleButton3.Value = False
        Range("BD25:BH25").ClearContents
    End If
    End Sub
    Работает медленно, можно ли как-то ускорить процесс вычисления?

    Всего записей: 683 | Зарегистр. 05-08-2004 | Отправлено: 12:02 18-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