Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA

Автор: SERGE_BLIZNUK
Дата сообщения: 13.02.2007 17:53
Господа, при реализации решения задачи копирования данных на другие листы возникла пара вопросов - буду рад, если кто-то поможет мне разобраться...
1) для того, чтобы скопировались оформление столбцов и строк (в принципе нужна была шапка, скопированная со старого листа на новый - я не нашёл ничего более умного, как скопировать целиком весь лист, а потом удалить диапазон с данными... ;-((
возможно ли скопировать диапазон (Range) с сохранением форматирования строк и столбцов (высота, ширина...)?

2) для копирования листа использовал конструкцию вида:
Set w0 = ActiveWorkbook.Worksheets("1Квартал2007")
w0.Copy After:=w0
Это отрабатывало, но создавало лист с именем "1Квартал2007 (2)"
потом я его переименовывал в нужный:
ActiveWorkbook.Sheets("1Квартал2007 (2)").Name = "Руководители"
Можно ли управлять методом Worksheets.Copy чтобы он копировал в лист с нужным именем?


Автор: Troitsky
Дата сообщения: 13.02.2007 21:22
SERGE_BLIZNUK

Цитата:
возможно ли скопировать диапазон (Range) с сохранением форматирования строк и столбцов (высота, ширина...)?

Форматирование ячеек (цвет, границы и пр.) сохранить при копировании можно, а вот высоту/шируну строк/столбцов, по-моему, можно сохранить только при копировании самих строк/столбцов.


Цитата:
Можно ли управлять методом Worksheets.Copy чтобы он копировал в лист с нужным именем?
У метода Worksheets.Copy есть только два параметра Before и After.

В описанной ситуации я бы поступил так: держал бы в книге отдельный лист, свойство Visible которого было бы установлено в 0 - xlSheetHidden, который являлся бы незаполненным шаблоном (шапка, сетка и т.д.) для всех остальных листов. Его бы я и копировал куда следует. Чисто визуально он не мешал бы абсолютно.
Автор: SERGE_BLIZNUK
Дата сообщения: 13.02.2007 23:15
Troitsky
Спасибо за ответ.
Цитата:
можно сохранить только при копировании самих строк/столбцов.
я это подозревал... А жаль...
Цитата:
В описанной ситуации я бы поступил так: держал бы в книге отдельный лист, свойство Visible которого было бы установлено в 0 - xlSheetHidden
Красивая идея! Спасибо. При случае обязательно воспользуюсь - у меня бродила внутри мысль, чтобы сделать шаблон для шапки - но мысль так и не сформировалась - так что - спасибо!
Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!

Автор: The okk
Дата сообщения: 14.02.2007 06:01
LevT

Цитата:
Меня интересует общий случай для произвольного контекста

Насколько произволен контекст?
Если контекст Excel, то проблема решается выводом всей глобальности в отдельную надстройку (xla, например). Надстройку цепляешь к Excel и обращаешься к ней из любой книги Excel.
Если контекст MS Office, то надстройка должна уже быть COM и цеплять ее надо везде, где будет нужна (и в Excel, и в Word).
Если контекст абсолютно любой, то dll.
Автор: Yuk
Дата сообщения: 14.02.2007 07:45
SERGE_BLIZNUK
Другой вариант пробежатся в цикле по всем строкам-столбцам диапазона и установить их размеры как в исходном листе. Не так уж и сложно.
Автор: The okk
Дата сообщения: 14.02.2007 07:52
Yuk
С копированием шаблона получается лучше. Копирование листа целиком в разы превосходит по скорости создание чистого листа с последующим его форматированием (с циклами - тем более). Знаю по опыту, поскольку была задача, отдаленно напоминающая эту. Я там тоже сначала делал новый лист скриптом (там и форматирование листа, и копирование шапки, и задание области печати и все-все-все). Потом решил сравнить по скорости создание нового листа с копированием шаблона. С тех пор использую только шаблоны листов.

Добавлено:
SERGE_BLIZNUK

Цитата:
Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!

Если Visible = xlVeryHidden, ты метод Copy к нему применить не сможешь.
Автор: SERGE_BLIZNUK
Дата сообщения: 14.02.2007 08:54
Yuk

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

Ну была такая мысль... Не реализовал, ибо скопировать ВЕСЬ лист и потом удалить лишнее для меня в плане написания кода оказалось проще...
Кстати, если Вам несложно - напишите,

The okk
Да. Идея с шаблоном красивая!!!
Цитата:

Цитата: Имхо, вот только лучше сделать Visible = xlVeryHidden - тогда его вручную ввобще нельзя будет не найти, ни включить!
Если Visible = xlVeryHidden, ты метод Copy к нему применить не сможешь.
Автор: The okk
Дата сообщения: 15.02.2007 07:37
Раньше не обращал внимания на лист "Диалог". Сейчас посмотрел, что это такое. Та же форма, только с убогим количеством возможностей. Кто-нибудь знает, как с ним работать в VBA? Хотя бы как называется коллекция листов с диалогами и где находится их VBA-код?
Автор: LevT
Дата сообщения: 15.02.2007 09:26
The okk

Тоже задавался этим вопросом позавчера, в процессе камлания над объектной моделью. Решил для себя, что это унаследованная фича, от тех еще времен, когда в экселе не было интеграции с VBA. Сейчас уже не помню, где видел. Кстати, а как этот лист вставлять из UI?

В таких визуальных вещах есть своя прелесть: они интуитивным образом решают проблему инициализации и рersistence предпочтений пользователя. Например, мне сейчас нужно всего-то проинициализировать несколько списков при запуске макроса теми фамилиями, которые укажет юзер из общего списка - по умолчанию всеми. Заводить ради этого форму? Нафиг, когда можно просто взять именованный диапазон. Только это некрасиво, потому что непонятно, какой из равноправных листов уродовать лишним объектом (с моей точки зрения) и как-то выделять на общем фоне (с точки зрения пользователя). Потому с удовольствием вставлю диалоговый лист, скажите только как.


Добавлено:

Нашел, как на них получить ссылку

Workbook.DialogSheets или Excel.DialogSheet, чтобы увидеть надо включить показ скрытых мемберов в object browser.


Добавлено:


Цитата:
Насколько произволен контекст?
Если контекст Excel, то проблема решается выводом всей глобальности в отдельную надстройку (xla, например).


А отлаживать код этой xla можно одновременно с отладкой рабочей книги? И как их создавать?

Автор: The okk
Дата сообщения: 15.02.2007 11:24
LevT

Цитата:
А отлаживать код этой xla можно одновременно с отладкой рабочей книги?

А xla это и есть рабочая книга... только переделанная в Add-in. Отлаживается, как рабочая книга. - Суть отладки: открываешь две книги - в одной пишешь макрос, в другой - вызываешь этот макрос из первой книги. Если работает нормально, создаешь надстройку из книги, в которой лежит макрос. Подцепленный Add-in - это все равно, что постоянно открытая книга, которую ты не можешь увидеть.

Цитата:
И как их создавать?

В справке на этот счет вот что написано:

Код: Для получения сведений о том, как сделать программу Visual Basic надстройкой, см. Руководство разработчика Microsoft Office XP, которое можно получить в корпорации Майкрософт.
Автор: LevT
Дата сообщения: 15.02.2007 11:40

Ыгы, спасибо. Есть такая книжка у меня в закромах, дождалась своего часа. excel 2002, новее нет? зато по-русски.

А как все-таки вставлять диалоговые листы?


Добавлено:

Забавно. Рассуждаю тут о высоких материях, переключаясь то и дело в TeachPro Excel 2003: одновременно слушаю тамошнюю дурную тётку, уроки для подстаканников. "...вот так вот мы с вами щелкнем, вот сюда, очень интересная команда..." И с пользой для себя слушаю! Никогда не работал раньше с электронными таблицами.
Автор: The okk
Дата сообщения: 15.02.2007 14:55
LevT

Цитата:
Есть такая книжка у меня в закромах

А у меня только библиотечная.

Цитата:
excel 2002, новее нет

Я имел в виду:


Цитата:
А как все-таки вставлять диалоговые листы?

В смысле? Руками? - Как обычный лист: кликаешь правой кнопкой по листам и жмешь добавить. Появляется диалоговое окно с выбором типа листа. Там среди прочего (диаграмма, лист, макрос и т.д.) будет пункт Диалог с соответствующей иконкой. Там уж не ошибешься.
А если не руками, то видимо, как обычный лист - Коллекция.Add.
Или ты про вставку полученного диалога в листы с данными, как ActiveX?
Автор: LevT
Дата сообщения: 15.02.2007 16:10
The okk
книга та самая, в электронном виде, скачал когда-то с megido.ru

а диалоговые листы и впрямь гадость, низачем они такие не нужны. Я-то предполагал ни разу не глядя, что они больше похожи на стандартные листы, чем на юзерформы.

Вот кстати темка для надстройки, кому не влом потренироваться: формоподобный UI на основе стандартных листов экселя. Чтобы можно было одновременно работать пользователю как со стандартным листом (с некоторыми регионами и рюшечками), а программисту как с формой (разного вида регионы имеют разную предопределенную семантику и поведение).
Автор: serb78
Дата сообщения: 16.02.2007 19:52
подскажите как русифицировать редактор Microsoft Visual Basic в Exel?
Автор: LevT
Дата сообщения: 16.02.2007 21:12

serb78

никак! Если только маньяк-одиночка какой-нибудь склепал и выложил русификацию.

...На самом деле даже "русифицированные" имена функций на листах - мерзость невообразимая. Подозреваю, что их вернуть к исходному состоянию еще более невозможно. The okk, я прав?

Автор: SERGE_BLIZNUK
Дата сообщения: 17.02.2007 16:02
LevT

Цитата:
Подозреваю, что их вернуть к исходному состоянию еще более невозможно

А я подозреваю, что очень даже несложно...
Просто поставить английский Office... $-))))
Автор: LevT
Дата сообщения: 17.02.2007 17:11

Юзверей жалко. А если уж кто полез в функции - то такие продвинутые могут и английские имена освоить.



Добавлено:

Кста, вопрос о совместимости. Что будет с английскими функциями в русском экселе и наоборот?
Автор: CEMEH
Дата сообщения: 17.02.2007 23:19
Помогите чайнику.

Нужно, что бы в яейке открывался календарик. В макросах не силен. Убил кучу времени и сил, но так и не смог ничего сделать. Помогите.
Автор: SERGE_BLIZNUK
Дата сообщения: 18.02.2007 07:11
LevT
Цитата:
вопрос о совместимости. Что будет с английскими функциями в русском экселе и наоборот
они в Excel хранятся во внутреннем представлении - поэтому в каком Excel откроете - на том языке формулу и увидите...
В отличии от VBA - тот тоже хранится во внутреннем представлении - но там все функции (отображаются и вводятся) на английском... помоему так...

Автор: Maxximus75
Дата сообщения: 18.02.2007 17:02
Помогите ламеру!
На листе есть диапазон в котором просчитывается сроки проверок, если срок вышел то ячейка с датой напротив фамилии окрашивается в красный цвет (условным форматированием) .
в столбце B4:B30 идут фамилии а далее даты проверок С4:P30.

Вопрос: Как на VBA выполнить поиск людей у которых вышли проверки скопировать фамилии данных людей и вставить в другой столбец.

Игрался вот с этим но ничего не получается
Sub Test()

Dim r As Range

Application.FindFormat.Interior.ColorIndex = 3

Set r = Cells.Find(What:="", after:=ActiveCell, SearchFormat:=True)
If Not r Is Nothing Then r.Copy

Range("J2").Insert
Range("J2").ClearFormats
Application.FindFormat.Clear

End Sub

Автор: jONES1979
Дата сообщения: 18.02.2007 17:59
CEMEH

пожалуйста, http://slil.ru/23951259
Автор: CEMEH
Дата сообщения: 18.02.2007 19:00
jONES1979
Попробовал. Дважды щелкаю на дате, вылезает сообщение:
Could not load an object because it is not available on this machine.

Может у меня офис кривой какой?
Автор: LevT
Дата сообщения: 18.02.2007 19:07
CEMEH

не, просто надо зарегистрировать ole сервер (ActiveX), отвечающий за прорисовку этого календарика. А перед этим, возможно, его скачать.

Автор: CEMEH
Дата сообщения: 18.02.2007 19:30
LevT
Час от часу не легче.
Сдается мне, что набить руками по полторы тысячи строк в каждом из двенадцати листов будет много проще.
Неужели, для такой простейшей задачи нужен такой огромный гемор?

Если бя я знал что такое ole сервер и где его качать....

пс а вообще календарик какой то есть Вставка - Обьект - календарь. Только что с ним делать х.з.
Неужели нельзя как во FrontPage - что захотел, то и вставил?

Терпенья нет уже никакого...
Автор: serb78
Дата сообщения: 18.02.2007 20:21
подскажите как сделать чтобы процесс выполнения макроса не отображался на экране, а сразу появился только конечный результ, или чтобы полоска бежала, показывая выполнение процесса
Автор: LevT
Дата сообщения: 18.02.2007 21:24

Цитата:
пс а вообще календарик какой то есть Вставка - Обьект - календарь.


Ну и как, вставляется нормально? Тогда должен появляться тулбар с кнопочкой "Переключиться в режим конструктора", а дальше правый клик и опции.


Добавлено:

А гимор - из-за неполного соответствия активеX, зарегистрированных на машинах разработчика и пользователя. Для снятия гимора существуют инсталляторы, либо стандарты де-факто типа того же календаря (который, кажется, прилагается к офису, но иногда от его установки отказываются).
Автор: CEMEH
Дата сообщения: 18.02.2007 22:20
LevT
В правом клике ничего путного нет. А вот если дважды щелкнуть, то откроется окно англицкое(MVB), там наверное, код надо вводить. А какой - мая плакать....


о, здорово!!!
Написал там вот это:

Private Sub Calendar1_Click()
Cells(5, 3).Value = Calendar1.Object
End Sub

И все работает, но ТОЛЬКО В ОДНОЙ ЯЧЕЙКЕ.
Может сделать все раскрывающимся списком? Год известен, месяц то же, только дату менять надо....
Автор: LevT
Дата сообщения: 18.02.2007 22:47
Маладца. Теперь гугль, ищи инструкцию по программированию элемента управления календарь.

А по правому клику есть "свойства" - настраивать вид этого календаря, там же кое-какая справка.



Добавлено:

Еще не забудь, что можно не только на листе играть с календариком, но и в юзерформу его запихнуть.
Автор: jONES1979
Дата сообщения: 19.02.2007 00:41
CEMEH
Это стандартный "календарь" из пакета MS Office. Когда офис ставишь в режиме выборочно, он живет в разделе аксесса. Я потому его и взял, что он в комплекте идет с офисом и качать не надо....

убедись, что у тебя есть файлик %SystemRoot%\SYSTEM32\mscomct2.ocx


LevT

Цитата:
Еще не забудь, что можно не только на листе играть с календариком, но и в юзерформу его запихнуть


ну дак я так и сделал
Автор: aks_sv
Дата сообщения: 19.02.2007 08:33
serb78

Цитата:
подскажите как сделать чтобы процесс выполнения макроса не отображался на экране, а сразу появился только конечный результ, или чтобы полоска бежала, показывая выполнение процесса


Application.ScreenUpdating = False

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Стоит ли переходить с Билдера на Делфи?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.