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

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

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SERGE_BLIZNUK
    Спасибо за ответ.Я так и думал)...
     
    Подскажите, что не так в этом макросе: Если использую функцию If - работает норамльно, а если - Select case - не хочет
    Мои примеры:
    1. С if(работает)
    If Not Intersect(Target, Range("D1")) Is Nothing Then
    Application.EnableEvents = False
    If ([D4] > 0) And ([D4] < 50) Then
    Select Case Range("D30").Value
    Case "слово"
    Sheets("1").Range("D10").Value = Sheets("1").Range("D10").Value + 1
    MsgBox (1)
    Sheets("2").Range("E10").Value = Sheets("2").Range("E10").Value + 1
    MsgBox (2)
    Case "слово2"
    Sheets("1").Range("D10").Value = Sheets("1").Range("D10").Value + 1
    MsgBox (3)
    Sheets("1").Range("F10").Value = Sheets("1").Range("F10").Value + 1
    MsgBox (4)
    End Select
    End If
    Application.EnableEvents = True
    End If
     
     
    С Selectcase(не работает):
     
    If Not Intersect(Target, Range("D1")) Is Nothing Then
    Application.EnableEvents = False
    Select Case Range("D30").Value
    Case  ([D4] > 0) And ([D4] < 50)
    Select Case Range("D30").Value
    Case "слово"
    Sheets("1").Range("D10").Value = Sheets("1").Range("D10").Value + 1
    MsgBox (1)
    Sheets("2").Range("E10").Value = Sheets("2").Range("E10").Value + 1
    MsgBox (2)
    Case "слово2"
    Sheets("1").Range("D10").Value = Sheets("1").Range("D10").Value + 1
    MsgBox (3)
    Sheets("1").Range("F10").Value = Sheets("1").Range("F10").Value + 1
    MsgBox (4)
    End Select
    End Select
    Application.EnableEvents = True
    End If
     
    Подскажите, как правильно записать с Selectcase.
     
    Добавлено:
    Еще маленький вопросик:
    Как правильно записать под это же условие:
    Если ([D4] > 50) And ([D4] < 90), выполнить "новое условие", а также выполнить предыдущее ([D4] > 0) And ([D4] < 50). И так по возрастающей.
     
    Конечно можно переписывать предыдущие условия, но это волокита, и не очень практично, если вариантов много. Думаю, есть более простое решение? Спасибо

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 15:22 25-09-2008
    Solenaja



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

    Цитата:
    вопрос по "коварной" задаче - нужно получить подобный список отдельно (если да - то где предпочтительнее)?
    это не принципиально, можно на новом листе
    рассказываю чуть более подробнее.
    после того как будут сформированные таким образом строки, файл сохраняется как csv или txt.
    далее с ним работает программа Folder Maker (http://www.skyjuicesoftware.com) чтобы создать папки и вложенные подпапки.
     
    вопрос.
    можно ли скриптом создать папки и вложенные папки на осноании этих кодов средствами Excel?
    Подробнее...

    ----------
    Могу помочь, но только своими знаниями и ...

    Всего записей: 4246 | Зарегистр. 02-09-2001 | Отправлено: 16:51 25-09-2008 | Исправлено: Solenaja, 16:54 25-09-2008
    Stupido



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
     
    натолкните на мысль требуется написать макрос, заменяющий текстовое значение ячейки на другое, выбирая соответствие из другого файла.
    в этом "другом" файле , табличка, где идёт четыре столбца с вариантами, а в пятом - текст, на который надо заменить, если в столбце встретится один из четырёх вариантов.
     
    как то сложно получилось с описанием буду признателен, за помощь!

    Всего записей: 935 | Зарегистр. 05-08-2008 | Отправлено: 17:11 25-09-2008 | Исправлено: Stupido, 17:23 25-09-2008
    q1wed



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

    Всего записей: 208 | Зарегистр. 02-03-2007 | Отправлено: 19:12 25-09-2008
    Pravoved90

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый вечер. Еще один скромный вопрос: Как сделать, чтобы в MsgBox отображались быквы? Цифры отображаються, а если напишу букву - MsgBox вылетает пустой..

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 19:25 25-09-2008
    dneprcomp



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

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 20:22 25-09-2008
    Pravoved90

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dneprcomp
    Спасибо. Ставил скобки)) Подскажите, кто знает ответ на мои вопросы немного выше))..

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 20:26 25-09-2008
    dneprcomp



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

    Код:
        Select Case Range("D30").Value  
            Case  ([D4] > 0) And ([D4] < 50)  
    Здесь как-то не так выглядит. В определении селекта используется 'Range("D30").Value', а в теле проверяется D4. Кроме того, Select просто проверяет на соответствие условию. Поэтому если одно из выражений Case верно, Case выполняется. IF проверяет все выражения в связке.
    Следующие Case-s сработают в обоих случаях.

    Код:
       X=5  
    Select Case X  
            Case  Is > 0, Is < 50
     
    Select Case X  
            Case  Is > 0, Is < 50, Is<4
     SELECT cледует рассматривать как IF с OR . И никогда с AND.  
     

    Всего записей: 3920 | Зарегистр. 31-03-2002 | Отправлено: 22:16 25-09-2008 | Исправлено: dneprcomp, 22:47 25-09-2008
    Pravoved90

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

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 23:52 25-09-2008
    Stupido



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

    Цитата:
    Добрый день!  
     
    натолкните на мысль  требуется написать макрос, заменяющий текстовое значение ячейки на другое, выбирая соответствие из другого файла.  
    в этом "другом" файле , табличка, где идёт четыре столбца с вариантами, а в пятом - текст, на который надо заменить, если в столбце встретится один из четырёх вариантов.  
     
    как то сложно получилось с описанием  буду признателен, за помощь!


    Всего записей: 935 | Зарегистр. 05-08-2008 | Отправлено: 10:07 26-09-2008
    ecolesnicov

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stupido
     
    Вопрос решаемый ...
    Если просто "натолкнуть на мысль" то вот:
     
    1) Создаем 2 массива на основе исходного интервала с текстовыми значениями через  

    Код:
     
    A=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец))
    B=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец))
     

    массив A будет исходным, массив B - результирующим
     
    2) Открываем "другой" файл:

    Код:
     
    Workbooks.Open ...  
     

     
    3) Берем интервал в "другом" файле в еще один массив:

    Код:
     
    С=Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец))
     

     
    4) Теперь надо перебор ... Можно делать это в лоб (полным перебором) можно более сложными алгоритмами (например, методом деления отрезка пополам, можно "поплавковым" способом). Пример полного перебора:

    Код:
     
    For r=1 to Ubound(A,1)
        ind=False
        For i=1 to Ubound(C,1)
            For j=1 to Ubound(C,2) -1
                If A(r,1)=C(i,j) then
                    B(r,1)=C(i,Ubound(C,2))
                    ind=True
                    Exit For
                end if
            next j
            If ind=True then Exit For
        next i
    next r
     

    В данном примере 3 вложенных цикла. Цикл по r перебирает строки в исходом массиве (A), Цикл по i перебирает строки в массиве  (C) из "другого" файла, Цикл по j перебирает столбцы в массиве (C) из "другого" файла (кроме последней, содержащей значение на замену). При нахождении 1-го совпадения (IF ...) следует запись в результирующий массив B (т.к. строки исходного и результирующего массива совпадают) и переход к новой строке в исходном массиве. Внимание: данный перебор ищет ЛЮБОЕ ПЕРВОЕ СОВПАДЕНИЕ СВЕРХУ для ЛЮБЫХ СТРОК (это может быть не всегда правильно).
     
    5) После обработки всех строк, "другой" файл можно закрыть ...

    Код:
     
    Workbooks(...).Close SaveChanges:=False
     

     
    6) Дальше сохраняем результирующий массив в исходный интервал на листе:

    Код:
     
    Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец))=B
     

     
    7) Очищаем память от всех массивов:

    Код:
     
    Erase A,B,C
     

     
    Вот и все ... Конечно все может быть совсем по другому ... Можно не использовать массивы, а оперировать прямо диапазонами ячеек на листе, можно применять другие методы перебора (правда большинство из них требуют дополнительной предварительной обработки - например сортировки), можно активно использовать объектные переменные, интервалы диапазонов можно вычислять динамически, а не указывать явно ... вообщем простор для творчества большой.  
    Использование массивов целесообразно т.к. обеспечивает более чем 10-кратный прирост скорости, в случаях когда количество строк в исходом и искомом интервалах исчисляется десятками тысяч ...
     
    Добавлено:
    Сорри, надо добавить ... сразу не подумал.
     
    В предложенном выше описании, в случае если ничего в "другом" файле не найдено - для таких строк остается тоже значение которое и было ... наверное это не совсем правильно ... соответственно перед тем как определять результирующий массив B, требуется очистить содержимое ячеек., т.е. ПОСЛЕ определения массива A и ПЕРЕД записью B=Range(Cells(... добавьте:

    Код:
     
    Range(Cells(1-ая строка, 1-ый столбец),Cells(послед. строка, послед. столбец)).ClearContents
     

     

    Всего записей: 251 | Зарегистр. 05-08-2005 | Отправлено: 10:37 26-09-2008
    Stupido



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ecolesnicov
     
    огромное спасибо, буду экспериментировать!
    а по поводу дополнения - то мне как раз и надо оставлять старое значение, если не найдено совпадение

    Всего записей: 935 | Зарегистр. 05-08-2008 | Отправлено: 11:22 26-09-2008
    Pravoved90

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день. Видел ответы, но не могу понять сам принцип записи. Обьясните, если не сложно - как заставить каждую копию ячейки становиться за последней ячейкой(столбиком) на примере. Спасибо.
     
    Добавлено:
    Кстати, к вопросу о отмене действий макроса - может есть какая-то функция\програмка по созданию противоположных макросов?(например: макрос А1 +1, превратить в А1 -1 )

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 13:21 26-09-2008
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pravoved90
     
    Слушай. Тебе уже столько тут писали: как копировать, как вставлять, как искать последний столбец(строку) с записью, как работать с изменениями ячеек и много, много еще разных примеров.
    И все давали с кодами-примерами.
    И каждый раз ты пишешь, что не понимаешь - напишите код.
    И вот опять:

    Цитата:
    как заставить каждую копию ячейки становиться за последней ячейкой(столбиком)

    Пора и самому что-то пытаться сделать. Посмотри предыдущие ответы для тебя - там все есть.

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 13:57 26-09-2008 | Исправлено: Oyger, 14:01 26-09-2008
    Stupido



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

    Цитата:
     
    For r=1 to Ubound(A,1)  
        ind=False  
        For i=1 to Ubound(C,1) '<====================== Type mismatch; Error (13)
            For j=1 to Ubound(C,2) -1  
                If A(r,1)=C(i,j) then  
                    B(r,1)=C(i,Ubound(C,2))  
                    ind=True  
                    Exit For  
                end if  
            next j  
            If ind=True then Exit For  
        next i  
    next r  

     
    cтранно, но в этой строчке вот такая ошибка выскакивает. Не могу понять - почему.

    Всего записей: 935 | Зарегистр. 05-08-2008 | Отправлено: 14:01 26-09-2008
    Pravoved90

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Oyger
    Но я же только учусь))...Я вобще 2 недели назад  ексель только для калькулятора открывал)). А спрашивал сам принцип, как раз, чтобы больше не обращаться за каждым примером..Но и на добром слове спасибо.

    Всего записей: 511 | Зарегистр. 08-02-2008 | Отправлено: 14:07 26-09-2008 | Исправлено: Pravoved90, 14:13 26-09-2008
    Oyger

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Pravoved90
     
    Мой тебе совет: не парся над тем, чтобы создать макрос, который будет делать резервную копию данных. А тем более отменить действие макроса. Проще напиши макрос который копирует твой файл.
     
    'Сначала подключи библиотеку "Microsoft Scripting Runtime" (В VB меню Tools -> References)
    Dim fs As New FileSystemObject
    fs.CopyFile "ХХХ", "УУУ" 'ХХХ - полный путь и имя файла, который копируешь. УУУ - полный путь и имя файла, который будет резервным.
     
    А копировать сами данный или писать модуль для отката макроса - бред... Хотя если у тебя много лишнего времени...

    Всего записей: 122 | Зарегистр. 22-03-2007 | Отправлено: 14:34 26-09-2008 | Исправлено: Oyger, 14:54 26-09-2008
    MaximuS G

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Stupido
    сделай пример и выложи ссылку, только с подробными комментариями...
    самому интересно
    Кстати может кто знает есть ли команда подобная SHELL только что бы не запускать приложения, а наоборот закрывать.. или может какой то другой вариант ? Спс

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 14:38 26-09-2008 | Исправлено: MaximuS G, 14:42 26-09-2008
    Stupido



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MaximuS G
     
    вот мой вариант на основе предложенного ecolesnicov
    , но я его ещё не довёл до ума, вылетает с ошибкой http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=8273&start=2500#16
     
    Подробнее...

    Всего записей: 935 | Зарегистр. 05-08-2008 | Отправлено: 16:19 26-09-2008 | Исправлено: Stupido, 16:28 26-09-2008
    MaximuS G

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

    Всего записей: 113 | Зарегистр. 15-08-2008 | Отправлено: 16:36 26-09-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