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

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



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    Не совсем то, потому что я не очень ясно объяснил.
    ------------
    Я могу сделать проверку
     
    если Check = True то запустить Процедуру_1
    если Check = False то запустить Процедуру_2.
     
    Sub Процедуру_1 ()
      ...
      If A > B Then
      ...
    End Sub
     
    Sub Процедуру_2 ()
      ...
      If A < B Then
      ...
    End Sub
     
    Но я хотел объединить эти две процедуры, т.к. они очень большие, а отличаются только знаками сравнения между A и B. Как это сделать?
     
     
    Добавлено:
    Есть решение !
     

    Цитата:
    передавай множитель m= 1 или -1, и используй одну проверку  
    m*A>m*B, тогда  
     
    1*A>1*B это A>B  
    -1*A>-1*B это A<B

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 16:00 21-01-2008
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    visual73
    А я что предложил? Немного длиннее, конечно, но всё же одной процедурой, хотя если условие проверяется много раз, то везде менять надо (или присвоить булевой переменной результат, который использовать где надо):  
    Код:
    If (A > B xor Check) AND not (A=B)  Then ...

    А вообще можно по модулю сравнивать, а знак отделить от числа при помощи функции SGN(), а где надо вернуть обратно.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 16:58 21-01-2008 | Исправлено: nick7inc, 17:00 21-01-2008
    vasiliy74



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

    Код:
    For Each cell1 In data
    data это range с двумя столбцами, можно ли добавить что то в конструкцию чтобы значения перебирались только из первого столбца?

    Всего записей: 289 | Зарегистр. 21-02-2006 | Отправлено: 17:03 21-01-2008
    visual73



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    Спасибо!
     
    Мне еще надо было такой вариант
     
    ...для check = true чтоб работало
    If A > B then...  
    а для check = false, чтоб работало
    If A => B then... ?
     
    Я сделал  ... if A> B or A=m*B then ...
     
    Вообще я думал есть какое-то решение позволяющее изменять сам код программы, типа превращающейся переменной ан-нет, не получается! а жаль
     

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 17:17 21-01-2008
    nick7inc



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

    Цитата:
    ...для check = true чтоб работало  
    If A > B then...  
    а для check = false, чтоб работало  
    If A => B then... ?


    Код:
    Dim check as boolean
    ...
    if  A>B OR (NOT(check) and A=B) then ...
     

    А вообще можно и самому догадаться, здесь нет ничего сложного. Практически всё можно решить при помощи IF AND OR XOR NOT.

    Цитата:
    Я сделал  ... if A> B or A=m*B then ...

    IMHO так менее понятно, что оно делает, в отличие от моего случая.

    Цитата:
     я думал есть какое-то решение позволяющее изменять сам код программы

    Может и есть, но я точно не знаю, поскольку штатных средств языка хватало всегда. Тута код добавляет свои строчки в проект VBA. Но, IMHO, менять код программы самой программой - это потенциальный источник ошибок.
     
    Добавлено:
    И ещё, в добавок. Логические операции можно использовать в виде обычных формул, а результат хранить в переменных типа Bool.
     
    Добавлено:
    Код попроавил, был с ошибкой.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 18:01 21-01-2008 | Исправлено: nick7inc, 18:08 21-01-2008
    yx0

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста скриптом или хотя б советом.  
    Проблема такая:
    В сетевой папке лежал файл со списком договоров, с гиперссылками на их отсканированные версии. В какой-то момент (непонятно отчего) все ссылки изменились  
    с ".\Имя_папки\имя файла" на c:\documents and setings\ temporary internet files...Имя_папки\имя файла.
     Как исправить все ссылки обратно? Их несколько тысяч, вручную, сами понимаете. Автозаменой не получилось, мож какой макрос или типа того?.\
     
    По сути операция несложная- в адресе каждой гиперссылки отрезать кусок определенного образца, но на VB только "hello, world!" писал Подскажите кто что сможет!
     
     
     
    h t t p ://rapidshare.com/files/79195661/______.xls
    Файл с примером. Первые три строчки- неправильные гиперссылки (на папку documents and settings) четвертая для примера- как должно быть. Т.е. файлы на которые ссылаешься лежат в папке с самим екселевским файлом но в подпапках.  

    Всего записей: 27 | Зарегистр. 13-11-2006 | Отправлено: 22:30 21-01-2008
    nick7inc



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

    Цитата:
    Помогите пожалуйста скриптом

    Пробуй
     
    Добавлено:
    Делайте бекап почаще, у меня с сетевой папкой много раз файлы гробились (в труху превращались).

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 00:55 22-01-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vasiliy74
    Если "data" - это имя диапазона (а если нет, то присвоить имя), то можно присвоить имя первому (или нужному) столбцу и перебирать элементы, принадлежащие пересечению этих диапазонов. Например:
     
    Columns(1).Name = "MyCol"
    Set x = Intersect(Range("data"), Range("MyCol"))
     
    For Each Cell In x
        ' Ваш код
    Next Cell

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 05:53 22-01-2008
    vasiliy74



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SAS888
    спасибо!
    помогите разобрать с XML Код
     
    Особенно интересует как работает:
     

    Код:
    Set nodeList = xmldoc.selectNodes("ValCurs")
    Set xmlNode = nodeList.Item(0).CloneNode(True)
    Set node_attr = xmlNode.Attributes(0)
    strDate = node_attr.Value

     
    Добавлено:
    как я понял ValCurs и Value - это имена закрывающих тегов

    Всего записей: 289 | Зарегистр. 21-02-2006 | Отправлено: 11:50 22-01-2008
    yx0

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    nick7inc
    Спасибо! Скрипт отлично сработал!  
    Тыщу раз спасибо!

    Всего записей: 27 | Зарегистр. 13-11-2006 | Отправлено: 21:26 22-01-2008
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yx0
    Ну и чудненько. Код для архива

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 13:19 23-01-2008 | Исправлено: nick7inc, 13:27 23-01-2008
    vasiliy74



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

    Код:
        Workbooks.Open Filename:= _
            "\\10.50.0.122\c$\Documents and Settings\noname\My Documents\E.xls"
        With Worksheets("Data")
            Set out_r = .Range("A1", .Range("IV1"))
        End With

     
    Можно ли не открывая файл присваивать диапазон? Если да то как должно выглядеть?

    Всего записей: 289 | Зарегистр. 21-02-2006 | Отправлено: 17:37 23-01-2008 | Исправлено: vasiliy74, 17:38 23-01-2008
    nick7inc



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

    Цитата:
    Можно ли не открывая файл присваивать диапазон?

    Думаю, что нет. При создании объекта типа Range надо указывать книгу и лист. Если указать несуществующие, то получим ошибку Out of range или Method 'Range' of object 'Global' failed. В вашем примере лист с именем Data будет искаться в текущей книге (в той, что макрос сделан).

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 01:09 24-01-2008
    sokol



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

    Всего записей: 607 | Зарегистр. 06-10-2003 | Отправлено: 09:32 24-01-2008
    ol7ca

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    http://slil.ru/25403715
     
    Добавлено:
    Подскажите, пожалуйста,  
    имею файл с кучей листов и на каждом листе таблицы (по 17 столбцов), в которых актуальные данные за 12 месяцев текущего года, мне нужно:
    1.    скопировать одну эту таблицу (можно выделить столбцы ) и вставить ее на этом же листе правее в определенное место (к примеру, первая ячейка оригинальной таблицы начинается в столбце B и скопировать надо в CA и еще в DA) таким образом получится 3 таблицы: актуальные данные, бюджет, прошлый год.
    2.    вставить в определенное место в начале листа 4 новые таблицы, где таб. №2 это копия первых трех столбцов из основной таблицы текущего листа с сохранением всех форматов. А таб. 1, 3, 4 должны принять формат той таблицы (на каждом листе своя таблица, они все по 17 столбцов, но строки и данные разные ), куда будут вставлены. При этом, таб. 1, 3, 4 имеют формулы, где вычисляются данные из трех основных таблиц: актуальные данные, бюджет, прошлый год.  Формулы должны стоять только в тех строках, где имеются числа в основных трех таблицах на той же строке.  
     
    Мне нужно это применить ко всем листам, в перспективе возможно увеличение (уменьшение) количества листов.
    Примеры таблиц в присоединенном файле.
     
    Буду благодарен за помощь в решении этой задачи.

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 23:30 26-01-2008
    nick7inc



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ol7ca
    Давайте по порядку.
    1) Вам надо единовременно для одного листа сделать операцию, или пройтись по всем листам книги?
    2) Копирование таблицы код
    3) Вставка столбцов между существующими код
     
    Добавлено:
    4) Если надо вставить только значения, то вместо r1.Copy r2 используем
    Код:
    r1.Copy
    r2.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False ' для копирования значений
    r2.PasteSpecial Paste:=xlFormulas, Operation:=xlNone, SkipBlanks:= _
            False, Transpose:=False ' для копирования формул

    5) Для добавления новых столбцов можно написать:
    Код:
     'куда вставлять и  сколько столбцов
    ' если один столбец
    set r2=ws.columns(2)  
    ' если несколько
    set r2=ws.range(ws.columns(2),ws.columns(2+i-1))
    ' i - количество столбцов для вставки
    Application.CutCopyMode = False '  чтобы случайно что-нибудь не скопировать,  
                                          ' если была ранее операция копирования
    r2.insert Shift:=xlToRight

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 21:11 27-01-2008 | Исправлено: nick7inc, 21:26 27-01-2008
    AndVGri

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

    Цитата:
    Если надо вставить только значения

    r2.Value = r1.Value - не проще?

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 01:15 28-01-2008
    ol7ca

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

    Цитата:
    Вам надо единовременно для одного листа сделать операцию, или пройтись по всем листам книги?  

     
    надо по всем листам книги
     

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 05:21 28-01-2008
    nick7inc



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

    Цитата:
    r2.Value = r1.Value - не проще?

    Возьму на заметку.
     
    Добавлено:
    ol7ca

    Цитата:
    надо по всем листам книги

    код

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 11:38 28-01-2008 | Исправлено: nick7inc, 11:44 28-01-2008
    visual73



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

    Код:
    Application.International(xlDecimalSeparator) и
    Application.DecimalSeparator

    Выдают разделитель приложения, а мне нужен именно системный.

    Всего записей: 962 | Зарегистр. 26-12-2005 | Отправлено: 12:15 28-01-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