Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу Работа с результатами поиска в Excel
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию Работа с результатами поиска в Excel - 21.02.2016, 15:59

День добрый!
Уже довольно давно мучаюсь с вопросом по работе в excel, точнее - работе с результатами поиска по кнопке "найти все" в окне "найти и заменить": возможно ли как-то сделать, чтобы по клику по одному из результатов этот результат не просто подсвечивался в рабочем окне, но и "активировался", т.е. можно было сразу с ним работать, не переключаясь в сам excel? Примерно изобразил упрощенную схемку на скриншоте, основной смысл в том, чтобы избавиться от одного лишнего действия - нажатия alt+tab каждый раз после клика по результату поиска
Миниатюры
qip-shot-screen-286.jpg  
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 18:32

Так подойдёт ?
Вложения
Тип файла: zip FindPlus(32bit).zip (6.3 Кб, 10 просмотров)
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (21.02.2016)
  (#3 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 21.02.2016, 18:37

Цитата:
Сообщение от pashulka Посмотреть сообщение
Так подойдёт ?
Да, именно такое поведение и интересует, спасибо)) Еще бы разобраться, в чем тут фишка - как это в personal перенести))
Ответить с цитированием
  (#4 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 18:43

Находите в личной книге - модуль книги ThisWorkbook(ЭтаКнига) и просто копируете весь код + разумеется, сохраняете изменения. Теперь, при следующем запуске Excel всё будет работать. Если "ждать" не хочется, то после копирования кода - просто выполните событие Workbook_Open
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (21.02.2016)
  (#5 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 21.02.2016, 18:48

Цитата:
Сообщение от pashulka Посмотреть сообщение
Находите в личной книге - модуль книги ThisWorkbook(ЭтаКнига) и просто копируете весь код + разумеется, сохраняете изменения. Теперь, при следующем запуске Excel всё будет работать. Если "ждать" не хочется, то после копирования кода - просто выполните событие Workbook_Open
Еще раз большое спасибо, все отлично работает))
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 18:52

P.S. В окончательной версии можно убрать все упоминания о XL97-2000, т.к. на самом деле - совет не актуален для этих версий.
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (21.02.2016)
  (#7 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 23:56

Если будет время и желание, то можете протестировать ещё один вариант.

VB Код:
Private WithEvents xlApp As Excel.Application
   
Private Sub Workbook_Open()
    Set xlApp = Application
End Sub

Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    AppActivate xlApp.Caption ': ActiveCell.Activate
End Sub
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (22.02.2016)
  (#8 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 22.02.2016, 00:05

Цитата:
Сообщение от pashulka Посмотреть сообщение
Если будет время и желание, то можете протестировать ещё один вариант.
Еще раз благодарю, вроде даже более интересный вариант: из того, что я в нем понимаю, он от битности не зависит и по первым проверкам не перестал работать при прерывании макроса из-за ошибки))
Ответить с цитированием
  (#9 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.02.2016, 00:17

А какая ошибка и при каких условиях возникала ?
Ответить с цитированием
  (#10 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 22.02.2016, 00:22

Цитата:
Сообщение от pashulka Посмотреть сообщение
А какая ошибка и при каких условиях возникала ?
Это у меня там свое - макрос копирования текущей строки на второй лист, а когда второго листа в книге нет, то макрос соответственно завершается с ошибкой)) После этой ошибки первый вариант (FindPlus(32bit)) перестал работать, а второй вроде продолжает
Ответить с цитированием
  (#11 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.02.2016, 00:30

На всякий случай - перед копированием можно проверить и наличие второго листа (и наличие следующего)

VB Код:
Private Sub Test()
    If Worksheets.Count = 2 Then
       MsgBox "Можно копировать с 1 на 2"
    Else
       MsgBox "Копирование откладывается"
    End If
End Sub

VB Код:
Private Sub Test2()
    If Not ActiveSheet.Next Is Nothing Then
       MsgBox "Есть следующий лист"
    Else
       MsgBox "Последний лист"
    End If
End Sub
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (22.02.2016)
  (#12 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 22.02.2016, 00:39

В этой ситуации вряд ли использую - второй лист у меня автоматически создается другим макросом, что-то типа "подготовка к работе" )) Но в любом случае спасибо за примеры, для общего развития и понимания пригодится)))
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 22.02.2016, 18:14

Цитата:
Сообщение от pashulka Посмотреть сообщение
Если будет время и желание, то можете протестировать ещё один вариант.

VB Код:
Private WithEvents xlApp As Excel.Application
   
Private Sub Workbook_Open()
    Set xlApp = Application
End Sub

Private Sub xlApp_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    AppActivate xlApp.Caption ': ActiveCell.Activate
End Sub
Попользовал на практике - возник еще вопрос: можно ли использовать какое-то другое событие? Как я понимаю, в процессе часто получается, что очередной клик мыши срабатывает не просто как клик, а как "клик со смещением", т.е. не идеально единичный микроклик в одной-единственной точке. В результате фокус передается основному окну, но тут же возвращается окну поиска, потому что "продолжение клика" уже не приводит к изменению выбранной строки. Возможно, причина еще в чем-то или я описываю неправильно, но я так эту ситуацию понял))

И еще вопросец: есть макрос удаления пустых строк:
VB Код:
Columns("A:A").Select
    Range("A1530").Activate
    Selection.SpecialCells(xlCellTypeBlanks).Select
    Selection.EntireRow.Delete
Если по какой-то причине нажать его дважды, то выдается ошибка "не найдено ни одной ячейки", и опять же перестает работать активация главного окна при клике по окну поиска. Пошарился в интернете, но так и не нашел: есть ли какой-то простой способ проверить наличие пустых ячеек в столбце наподобие функции "СчитатьПустоты"? Везде только циклы с перебором всех ячеек диапазона - воспринимается как-то коряво))

Последний раз редактировалось Egorro; 22.02.2016 в 19:56
Ответить с цитированием
  (#14 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 22.02.2016, 22:51

Цитата:
возник еще вопрос: можно ли использовать какое-то другое событие?
Дело в том, что после клика в стандартном диалоговом окне "Найти и заменить" вызывается именно это событие. Если же по каким-то причинам, фокус ввода опять возвращается к окну поиска, то Вы можете, например, вернуться к первому варианту.

Цитата:
есть ли какой-то простой способ проверить наличие пустых ячеек в столбце наподобие функции "СчитатьПустоты"?
Вы, конечно же, можете использовать стандартную функцию рабочего листа =СЧИТАТЬПУСТОТЫ(), но это не всегда поможет избежать ошибки, т.к. SpecialCells(xlBlanks) это реально пустые ячейки, а функция СЧИТАТЬПУСТОТЫ считает пустыми ещё и ячейки c формулами, которые возвращают значение "" (пустой текст)

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

VB Код:
Dim iSource As Range
Set iSource = Intersect(ActiveSheet.UsedRange.EntireRow, Columns(1))

Select Case iSource.Count - Application.CountA(iSource)
    Case 1
       iSource.Find("", , xlFormulas).EntireRow.Delete
    Case Is > 1
       iSource.SpecialCells(xlBlanks).EntireRow.Delete
End Select

Впрочем, можно и просто "игнорировать" ошибку

VB Код:
On Error Resume Next
[A:A].SpecialCells(xlBlanks).EntireRow
Ответить с цитированием
Пользователь сказал cпасибо:
Egorro (22.02.2016)
  (#15 (permalink)) Старый
Egorro Egorro вне форума
Специалист
 
Аватар для Egorro
 
Сообщений: 13,078
Сказал(а) спасибо: 402
Поблагодарили 2,129 раз(а) в 2,056 сообщениях
Регистрация: 06.01.2011
Адрес: Чубаксары
По умолчанию 22.02.2016, 23:03

Цитата:
Сообщение от pashulka Посмотреть сообщение
Дело в том, что после клика в стандартном диалоговом окне "Найти и заменить" вызывается именно это событие. Если же по каким-то причинам, фокус ввода опять возвращается к окну поиска, то Вы можете, например, вернуться к первому варианту.
Я попробовал оба варианта, в обоих примерно одинаково может случаться, что фокусируется все же окно поиска. Я не уверен на 100%, но думаю, что происходит примерно то же самое, как если нажать ЛКМ и немного сдвинуть мышь с нажатой кнопкой - фокус остается именно на поисковом окне, похоже что именно подобное случается и при работе - микросдвиги мыши при нажатой кнопке)) Хотя привыкнуть можно, все равно удобнее чем раньше - совсем без смены фокуса)))
Цитата:
Сообщение от pashulka Посмотреть сообщение
Вы, конечно же, можете использовать стандартную функцию рабочего листа =СЧИТАТЬПУСТОТЫ(), но это не всегда поможет избежать ошибки, т.к. SpecialCells(xlBlanks) это реально пустые ячейки, а функция СЧИТАТЬПУСТОТЫ считает пустыми ещё и ячейки c формулами, которые возвращают значение "" (пустой текст)
Как я понял, эта функция работает только в режиме таблицы, а в VB отсутствует
Цитата:
Сообщение от pashulka Посмотреть сообщение
Не самый простой(лаконичный) способ, но зато учитывающий, что в столбце может быть всего одна пустая ячейка.
В этом способе мало что понял - настолько мои познания методом тыка не заходят, но попробую как есть, не вникая - снова большое спасибо в очередной раз))
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа механизма поиска с возвратом в VIP MosAic Prolog 6 12.01.2016 10:41
Работа с библиотекой dll в Excel samsaa Visual Basic 0 14.06.2011 22:52
Работа с таблицами в Excel dkrat Вопросы начинающих программистов 2 12.10.2010 20:50
Работа с файлами в Word & Excel 0mega Вопросы начинающих программистов 1 13.10.2009 15:09
EXCEL РАБОТА С ИНФОРМАЦИЕЙ Rumen Разное 0 27.07.2008 12:15
Работа с Combobox в Excel =Lio= Visual Basic 3 25.08.2007 16:33
Excel. Создание и работа с БД Mypppka Visual Basic 1 10.08.2006 12:48
работа с winsock в VBA Excel muntyan Visual Basic 10 13.02.2006 21:41
Работа с Excel через OLE denism C++ Builder 3 07.08.2005 21:05
Организация поиска по столбам в Excel DeusEx C++ Builder 4 01.06.2004 08:19
Работа с исправлениями в Excel marsad Visual Basic 0 07.04.2004 18:06
Работа с Excel но без MFC Anonymous Visual C++ 2 18.11.2003 06:15



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов