Страницы: 1
RSS
Активация окна рабочей книги курсором мыши, Как активировать окно рабочей книги которое находится под курсором мыши
 
Имеется файл. При открытии книги создается новое окно.
Одно окно будет использоваться для формы ввода, другое для отражения данных и расчетов.

Каждый раз переключаясь между окнами приходится делать клик мыши два раза:
1 клик - Активируется окно
2. клик - Выделяется диапазон.

Подскажите как сделать так, чтобы активация окна происходила автоматически?
То есть при наведении курсора на соответствующее окно.
 
Написать свою ОС, в которой это будет реализовано.
 
Цитата
RAN написал:
Написать свою ОС, в которой это будет реализовано.
Мне только одно непонятно! Почему Вы с такими советами за 2,5 года на форуме написали всего лишь 3140 сообщений?
Я тут с 1970 года. И это только мое 17-ое сообщение)))
Изменено: R.S.P.C.T. - 01.08.2015 18:11:36
 
Цитата
R.S.P.C.T. написал:
Я тут с 1970 года.
Слов нет. Только буквы.  :D
 
Огромное спасибо ZVI. Взял его макрос за основу и практически сумел получить, то что хотел.
Осталось решить только одну задачу:
Как уйти от зацикливания если курсор наведен не на диапазоны ячеек?
 
В win 7ке, кажется есть такая штатная возможность: активировать окно под курсором. Где-то в "спецвозможностях" (для слепых).
Программист - человек, который решает задачу, о которой никто не знает, таким способом, который никто не понимает.
 
Немного переделал код и убрал лишнее.
Сделал активацию только одного окна.

Как сделать активацию и второго окна? И чтоб без зацикливания?

Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Type POINTAPI
  X As Long
  Y As Long
End Type
 
Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINTAPI) As Long
 
Dim DoStop As Boolean
 
' Запуск цикла
Sub RunRangeFromPoint()
 
  Dim cpos As POINTAPI, obj As Object
 
    Do
      GetCursorPos cpos
      Set obj = ActiveWindow.RangeFromPoint(cpos.X, cpos.Y)
      If TypeName(obj) = "Nothing" And ActiveWindow.WindowNumber = 1 Then ActiveWindow.ActivateNext
      DoEvents
    Loop Until DoStop
 
End Sub
Изменено: R.S.P.C.T. - 02.08.2015 21:35:20
 
Цитата
A.nod написал:
В win 7ке, кажется есть такая штатная возможность
Опция работает для окна Excel. Для окон рабочей книги excel не работает.
 
Есть еще у кого какие-то идеи?
 
Есть: 1.Определять окно под мышой по названию (Caption) и активировать; 2.Определять порядковый номер окна и активировать нужное.
Изменено: Влад - 04.08.2015 16:30:36
 
Предлагаю такой вариант для 32-битного Excel, почти не загружающий процессор:
Код
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
' Activate the copy of ThisWorkbook's window under the mouse cursor
Option Explicit
 
Private Type POINTAPI
  X As Long
  Y As Long
End Type
 
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
 
Dim lTimerID As Long
 
' Запуск
Sub Start_It()
  With ThisWorkbook
    If .Windows.Count < 2 Then
      ' Создать копию окна книги с выравниванием по вертикали
      .NewWindow
      .Windows.Arrange ArrangeStyle:=xlVertical
    End If
  End With
  ' Задать интервал таймера 200 мс и адрес периодически выполняемой процедуры
  lTimerID = SetTimer(0&, 0&, 200&, AddressOf Main)
End Sub
 
' Останов
Sub Stop_It()
  KillTimer 0&, lTimerID
End Sub
 
' Основная процедура активации окна книги под курсором мышки
Private Sub Main()
  Dim lHandle As Long, lStrLen As Long
  Dim sText As String, sTextOld As String, sWb As String
  Dim lpPoint As POINTAPI
  sWb = ThisWorkbook.Name & ":"
  GetCursorPos lpPoint
  lHandle = WindowFromPoint(lpPoint.X, lpPoint.Y)
  lStrLen = 260
  sText = Space$(lStrLen)
  GetWindowText lHandle, sText, lStrLen
  sText = Trim(Left(sText, lStrLen))
  If sText <> sTextOld Then
    If InStr(1, sText, sWb, vbTextCompare) = 1 Then
      On Error Resume Next
      Windows(sText).Activate
      sTextOld = sText
    End If
  End If
End Sub
Изменено: ZVI - 07.08.2015 15:39:36
 
Цитата
RAN написал:
Написать свою ОС, в которой это будет реализовано.
Вот из за таких людей, как Владимир (ака ZVI), я так и не напишу свою ось))))
Владимир, спасибо большое еще раз за Вашу помощь.
Изменено: R.S.P.C.T. - 07.08.2015 10:47:50
Страницы: 1
Читают тему
Loading...