Определение позиции курсора на теле табицы EXCEL

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Определение позиции курсора на теле табицы EXCEL

Сообщение alex-lev9 » 19.10.2005 (Ср) 22:55

Имею табицу EXCEL. Например, в пятом столбце находятся фамилии сотрудников компании. Я хочу сделать так, чтобы при наведении курсора мыши на фамилию шрифт, которым написана фамилия, изменился на жирный, и при этом на переднем плане появилась форма с информацией об этом человеке. Информация берется с другой страницы книги EXCEL.
Меня не интересует вопрос о том, как сделать шрифт жирным. Проблема состоит в том, как узнать, что курсор находится именно в нужной мне ячейке таблицы? Как заставить взаимодействовать координаты позиции курсора и лист книги EXCEL?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.10.2005 (Ср) 23:45

Добавь просто ячейкам примечания, а? :)


Не добавит ведь... эх.
GetCursorPos
ScreenToClient
После чего сравнивать x и у c такими величинами, как (application.left+activeworkbook.windows(1).left+activesheet.columns(5).left) и (application.top+activeworkbook.windows(1).top+activesheet.rows(i).top) соответственно...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 20.10.2005 (Чт) 15:27

C GetCursorPos проблем нет.
А вот ScreenToClient - другое дело. Пытаюсь определить hwnd окна Excel, ничего не выходит.

Может чего неправильно?

Dim hwnd As Long
hwnd = FindWindow("XLMAIN", "c:\1111.xls")

При помощи Application.hwnd тоже ничего не получается.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 15:30

Application.hwnd рулит :)
Когда оно есть, конечно. В 97 его нет, на счёт 2000 не уверен :)

Покажи, что делаешь.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 20.10.2005 (Чт) 15:49

Даже это не прёт:

If FindWindow("XLMAIN", vbNullString) > 0 Then
MsgBox "Excel запущен!"
Else
MsgBox "Excel не запущен!"
End If

Стоит у меня Office 2000.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 16:14

findwindow(vbnullstring, application.caption)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 20.10.2005 (Чт) 16:30

Dim hwnd As Long
hwnd = FindWindow(vbNullString, Application.Caption)


Результат - "TYPE MISMATCH"

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 16:53

Как объявлял FindWindow?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 20.10.2005 (Чт) 20:48

:oops: вот баклажан так баклажан.
Не было под рукой API-Viewer, поэтому скопировал объявление переменной где-то из интера. А там - лажа. Алиас не указан и lpWindowName объявлен как Long.
Объявил как положено:

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

и далее

Dim hwnd As Long
hwnd = FindWindow("XLMAIN", Application.Caption)

получил hWnd отличным от нуля.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 21:43

Ну значит это то что надо. Проверь надпись или класс окна (GetWindowText или GeWindowClass)
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 21:46

Twister, ты это к чему? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 21:56

К
получил hWnd отличным от нуля.
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 22:02

А вторая часть к чему? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 22:10

Все язвишь... :wink:

Пояснение это, что еще... :wink:
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 22:35

Пояснение к чему? :roll:

У человека была неправильно объявлена FindWindow...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 20.10.2005 (Чт) 22:52

Вот чего я не могу, так это приспособить слежение за курсором мыши к какой-нибудь стандартной процедуре. В коде какой стандартной процедуры это можно проделать с условием, что все, что я ваяю, происходит в VBA?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 23:01

Да никакой, собственно...
Нет, сабклассингом в VBA заниматься можно, но лучше не надо.

Подойдёт application.ontime каждую секунду?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 23:31

GSerg писал(а):Пояснение к чему? :roll:

У человека была неправильно объявлена FindWindow...

АААААААА!!!!!!!!!!!!!!!!!!!! :shock: :shock: :shock:
Он нашел какой-то хэндл отличный от нуля. И как я понял сомневается, тот ли это, что нужен. Вот я и говорю, проверь, действительно ли это Internet Explorer.
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.10.2005 (Чт) 23:32

Правильный хэндл почти всегда отличен от нуля... К тому же, мы о экселе, а не о эксплорере :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 23:35

Ты мне весь мозг высосал... Я уж третий RedBull допиваю - глаза слипаются. Если описался - извеняйте... :oops:
А я все практикую лечение травами...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2005 (Пт) 0:06

Twister писал(а):Я уж третий RedBull допиваю ... Если описался - извеняйте...

Ну, после трёх банок немудрено и описаться... :roll:


ЗЫ: шучу, шучу, весь топик :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 21.10.2005 (Пт) 1:07

Да уж, во что мы его превратили (топик), млин... :oops: :wink:
А я все практикую лечение травами...

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 22.10.2005 (Сб) 22:00

:lol: Продолжаем разговор.

Внимание вопрос: почему функция ScreenToClient ведет себя неадекватно?

Dim z As Long
Dim MousePos As POINTAPI
z = GetCursorPos(MousePos)
MsgBox ("Позиция мыши " & MousePos.x)
z = ScreenToClient(hwnd, MousePos)
MsgBox ("После пересчета " & MousePos.x)

И в первом, и во втором сообщениях цифры одинаковые. :scratch: :?: :?:[/b]

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 22:11

Чему равно хвнд?
Эксель развёрнут на экран?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 22.10.2005 (Сб) 22:41

hwnd = 1048996, развёрнут.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 22:44

И в чём проблема тогда? :) Если развёрнут, координаты совпадают.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 22.10.2005 (Сб) 22:49

Простите, не удержусь. :lol:

Будто точное значение hwnd может помочь. ROFL. :))))

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 22.10.2005 (Сб) 23:36

И в чём проблема тогда?

В том, что функция GetCursorPos выдает позицию мыши со значением 764, а получив координаты левого края нужного мне столбца данных при помощи ActiveWorkbook.ActiveSheet.Columns(7).Left вижу: 479,78. В то же время простым сложением ширины каждого столбца с 1 по 6 включительно (в пикселах) получаю 733, к которым осталось только добавить ширину столбца с номерами строк (слева), чтобы получить искомое 764.

Так вот, 479,78 - что это за единицы измерения и как их перевести в пикселы?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.10.2005 (Сб) 23:48

Дык это...
У меня совпадает, к примеру...

Код: Выделить всё
  Dim i As Long, w As Double
 
  Debug.Print Columns(7).Left
 
  For i = 1 To 6
    w = w + Columns(i).Width
  Next
 
  Debug.Print w
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

alex-lev9
Обычный пользователь
Обычный пользователь
 
Сообщения: 66
Зарегистрирован: 13.07.2005 (Ср) 15:31

Сообщение alex-lev9 » 22.10.2005 (Сб) 23:58

А теперь поставь курсор мыши в положение Columns(7).Left и получи значение координаты x.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList  
cron