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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2016, 13:39   #1
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию Открыть форму относительно положения курсора на листе

Здравствуйте Уважаемые программисты!
Помогите пожалуйста исправить код ниже (vba excel 2003 и 2007), который позволяет по щелчку по кнопке на Листе (кнопка - это рисунок с назначенным макросом) открыть форму относительно клика по этой кнопке.
Макрос ниже работает, но проблема в том, что периодически после клика по кнопке, форма открывается в ином месте (значительно ниже кнопки). Как правило, это смещение положения происходит при первом клике по кнопке, при втором и последующих кликах открывается как положено, рядом с кнопкой.
Спасибо!

В стандартном модуле:
Код:
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetDeviceCaps Lib "Gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long

Const LOGPIXELSX = 88
Const LOGPIXELSY = 90

Public Type tCursor
    left As Long
    top As Long
End Type

Private Declare Function GetCursorPos Lib "user32" (p As tCursor) As Long

Public Function pointsPerPixelX() As Double
    Dim hDC As Long
    hDC = GetDC(0)
    pointsPerPixelX = 72 / GetDeviceCaps(hDC, LOGPIXELSX)
    ReleaseDC 0, hDC
End Function

Public Function pointsPerPixelY() As Double
    Dim hDC As Long
    hDC = GetDC(0)
    pointsPerPixelY = 72 / GetDeviceCaps(hDC, LOGPIXELSY)
    ReleaseDC 0, hDC
End Function

Public Function WhereIsTheMouseAt() As tCursor
    Dim mPos As tCursor
    GetCursorPos mPos
    WhereIsTheMouseAt = mPos
End Function

Public Function convertMouseToForm() As tCursor
    Dim mPos As tCursor
    mPos = WhereIsTheMouseAt
    mPos.left = pointsPerPixelY * mPos.left
    mPos.top = pointsPerPixelX * mPos.top
    convertMouseToForm = mPos
End Function
В модуле формы:
Код:
Private Sub UserForm_Initialize()
   Dim mPos As tCursor
   mPos = convertMouseToForm
   With Me
      .StartUpPosition = 0
      .left = mPos.left
      .top = mPos.top
   End With
End Sub
ольгаг вне форума Ответить с цитированием
Старый 08.08.2016, 21:11   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Перенисите код в событие активации формы.
Код:
Private Sub UserForm_Activate()
  Dim mPos As tCursor
   mPos = convertMouseToForm
  '' Debug.Print mPos.left
  '' Debug.Print mPos.top
  With Me
      .StartUpPosition = 0
      .left = mPos.left
      .top = mPos.top
   End With
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 09.08.2016, 07:13   #3
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо, но также при первом запуске форма при открытии съезжает значительно вниз относительно клика по кнопке.
Как будто при открытии формы берутся в расчет зоны меню и панелей. А при следующих кликах нет.

Последний раз редактировалось ольгаг; 09.08.2016 в 07:16.
ольгаг вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Расположить форму относительно кнопки на листе ольгаг Microsoft Office Excel 3 27.07.2016 11:26
Определение положения курсора мыши над элементом КолиК29 C# (си шарп) 1 12.01.2016 09:07
Привязка положения сводной таблицы на листе Dzzz Microsoft Office Excel 2 11.09.2014 09:12
Проверка положения курсора на элементе окна sevoan Общие вопросы C/C++ 10 01.03.2012 18:44
Проверка положения точки относительно треугольника AnDre_rus Общие вопросы C/C++ 2 12.11.2010 19:38