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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)

Модерирует : ShIvADeSt

ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

ShIvADeSt



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

 
 
Обсуждаем вопросы только по Excel VBA
(программирование макросов, скриптов, пользовательских функций и т.п.).
Приветствуются ссылки на ресурсы и справочную литературу по теме.
 
Вопросы по работе с MS Excel, не относящиеся к программированию, задаем в теме Excel FAQ

 
Обратите внимание, этот топик для помощи в изучении и использовании VBA. Посему запросы типа "Напишите мне такой-то макрос, я VBA не знаю и знать не хочу" не приветствуются.
Древняя мудрость: "Накорми голодного рыбой и он погибнет, научи его ловить рыбу и ты спасешь его."(R)
 
Предыдущие ветки топика: Часть 1
 
Информация общего характера:
  • Список соответствия имен функций в английской и русской версиях Excel
  • Описание Microsoft Excel File Format (eng.)
     
    Рекомендации:
    Если у Вас есть проблема, не решаемая стандартными средствами 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.
  • Приемы, хитрости, трюки и нюансы работы в Microsoft Excel - сайт "Планета Excel", целиком посвященный Excel и всему, что с ним связано.
  • Microsoft Excel: Таблицы и VBA. Справочник. Вопросы и Ответы. Советы. Примеры.  
     
    Родственные топики:
  • Вопросы по работе с MS Excel - Excel FAQ - часть 1, часть 2, часть 3
  • Технические проблемы с MS Office 2003 или Office XP.
  • Word VBA все вопросы по Word VBA туда
  • Access все вопросы по программированию в Access туда
  • Книжульки по VBA - книги по программированию с использованием VBA
     
    Конкретные вопросы:
    Форма-заставка
    Как запустить макрос при изменении положения курсора или значения ячейки
  • Пример 1
  • Пример 2
  • Пример 3 (проверка области)
  • Пример 4
  • Пример 5
    Зацикливание в функции Change или SelectionChange
     
    Ранжирование без пробелов (макрос включает функции сортировки массива и удаления дубликатов, работает и в Excel 2007)
  • под Office 97
     
    Добавление в главное меню своего пункта, ассоциированного с макросом
    Создание ярлыка на рабочем столе
    Снятие защиты листа при забытом пароле
    Смена раскладки клавиатуры
    Скролл формы колесом прокрутки мыши
    Оптимизация кода по быстродействию использованием массивов
    Найти "чужое" окно и нажать в нем кнопку (вписать текст в текстовое поле)
    Работа с UNICODE-символами в VBA: запись, чтение из ячейки, перевод в ASС и обратно
    Как программно подключить дополнительные библиотеки (например, "Microsoft Scripting Runtime" или "Microsoft ActiveX Data Objects 2.8 Library) через References

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:58 23-04-2007 | Исправлено: JekG, 22:32 10-01-2010
    SAS888

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

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

    Копируем все данные из листа 1 в лист 2, затем удаляем ненужные строки.

    Код:
    Sub Main()
     
        Dim i As Long
        Sheets(2).Activate
        Cells.ClearContents: Sheets(1).Cells.Copy [A1]
        For i = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1
            If Cells(i, "A") = "" Then Rows(i).Delete
            If Left(Cells(i, "A"), 3) = "Бух" Then Rows(i).Delete
            If Left(Cells(i, "A"), 2) = "Не" Then Rows(i).Delete
        Next
     
    End Sub

    Или опять не то?

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 12:17 14-11-2008
    CEMEH



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос:
     
    Есть таблица из двух столбцов
    Необходимо заполнить combobox значениями из второго столбца в зависимости от первого
     
    for X=1 to 20
    if range("A" & X)="заполнить" then comobox1.заполнить.значением.из. range("B" & X)
    next X

    Всего записей: 237 | Зарегистр. 17-09-2006 | Отправлено: 10:55 15-11-2008
    Mont1

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

    Цитата:
    Есть таблица из двух столбцов  
    Необходимо заполнить combobox значениями из второго столбца в зависимости от первого  
     
    for X=1 to 20  
    if range("A" & X)="заполнить" then comobox1.заполнить.значением.из. range("B" & X)  
    next X  

     
    Попробуй
     
    for X=1 to 20  
    if Cells(X , 1)="заполнить" then ComboBox1.AddItem (Cells(X , 2))  
    next X

    Всего записей: 49 | Зарегистр. 15-10-2008 | Отправлено: 09:04 18-11-2008
    AizecVHA

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здраствуйте.
    Подскажите как можно определить, что пользователь выбрал текстовый файл?
    Вот примерный код.
     
    Sub Merging()
     
       file1 = Application.GetOpenFilename("Text Files (*.txt), *.txt, Excel Files (*.xls), *.xls", 2)
      'выбор файла
     
       If file1 (*.txt) = True Then
                'действие1
       Else: 'действие2
       End If
     
    End Sub

    Всего записей: 5 | Зарегистр. 18-11-2008 | Отправлено: 14:03 18-11-2008
    StdNet

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени!
    подскажите что за такие ячейки в формуле  
     
    FormulaR1C1 = _
            "=(RC[7]-RC[5])/RC[-2]"
     
    RC[7]-RC[5] это я так понял номер столбца
    а вот что такое RC[-2] как узнать на какую ячейку ссылка идет?
     
    разобрался, RC[-2] это ячейка на два столбца влево от текущей ячейки..  
     
    2 AizecVHA
    ну как самый простой вариант взять последних 3 символа с имени файла и сравнить их с нужным тебе расширением.
     
    типа if right(file1.filename, 3) = "txt"  
    это для примера, синтаксис скорее всего неравильный, я Вб крайне редко юзаю..

    Всего записей: 70 | Зарегистр. 03-08-2006 | Отправлено: 15:45 18-11-2008 | Исправлено: StdNet, 19:51 18-11-2008
    AizecVHA

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

    Цитата:
    ну как самый простой вариант взять последних 3 символа с имени файла и сравнить их с нужным тебе расширением.  
     
    типа if right(file1.filename, 3) = "txt"  
    это для примера, синтаксис скорее всего неравильный, я Вб крайне редко юзаю..

     
    А вот меня конкретно синтаксис интересует, ибо идей у меня и так хватает.

    Всего записей: 5 | Зарегистр. 18-11-2008 | Отправлено: 23:17 18-11-2008
    Mont1

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AizecVHA
     
    Попробуй
       If Right(file1, 3) = "txt" Then

    Всего записей: 49 | Зарегистр. 15-10-2008 | Отправлено: 03:47 19-11-2008
    AizecVHA

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mont1
    Да работает, спасибо.

    Всего записей: 5 | Зарегистр. 18-11-2008 | Отправлено: 13:26 19-11-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!
    Подскажите, а можно задать время на выполнение операции?
    Например, хочу чтоб выделение ячеек происходило с интервалом 1 сек...
    Если просто написать макрос, так он выделит диапазон в 1000 ячее и больше за сек...  
    СПС

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 13:50 20-11-2008
    q1wed



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaximuS G тебе нужно воспользоваться функцией Timer
     
    вот пример макроса, в котором ячейка окрашивается в красное на 0.3 сек, а потом цвет ячейки опять становится по умолчанию.

    Код:
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    t = Timer
    Selection.Interior.ColorIndex = 3
    addr = Selection.Address
    Do
    DoEvents
    Loop Until Timer - t >= 0.3
    Range(addr).Interior.ColorIndex = xlNone
    End Sub


    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 11:36 23-11-2008 | Исправлено: q1wed, 08:30 24-11-2008
    AizecVHA

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток всем присутствующим.
    Кто-нибудь может помочь с такой проблемкой:
    Есть две книги file1 и file2, каждая с двумя столбцами, первый из которых это идентификатор, второй - значения; вобщем надо значения из первой книги переместить во вторую (при совпадении ячеек из первого столбца). Я использовал следующий макрос, но работает он крайне медлено при большом количестве строк(понятно, при прямом переборе то). Вообщем, как можно более эффективно и быстрее это сделать?

    Код:
     While Workbooks(file2).Worksheets("List").Cells(i, 1).Value <> ""
              current = Workbooks(file2).Worksheets("List").Cells(i, 1).Value
              j = 1
              flag = False
              Do While Workbooks(file1).Worksheets("List").Cells(j, 1).Value <> ""
                       If Workbooks(file1).Worksheets("List").Cells(j, 1).Value = current Then
                          flag = True
                          Exit Do
                       End If
                       j = j + 1
               Loop
              If flag = True Then
                 Workbooks(file2).Worksheets("List").Cells(i, 2).Value = Workbooks(file1).Worksheets("List").Cells(j, 2).Value
                 Workbooks(file2).Worksheets("List").Cells(i, 2).Interior.Color = RGB(0, 255, 0)              
              End If
              i = i + 1          
        Wend
     

     

    Цитата:
    Подскажите, а можно задать время на выполнение операции?  
    Например, хочу чтоб выделение ячеек происходило с интервалом 1 сек...  
    Если просто написать макрос, так он выделит диапазон в 1000 ячее и больше за сек...  

    Наверное можно просто приостанавливать выполнения скрипта на определенный промежуток времени.
    Т.е. вставить в тело макроса команду.
     
        Application.Wait Time:=Now + TimeValue("0:00:1")  
     
     
       

    Всего записей: 5 | Зарегистр. 18-11-2008 | Отправлено: 15:07 23-11-2008 | Исправлено: AizecVHA, 15:19 23-11-2008
    q1wed



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AizecVHA
    Цитата:
    как можно более эффективно и быстрее это сделать?

     
    1. отключить обновление экрана на момент сравнения (может быть еще поможет отключение автопересчета, хотя с др стороны формулы вроде не используются)
     
    2. отвязаться от ячеек: то есть данные с обоих книг помещаем в массив, сравниваем - результат помещаем в третий массив и после всех вычислений результат сравнения выгружаем на лист.
     
    При использовании обоих пунктов скорость должна увеличиться раз в 20-50. Такое уже вот на этой странице рассматривали. И еще в шапке о быстродействии написано.

    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 18:18 23-11-2008 | Исправлено: q1wed, 20:17 23-11-2008
    VARVARRRRR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    народ помогите , а то моему мозгу будит капец
    есть кселевский файл в нем есть столбец с номерами (id файлов) я создал в файл экселевский и там сделал 3 слобика
    1 столбик это пусть до файла
    2 столбик я копирую номера и 1 листа прямо столбиков все это ручками
    3 столбик расширение файла тоесть в моем случае .avi
    так вот мне хотябы накиньте макрос что бы он когда все это сделано объединял все строки во втором файле например в книгу 2 строк примерно 500
    делаю функцией сцепить но она тока на одну строку

    Всего записей: 4 | Зарегистр. 24-11-2008 | Отправлено: 15:55 24-11-2008
    q1wed



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    скажу честно: херово понял че те надо, вот попробуй быть может это то что тебе требуется:

    Код:
    Sub Skleyka()
    Application.ScreenUpdating = False  
    Application.Calculation = xlCalculationManual
    Dim i As Integer, t As String
     
    t = Cells(11, 1).Value
    For i = 12 To 180
    t = t & Chr(10) & Cells(i, 1).Value
    Next
    Range("A1").Value = t
     
    Application.Calculation = xlCalculationAutomatic  
    Application.ScreenUpdating = True  
    End Sub

     
    этот макрос делает склейку строк в столбце А с 11 по 180 строку, результат выводит в А1. Разделитель - перевод каретки.

    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 16:02 24-11-2008 | Исправлено: q1wed, 16:04 24-11-2008
    VARVARRRRR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    мне нужно склеить не строки а столбци извините если не так написал
    и эту склейку перенести на новую вкладку например вкладку2
    вот так вот получается в экселе и что бы не было пробелов при выгрузке в тексовый файл нужна склейка желательно в новой вкладке
     
    wait operator 0        
    movie 0:00:07.00 [0.10] C:\рекламма\    219451    .avi
    movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi        
            
    wait operator 0        
    movie 0:00:07.00 [0.10] C:\рекламма\    219451    .avi
    movie 0:00:07.00 [0.10] C:\рекламма\    700078576    .avi
    movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi        
            
    wait operator 0        
    movie 0:00:07.00 [0.10] C:\рекламма\    219451    .avi
    movie 0:00:07.00 [0.10] C:\рекламма\    700078576    .avi
    movie 0:00:07.00 [0.10] C:\рекламма\    700078718    .avi
    movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi        

    Всего записей: 4 | Зарегистр. 24-11-2008 | Отправлено: 16:25 24-11-2008 | Исправлено: VARVARRRRR, 16:30 24-11-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    q1wed
    AizecVHA
    Спасибо, большое! Приятно, когда есть у кого спросить

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 17:15 24-11-2008 | Исправлено: MaximuS G, 18:42 24-11-2008
    q1wed



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VARVARRRRR
    непонятно тогда почему функцией сцепить не получается?
    твоя формула (даже VBA не потребуется) будет примерно такой:  
    Если на Листе1 в столбца A, B и С тектс который необходимо склеить
    то формула на Листе2 будет иметь следующий вид: =СЦЕПИТЬ(Лист1!A1;Лист1!B1;Лист1!C1) После вставки в одну из ячеек необходимо будет её "растянуть" вниз согласно количеству строк на первом листе.
     
    С лишними пробелами придется повозиться (к тому же они какие то не стандартные пробелы), но тоже решаемо.

    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 06:42 25-11-2008
    VARVARRRRR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    как раз что так сделать ээтой фукцией это можно я понял но вот как растянуть не очень понимаю, а делать по отдельности в каждую строку напряжна
     
    Добавлено:
    все понял пасиба
    народ а подскажите ешо еси вас сильно не напрегет ето.
    есть вот такое
    Дом.ру                                        15            700068329
    Цирк причуда клоуна        10    700072167
    БЗ кабельное ТВ 2х2    1 бартер                     30    219451
     
    нада что бы он брал тока id ну последни цифры так сказать номера блоков у них отдельный столбец вставлял в другой лист и потом чтобы делал вот так
     
     
     
     
    Добавлено:
    все понял пасиба
    народ а подскажите ешо еси вас сильно не напрегет ето.
    есть вот такое
    Дом.ру                                                            15    700068329
    Цирк причуда клоуна                                     10    700072167
    БЗ кабельное ТВ 2х2    1 бартер                     30    219451
     
    нада что бы он брал тока id ну последни цифры так сказать номера блоков у них отдельный столбец вставлял в другой лист и потом чтобы делал вот так
     
    wait operator 0        
    movie 0:00:07.00 [0.10] C:\рекламма\    219451    .avi
    movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi        
            
    wait operator 0        
    movie 0:00:07.00 [0.10] C:\рекламма\    219451    .avi
    movie 0:00:07.00 [0.10] C:\рекламма\    700078576    .avi
    movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi        
     
    тоесть перед блоко так сказать ставил wait operator 0 после блока ставил movie 0:01:12.59 [0.10] C:\рекламма\tv3.avi а перед id ставил movie 0:00:07.00 [0.10] C:\рекламма\
    тоесть что бы например все это было в столбце A ID в столбце B и надпись .AVi в столбце C
    ну если конечно так проще

    Всего записей: 4 | Зарегистр. 24-11-2008 | Отправлено: 08:00 25-11-2008 | Исправлено: VARVARRRRR, 09:08 25-11-2008
    q1wed



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    VARVARRRRR
    Цитата:
    нада что бы он брал тока id ну последни цифры
    для частного случая подойдет =ПРАВСИМВ(A1;13) где 13 количество символов которые нужно отсчитать справа и вывести отдельно в ячейку. Затем дополнительно надо будет очистить получившуюся строку от лишних пробелов. Это подойдет в том случае если при взятии 13 знаков справа мы всегда будем "захватывать" весь ИД полностью и не "захватим" случайно текст слева.
     
     
     
     
    для того чтобы прочитать мое сообщение полностью нажми на моем сообщении редактировать

    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 15:39 25-11-2008
    VARVARRRRR

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    плаваем не мелко тут все пучком просто прогроамма выгружает в экселе а мне нада делать плей лист под выдачу вот и думал замутить что попроще что бы не напрягать отдел програмирования при чем у нас ешо и филиал голова в другом городе...)))
    ну все равно пасиб тебе за помощ даж не за помощ а вообще что откликнулись а то у меня уже вообще разочарование в форумах появилось...

    Всего записей: 4 | Зарегистр. 24-11-2008 | Отправлено: 16:37 25-11-2008
       

    Страницы: 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Excel VBA (часть 2)
    ShIvADeSt (11-01-2010 10:17): http://forum.ru-board.com/topic.cgi?forum=33&topic=10903


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru