Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 30.07.2008, 13:29   #1
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию Перенести в новую книгу отмеченые строки

Есть файлик со списком данных.
Есть макрос который отмечает галочкой строку.
Нужно создать новый лист,
и переместить туда все отмеченные галочкой строки.
Вложения
Тип файла: zip Акты.zip (296.8 Кб, 15 просмотров)
Rom1k06 вне форума
Старый 30.07.2008, 14:09   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите вложение. Запустите макрос "Main".
Вложения
Тип файла: rar Акты_2.rar (189.3 Кб, 26 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 31.07.2008, 05:09   #3
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

А вот более красивое решение Вашей задачи. Без цикла перебора строк и без поиска.
Запустите макрос "Main".
Вложения
Тип файла: rar Акты_3.rar (189.9 Кб, 48 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 31.07.2008, 08:05   #4
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Восклицание Re: Акты_3.xls

SAS888, Вам привет от Билла Гейтса!
Код:
    Set x = Columns("A").ColumnDifferences(Comparison:=[A4])
должен, насколько я понимаю, выделить все ячейки в колонке A, не совпадающие по значению с ячейкой A4.

Но выделение почему-то заканчивается на строке 61812 (это нижний край UsedRange).

P.S. Всё же я бы предпочёл (насколько я понял, ячейки колонки A используются как логические переменные) что-то вроде
Код:
    Set x = Cells(Rows.Count, 2).End(xlUp)
    If x.Row > 6 Then
        Set x = Range(Cells(6, 2), x).Offset(0, -1). _
             SpecialCells(xlCellTypeBlanks)
        If Not x Is Nothing Then x.EntireRow.Delete
    End If
P.P.S. Поскольку обрабатывается событие Worksheet_SelectionChange, я бы применил в Main Application.EnableEvents, хоть в обработчике события и вставлена проверка Target.Cells.Count. Кашу маслом...

Ну и, надеюсь, Rom1k06 не забудет восстановить значения Application.ScreenUpdating и Application.DisplayAlerts.

Последний раз редактировалось дмидми; 31.07.2008 в 08:49. Причина: Нет мук страшнее муки слова! ©
дмидми вне форума
Старый 31.07.2008, 09:25   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1. Метод ColumnDifferences работает в диапазоне UsedRange. Вы, наверное, обратили внимание, что файл автора очень много "весит"? 61812 это и есть последняя строка используемого диапазона. В следубщем файле исправлено (обратите внимание на его размер).
2. Изменил код обработки события Worksheet_SelectionChange. Упростил и убрал обработку Double_Click.
3. По поводу добавления Application.EnableEvents - полностью согласен (добавлено).
4. Что по поводу Application.ScreenUpdating и Application.DisplayAlerts, то значение True этих функций восстанавливается по умолчанию после окончания выполнения процедуры (так же как и On Error GoTo 0). В отличии от них, Application.EnableEvents остается как есть.

P.S. Просто изначально я не стал вмешиваться в то, что автор уже наработал.
Посмотрите вложение. Считаю, что вполне приемлемо.
Вложения
Тип файла: rar Акты_4.rar (11.7 Кб, 53 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума
Старый 31.07.2008, 09:46   #6
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Злость Темна вода во облацех

Цитата:
Сообщение от SAS888 Посмотреть сообщение
1. Метод ColumnDifferences работает в диапазоне UsedRange.
Это документировано? В хэлпе, во всяком случае, такого указания нет.
Цитата:
Сообщение от SAS888 Посмотреть сообщение
4. Что по поводу Application.ScreenUpdating и Application.DisplayAlerts, то значение True этих функций восстанавливается по умолчанию после окончания выполнения процедуры (так же как и On Error GoTo 0). В отличии от них, Application.EnableEvents остается как есть.
DisplayAlerts - да:
Цитата:
Сообщение от Excel Help
If you set this property to False, Micorosoft Excel sets this property to True when the code is finished, unless you are running cross process code
Но ScreenUpdating?
Цитата:
Сообщение от Excel Help
Remember to set the ScreenUpdating property back to True when your macro ends.
О восстановлении/сохранении EnableEvents в хэлпе ничего не сказано.

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

P.P.S. А Worksheet_BeforeDoubleClick-то за что убили?

Последний раз редактировалось дмидми; 31.07.2008 в 09:57.
дмидми вне форума
Старый 31.07.2008, 09:55   #7
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Программа получилась просто идеальная
Спасибо всем кто оказал содействие!

Только мне неочень понятно что делает эта функция?
Target = IIf(Target = "", "a", "") - я так пологаю что она при нажатии
если пустая то "a" если "a" уже есть то пустая?..

Я понял это так .
Rom1k06 вне форума
Старый 31.07.2008, 10:36   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Rom1k06
Абсолютно верно.
дмидми
Цитата:
А Worksheet_BeforeDoubleClick-то за что убили?
А зачем он нужен? Выделением ячейки в столбце "A" "птичка" ставится / убирается. Достаточно.
Скорее всего автор ввел обработку этого события для того, что если мы выделяем ячейку (ставим "птичку"), то как потом ее убрать? Ведь ячейка остается выделена. В измененном мной коде добавлен выбор ячейки рядом. Это позволяет повторным выделением снять "птичку".
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 31.07.2008 в 10:44.
SAS888 вне форума
Старый 31.07.2008, 10:57   #9
дмидми
Форумчанин
 
Аватар для дмидми
 
Регистрация: 06.03.2008
Сообщений: 352
Подмигивание Re: А зачем он нужен?

Цитата:
Сообщение от SAS888 Посмотреть сообщение
Достаточно.
А вот "достаточно" не бывает никогда!

Что (навскидку) я добавил бы, кабы не лень:
1) отсутствие реакции на вход в 1-ю колонку (и перемещение в ней) при помощи не мышки, а клавиатуры;
2) установку/снятие птицы по нажатию клавиши пробела (стандартная возможность в чекбоксах);


И обязательно убрал бы список из первых двух (скрытых) строк на другой лист - а лучше задавал бы его в "Проверке..." непосредственно, а не ссылкой на диапазон.
И поименовал бы шапку таблицы, чтобы не использовать в коде константы номеров строк листа.
дмидми вне форума
Старый 31.07.2008, 11:49   #10
Rom1k06
Форумчанин
 
Регистрация: 30.07.2008
Сообщений: 125
По умолчанию

Если не трудно то как убрать список и прописать его непосредственно в проверке.
Я в проверке делаю список и источник.
А как без источника?
С этия согласен что будет удобнее.
Rom1k06 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переход на новую строку delphin100 Общие вопросы Delphi 9 31.05.2012 04:52
Перенести слова из массива в строки Xardas Паскаль, Turbo Pascal, PascalABC.NET 2 04.05.2008 12:34
Microsoft показала новую OC Singularity merax Свободное общение 11 14.03.2008 19:31
Оцените новую версию UnD)eaD)Snake Софт 4 23.08.2007 10:15