и ряд других, отвечающих за редактирование содержимого и форматирование ячеек, НЕ действуют на ячейки, скрытые фильтром, если таковые попадаются в обрабатываемом диапазоне.
С одной стороны всё в полном соответствии с работой с отфильтрованным листом «вручную» (при нажатии, к примеру, Del очищаются только видимые ячейки, а скрытые фильтром игнорируются). Но при работе из-под VBA такое поведение выглядит неочевидным или даже нелогичным. Ведь обращение идёт к Range целиком, а не к Range.SpecialCells(xlCellTypeVisible), т.е. нигде не указано, что обрабатываемая область должна чем-то ограничиваться. По крайней мере для меня эта особенность стала неприятной неожиданностью и привела к ошибке в программе, теперь придётся иметь её в виду при разработке.
Что делать, если всё же нужно работать с целым диапазоном, а не только с видимой его частью:
Снимать фильтры, сохраняя предварительно критерии фильтрации в отдельном массиве/структуре, обрабатывать диапазон и ставить фильтры обратно.
Сейчас тоже заинтересовался этой темой. Поэкспериментировал с установкой разных значений свойства Instancing и смотрел, что получается в cls-файле. В общем, параметр MultiUse к этому свойству отношения не имеет, он всегда одинаковый (True). Если его менять на False вручную то ничего не изменится, он просто автоматом встанет обратно на True.
А вот за свойство Instancing отвечает комбинация атрибутов:
Да, так будет работать. Ну вернее сам не пробовал, но уверен, что будет))
Но тут возникает другой вопрос - а что если данных в этих ячейках нет, а форматирование (ну или границы) нужно убрать? Тогда они не попадут под отбор SpecialCells(xlCellTypeConstants) и останутся не очищенными.
Вот... пока никаких разумных решений, кроме тупого перебора циклом, в голову не приходит...
Jack Famous написал: вместо .ClearContents попробуйте .Borders.LineStyle = False
Я же писал - не работает для скрытых))
Цитата
AShatov написал: Задача - очистить ячейки и границы в заданном диапазоне, делаю соответственно через Range.ClearContents и Range.Borders. Вопрос в том, что если на листе установлен автофильтр, то эти методы не срабатывают для скрытых строк
Столкнулся с неожиданной проблемой (раньше как-то не замечал)...
Задача - очистить ячейки и границы в заданном диапазоне, делаю соответственно через Range.ClearContents и Range.Borders. Вопрос в том, что если на листе установлен автофильтр, то эти методы не срабатывают для скрытых строк, Для скрытых вручную срабатывают, а для скрытых фильтром нет.
Есть ли какие-то красивые решения этой проблемы, кроме перебора? Снятие фильтров и отображение строк, само собой, не рассматривается.
Дмитрий Тарковский, спасибо, но немного не то. Я говорил не о ComboBox, с ним всё понятно, а об объекте Range.Validation, т.е. о выпадающем списке внутри ячейки.
Юрий М, спасибо. Т.е. получается, что я обязательно должен использовать ссылку на реальный диапазон на дополнительном листе? Не очень удобно, учитывая, что в моём случае нужно сделать много таких списков, и все разные и динамические... Хотя с другой стороны действительно отпадают все ограничения, и с сохранением файла проблем не будет.
Тогда задам ещё глупый вопрос А можно именованные диапазоны делать виртуальными, чтобы не плодить лишние листы. Например, в виде висящей в памяти переменной.
Кто-нибудь знает, как правильно задать список для свойства Formula1 например через Join(Array, ","), если в элементах массива встречаются запятые: типа "Москва, ул. такая-то" или дробные числа с той же запятой? В этом случае запятые воспринимаются как лишние разделители. Как их можно экранировать?
Если проводить аналогию с Object Browser'ом в Visual Studio, то там приватные переменные/функции не видны (точнее, есть опция, показывать их или нет). ИМХО так удобнее и полезнее для самоконтроля, чем видеть всё подряд. Поэтому и решил, что в VBA тоже должна быть подобная функция.
Только что столкнулся с проблемой, раньше как-то не обращал внимания: все внутренние переменные класса оказываются видны в Object Browser. При написании класса переменные, как и положено, объявляются Private, но при этом всё равно отображаются там, где их быть не должно.
Это какой-то косяк у меня на компе, или в VBA где-то есть настройки отображения?
ikki написал: даже отличным профессионалам и прочим гуру - в ряде случаев может понадобиться погуглить, поэкспериментировать, проверить...
Согласен. Я и не претендую на абсолютную точность и мгновенный ответ. Но человек, обладающий опытом, сможет это сделать быстрее, чем я, а в каких-то вопросах вообще обойдётся без гугла.
Вроде не очень в тему, но больше негде, поэтому пишу здесь. Никакой конкретной задачи нет, просто ищу консультанта по вопросам программирования на VBA для решения текущих вопросов.
Условия такие: Пишу макросы на работе по мере необходимости, материалом владею достаточно хорошо, т.е. не новичок, но иногда возникают такие вопросы, на которые сам ответить не могу - не хватает знаний или опыта. Поиск в инете занимает очень много времени, а спамить тут на форуме одноразовые и довольно сложные вопросы не хочется. Хочу, чтобы была возможность задавать такие вопросы опытному человеку в режиме онлайн. Понятно, что уровень преподавателя должен быть соответствующим Если кому-то интересно, пишите здесь или в личку, желательно с бюджетом, т.к. я вообще не представляю, сколько это может стоить))
The_Prist, спасибо, то что нужно. Резюме по теме: выделенные диапазоны на неактивных листах имеют место быть. По крайней мере это понятие не лишено смысла: всё-таки когда мы переходим с одного листа на другой, выделение не сбрасывается, а значит оно где-то сохраняется, и его можно тем или иным способом достать. Но получить его "штатными" методами без активации каждого листа невозможно.
The_Prist, отдельное спасибо за второй способ. Очень нетривиально и поучительно, я бы самостоятельно не додумался вытащить нужные данные из XML-кода. Возьму на карандаш, может где-то пригодится)))
Sanja, задача прямо противоположная Не выделить ячейки и что-то с ними сделать (тогда, конечно, можно обойтись без выделения), а получить в виде объекта Range то, что уже выделено, без активации листов.
alexthegreat написал: присвойте имена нужным ячейкам или диапазонам и обращайтесь к ним без выделений.
Присвоение имён - не лучший вариант. Суть в следующем: пользователь выделяет нужные ему данные на нескольких листах, а задача программы - обработать то, что пользователь выделил.
Обычный Selection возвращает выделенный диапазон на листе, который является активным, и вообще говоря, являясь свойством объекта Application, не требует указания конкретного листа, т.к. по умолчанию берёт активный. А если мне нужно обратиться к выделенным ячейкам неактивного листа? Типа Workbooks(“…”).Sheets(“…”).Selection (понятно, что в таком виде работать не будет, просто привёл пример).
И вообще можно ли говорить о выделении на неактивном листе?
The_Prist, спасибо, не знал про эту фишку. Теперь автономно всё работает. Тогда вопрос решён, но в виде отдельного файла, имхо, было бы удобнее и универсальнее.
ikki написал: а встроенная справка чем не устраивает?
Встроенная это как раз object browser в редакторе VBA, у меня он не работает (не знаю почему): при нажатии на кнопку "поиск" пытается обращаться к office.com и выдаёт что-то типа "к сожалению, ничего не удалось найти по запросу". Насколько я понимаю, встроенная справка на то и встроенная, чтобы быть автономной и не лезть в сеть по любому поводу.
Всем привет. Кто-нибудь может подсказать, где можно скачать полный справочник по VBA Excel? Собственно по объектной модели Excel - объекты, методы, свойства и т.п. и по функциям VBA. Только не учебник, а именно справочник без лишней "воды", к которому можно обратиться, если забыл синтаксис той или иной функции.
Странно, но на просторах Интернета ничего похожего не нашёл. Может плохо искал...
Встроенный в редактор VBA "Object Browser" в последнее время не работает , а разные онлайн-справочники в интернете очень поверхностны и содержат только часто используемые функции.
Всем привет! Давно слежу за жизнью форума, т.к. профессионально работаю в Excel, узнал много нового Вот теперь решил сам поучаствовать в обсуждении. Тем более, что появился повод - перестали открываться файлы с макросами (Excel 2010). Выводит стандартное сообщение «в книге обнаружено содержимое, которое не удалось прочитать…». После попытки восстановления пишет, что удалён VBA-проект. Скажу сразу - сами файлы не повреждены (открывал zip-ом, проверял структуру – проект VBA на месте и нормально читается). На других компах тоже всё открывается и работает без проблем. Что стало причиной сбоя – у меня были установлены два пакета Office - 2013 и 2010. Вчера удалил 2013, после чего и стала возникать ошибка. Полазил по истории, нашёл похожую проблему: http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=8&TID=13238. Но там всё закончилось ничем, парню пришлось переустанавливать Office. Может кто-то знает более просто решение, из-за чего возникает такая ошибка, и как её исправить без переустановки программы? Может дело в версии VBA-редактора, или при удалении Office 2013 пропали какие-то библиотеки… Полное восстановление или переустановку Office делать не хочу, иначе слетят все настройки, в т.ч. в Outlook'е… Хотелось бы обойтись малой кровью. Заранее спасибо.