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

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

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

    Цитата:
    Цитата:В Вашем файле-примере переход по найденной ссылке будет осуществляться безошибочно, если из всех имен листов исключить пробелы. Например, лист с именем "SI X" переименовать в "SI_X"  и т.д.  
     
    а с пробелами никак не будет работать?  

    я нашел ответ на свой вопрос - добавил кавычки и заработало с пробелами :  
    A(UBound(A)) = "'" & Sheets(i).Name & "'" & Chr(33) & myCell.Address

    Всего записей: 125 | Зарегистр. 01-02-2007 | Отправлено: 19:53 14-04-2008
    ssa9999

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Когда открываем эксельный файл Excel'ом, из программы Парус Своды ЦП,
    то не дает создать новую книгу в этом Excel'е ни из интерфейса, ни из кода (код в этом эксельном файле и размещается). То есть например код
    Workbooks.Add
    вызывает ошибку:
    Ошибка 1004 метод Add failed (или как-то так примерно, нету этих Сводов у меня сейчас).
     
    Преполагаю, что программа Своды как-то пинает Excel так что создание новой книги запрещается. Но не могу найти в справке по Excel VBA ничего такого, чтобы можно было запретить создать книгу, или чего-нибудь, что может помешать создать новую книгу. Что за навороты? мне надо пнуть его в обратном направлении, чтобы дало создать новую книгу из кода

    Всего записей: 130 | Зарегистр. 06-01-2005 | Отправлено: 09:40 15-04-2008
    nick7inc



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

    Цитата:
    ну неужели не кто не сталкивался с внесением в строку с помощью макроса длинной формулы???

    У меня были проблемы, но только с чтением длинной формулы из серии диаграмы. VBA тупо выкидывает "лишнее". Как бороться с этим пока не придумал.

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



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Прошу гуру помочь. Посоветовали обратиться сюда. Задача такая:
     
    Случай А. Есть массив 1 (квадратная матрица, например из 6 строк/столбцов). Необходимо из этого массива сформировать новый (массив 2) путем исключения определенной строки и столбца (допустим строки/столбца 4), а затем посчитать определитель нового массива
     
    Случай Б. Есть массив 1 (квадратная матрица, например из 6 строк/столбцов). Необходимо из этого массива сформировать новый (массив 2) путем исключения определенных строк и столбцов (допустим строки/столбца 1 и 4), а затем посчитать определитель нового массива
     
    Случай В. Исключается 3 строки/столбца
     
    Как это сделать в автоматическом режиме, чтобы вводя номера столбцов/строк, которые надо исключить - массив формировался сам?
     
    Вот превьюшка:

    А вот тут файлик
    http://rapidshare.com/files/107180148/Massiv.xls.html
    или тут
    http://www.rapidshare.ru/647583

    Всего записей: 495 | Зарегистр. 02-11-2002 | Отправлено: 17:07 15-04-2008
    Troitsky



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

    Цитата:
    вроде уже писал про проблему но так и не нашёл пути её решения, есть необходимость вводить формулу она работает. Но если я пытаюсь записать макрос по её внесению выходит сообщение о том что макрос не записан, попытался поставить в код макроса в ручную. Выдаёт ошибку, как быть?  

    Цитата:
    ну неужели не кто не сталкивался с внесением в строку с помощью макроса длинной формулы???

    Излагай мысли четко. В чем проблема? Проблема с записью макроса или с программным внесением формулы в ячейку? Если первое, то вопрос для Excel FAQ. Если второе - неплохо бы процитировать сообщение об ошибке и привести фрагмент кода.
    Уважайте время тех, кому кроме решения ваших проблем приходится гадать даже о том, что вы вообще хотите сказать.


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

    Всего записей: 795 | Зарегистр. 13-12-2003 | Отправлено: 21:45 15-04-2008
    nick7inc



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

    Цитата:
    В чем проблема?

    Я думаю, что здесь банальное переполнение. Скажем этот пример на Excel 2000 показывает неправильный результат при вызове длинной формулы, третий параметр оказывается пустым.

    Всего записей: 1138 | Зарегистр. 04-05-2007 | Отправлено: 23:32 15-04-2008 | Исправлено: nick7inc, 23:13 16-04-2008
    megaxep



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

    Всего записей: 350 | Зарегистр. 10-10-2002 | Отправлено: 12:52 16-04-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    megaxep
    Есть способ, как отловить события удаления и вставки строк с помощью перехвата ID команд (в стандартном наборе Excel обработки таких событий нет). Если устроит - могу предложить.

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 14:28 16-04-2008 | Исправлено: SAS888, 14:31 16-04-2008
    ssa9999

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вот, точно - события на эту тему нет. В Майкрософте забыли.
    Перехват команд, посредством самого Excel VBA? вот это круто. Как это?

    Всего записей: 130 | Зарегистр. 06-01-2005 | Отправлено: 17:05 16-04-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    megaxep
    ssa9999
    Посмотрите Здесь.
    В предложенном файле 2 листа и 2 макроса. После запуска макроса "Beginning", произойдет перехват нужных ID команд и при удалении (вставке) строк (столбцов) на листе 1, тоже самое будет происходить и на листе 2 (и наоборот). Запуск макроса "Ending" - возвращает обычную работу.
    Обратите ВНИМАНИЕ, что при закрытии файла, обработка этих событий в Excel останется  такой, какая была к моменту закрытия. Можно, чтобы не забывать возвращать нормальную работу Excel, по событию "BeforeClose" выполнять макрос "Ending".

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 06:51 17-04-2008
    ssa9999

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вот это пилота-аж
    то есть подменяем назначения команд меню
    мегареспект.
     
    Может быть, Вам известно что-либо по проблеме выше:
    http://forum.ru-board.com/topic.cgi?forum=33&topic=8273&start=1880#3
     
    не выполняются, с описанной там картиной, методы Workbooks.Add, Workbooks.Open, Application.DisplayAlerts, и наверно еще другие тоже. Как-то зарублено. Как бы открыть?

    Всего записей: 130 | Зарегистр. 06-01-2005 | Отправлено: 09:59 17-04-2008
    dmention

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может не совсем про VBA, а может и на нем, но не хотелось бы усложнять... тем не менее вопрос такой:
     
    Существует ли формула в Excel для выполнеия следующей функции?
     
    Есть 2 столбца A и B. Нужно найти сумму построчных произведений значений столбца A на соответствующие им столбца B.
     
    Можно конечно создать столбец C где вычислить произведения A * B, а потом суммировать их функцией Сумм или задать формулу = A1*B1 + A2*B2 + A3*B3..., но если строк 700 и более, а пар столбцов несколько десятков, то это затруднительно, и таблица неоправданно расширяется и Excel такую формулу может не дать забить.
     
    Думаю не я первый задался этим вопросом. Подскажите, пожалуйста, как выполнить данное вычисление? Может у кого сеть написанная для Excel такая функция?
     
    Итоговая задача: вычисление средневзвешанного значения, т.е. если A это количество, а B цена, то вычислить надо:
     
    = (A1*B1 + A2*B2 + A3*B3)/СУММ(A1:A3)
     
    Спасибо!
     
    __________________________
     
    Все, нашел, функция называется СУММПРОИЗВ()

    Всего записей: 206 | Зарегистр. 09-07-2005 | Отправлено: 10:30 17-04-2008 | Исправлено: dmention, 13:29 17-04-2008
    SAS888

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ssa9999
    Т.к. Вы открываете одно приложение из другого, то проверьте, что в момент выполнения макроса Excel активно именно это приложение. Переключение активного приложения выполняется командой "AppActivate" (см. help по VBA).

    Всего записей: 398 | Зарегистр. 31-10-2007 | Отправлено: 10:52 17-04-2008 | Исправлено: SAS888, 10:54 17-04-2008
    AndVGri

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    dmention
    =СУММПРОИЗВ(A1:A4,B1:B4)

    Всего записей: 750 | Зарегистр. 14-12-2005 | Отправлено: 01:08 18-04-2008
    gvserg1

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый день!
     
    Столкнулся с такой вот проблемой: выделяю вручную массив (произволный). Нужно чтобы в каждой ячейке этого массива прописывалась формула ROUND, независимо от того значения там или формулы.
    Вот попробовал сделать,. но так как с макросами особо не знаком, немного не вышло, никак не могу определить длину строки для формул. С обычными значениями все вышло нормально.  
    ______________________________________________
    наконец то разобрался в чем была ошибка.
    Если кто то подскажет можно ли это дело сделать проще - буду благодарен!
    ________________________________________________
    Теперь вопрос следующего характера:
    для макросов создал свою менюшку и назначил "горячие" клавиши которые работают в сочетании с Alt. Но в моем случае когда я нажимаю Alt+R менюшка только подсвечивается но не выпадает, не так как стандартные менюшки. Тоесть я не могу далее вызывать подменю просто нажав горячую клавишу подменю, тоесть вызвать подменю нажав комбинацию Alt+R -> R. Для этого мне нужно нажимать Alt+R -> Enter -> R.  
    Это можно как то исправить?  
    http://slil.ru/25704499
     
    Спасибо

    Всего записей: 23 | Зарегистр. 30-01-2008 | Отправлено: 12:24 18-04-2008 | Исправлено: gvserg1, 20:52 18-04-2008
    ssa9999

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скорее всего глюк Excel, и не лечится.
    Следует добавить свою команду в одно из стандартных меню

    Всего записей: 130 | Зарегистр. 06-01-2005 | Отправлено: 13:04 19-04-2008
    shadur



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемые знатоки Excel VBA-а понимаю что обращаюсь к Вам с обременительной просьбой, но своими силами я с этой проблемой справиться не могу, а потому надеюсь на Ваше участие.  
    Прежде всего необходимы 2 макроса: 1- когда значение ячейки не равно 0, тогда должна добавляться строка, содержащая форматы и формулы из прежыдущей строки;  2- всякий раз при открытии книги необходимо, чтобы добавлялся лист с незаполненной формой.  
    Что касается формулы, то она, безусловно, также нуждается в улучшении.  
    Очень надеюсь на Вашу помощь и заранее Всем благодарен.  
     
    Файлик здесь http://slil.ru/25702016

    Всего записей: 27 | Зарегистр. 14-03-2008 | Отправлено: 14:21 21-04-2008 | Исправлено: shadur, 14:40 21-04-2008
    Vitus_Bering



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

    Всего записей: 936 | Зарегистр. 30-09-2005 | Отправлено: 17:31 21-04-2008
    shadur



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vitus_Bering
    Витус - то что надо. Благодарен Вам всей душой. Если можно, с Вашего позволения, поинтересуюсь нюансами. Поскольку Ваше детище сразу не стало понятным фруктом, ибо чувствуется в нем рука большого мастера, то позвольте  задать Вам несколько уточняющих вопросов?

    Всего записей: 27 | Зарегистр. 14-03-2008 | Отправлено: 20:22 21-04-2008
    CEMEH



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vasiliy74
    Я не сильно силен в ВБА но попробую помочь
     
    Итак, если нам надо просто вставить функцию, то мы можем включить запись макроса, набрать формулу ручками и посмотреть, что получится. Потом отредактировать в ручную.
     
    Можно по другому:
    Имеем формулу:
    прим (она вписана в ячейку A1)
     
    =ЕСЛИ((I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT))=0;0;((J72-I72)+(СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AF:$AF)+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AV:$AV))/$E$4-I73)/(I72+СУММЕСЛИ(Transactions_TransactionsB!$F:$F;B72;Transactions_TransactionsB!$AT:$AT)/$E$4))
     
    на ВБА будет так:
    If range("I72")+ Application.WorksheetFunction.SumIf(range(Transactions_TransactionsB!F:F),B72,range(Transactions_TransactionsB!AT:AT)=0 then  
    range("A1")=0' то есть если условие выполняется, ставим 0 в ячейку А1
    else' если условие не выполняется то...
    range("A1")=range("J72")+range("I72")+(Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"), range("B72"), range("Transactions_TransactionsB!AF:AF"))+Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"),range("B72"),range("Transactions_TransactionsB!AV:AV"))/range("E4")-173)/(range("I72")+Application.WorksheetFunction.SumIf(range("Transactions_TransactionsB!F:F"),range("B72"),range("Transactions_TransactionsB!AT:AT))/range("E4"))
    end if
     
    Код не проверял. Может какую кавычку или скобку не поставил. Вполне возможно кто-то предложит более простое решение. Повторюсь, я не силен в ВБА
     
     
     
    Добавлено:
    ВОПРОС
     
    Возможно ли заставить ВБА залесть в интернет, открыть веб-страничку, выделить на ней все, скопировать, вставить на лист1 (использовать формат конечных ячеек)
     
    Особенно интересен вариант, когда вход на страничку закрыт логин/паролем. (известным логин/паролем)

    Всего записей: 237 | Зарегистр. 17-09-2006 | Отправлено: 21:55 21-04-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