Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 3
1

Mousemove event Excel worksheet

18.02.2011, 18:40. Показов 7838. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Знаю что стандартно событие Mouseleave или mosemove недоступно в событиях Worksheet. Но мне очень нужно написать процедуру, которая бы при движении мышкой над диапазоном ячеек с нажатой левой кнопкой мыши заполняло каждую ячейку каким-нить символом, ("1" например), а при движении с нажатой правой кнопкой заполняло теже ячейки другим сиволом ("0", например, или просто empty)

Как это можно реализовать???

Заранее спасибо всем откликнувшимcя.

Добавлено через 33 минуты
Вот нашел нечто что может быть полезным. К сожалению я ничего не понимаю в API
но по ходу следующий код определяет адрес ячейки над которой установлен указатель

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Type POINTAPI
        x As Long
        y As Long
End Type
 
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
   Dim iMousePos   As POINTAPI
   Dim iResult     As Long
   
   iResult = GetCursorPos(iMousePos)
   If iResult <> 0 Then
      Cancel = True
      MsgBox ActiveWindow.RangeFromPoint(X:=iMousePos.x, Y:=iMousePos.y).Address
   End If
End Sub
help please
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2011, 18:40
Ответы с готовыми решениями:

Event Spreadsheet.SelectionChangeing для worksheet
Eto moi pervi vapros na etom forume. Vsem spasibo! ibo ia nauchilsia mnogomu blagodaria vashim...

Excel 97 ругается на Event-ы, Enum-ы и на AddressOf
Я уже задавал однажды вопрос и тогда он благополучно для меня разрешился. Дюже доволен этим...

Microsoft.Office.Interop.Excel.Worksheet - переключение между листами
Споткнулся на пустом месте. Начал работать с многостраничным файлом. При переключении между...

Событие Event.COPY Event.PASTE Event.CUT
Привет я не знаю как написать код в котором текстовое поле реагировало бы на события...

7
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 3
20.02.2011, 12:48  [ТС] 2
Вот какое решения нашел я. Возможно не самое изящное но никто так за 2 дня и не откликнулся

1. Мне не нужно менять значения и формат ячеек средствами Excel, поэтому на рабочий лист я добавил элемент ActiveX Lable1

2. Добавил следующий код для листа
Visual Basic
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
Private Type POINTAPI
    xC As Long
    yC As Long
End Type
 
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
 
 
 
Private Sub Label1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
    Dim iMousePos As POINTAPI
    Dim iResult As Long
    iResult = GetCursorPos(iMousePos)
    cellX = iMousePos.xC
    cellY = iMousePos.yC
    Cells(1, 1).Value = "cellX=" & cellX & "; " & "cellY=" & cellY & "; " & "b=" & Button & " s=" & Shift
    Debug.Print ActiveWindow.RangeFromPoint(x:=cellX, y:=cellY).Name    ' Возвращает Lable1
 
    Stop
    'Select Case Shift
    'Case 1
    'If ActiveWindow.Cells.RangeFromPoint(x:=iMousePos.xC, y:=iMousePos.yC).Value = Empty Then
    '    ActiveWindow.RangeFromPoint(x:=iMousePos.xC, y:=iMousePos.yC).Value = 1
    'Else
    'ActiveWindow.RangeFromPoint(x:=iMousePos.xC, y:=iMousePos.yC).Value = Empty
    'End If
    'End Select
 
End Sub
Теперь ума не приложу как обратиться к ячейке по координатам курсора, т.к. RangeFromPoint обращается к Lable1

Есть варианты??
0
7 / 7 / 0
Регистрация: 16.03.2011
Сообщений: 26
16.03.2011, 16:52 3
Добрый вечер!

А вот так не подойдет? Правда ЛКМ кликать прийдется по каждой ячейке:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Private Type POINTAPI
        x As Long
        y As Long
End Type
 
Private Declare Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
 
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
    Dim iMousePos   As POINTAPI
    Dim iResult     As Long
   
    iResult = GetCursorPos(iMousePos)
    If iResult <> 0 Then
        Cancel = True
        
        adr = ActiveWindow.RangeFromPoint(x:=iMousePos.x, y:=iMousePos.y).Address
        
        With ThisWorkbook.ActiveSheet
            .Range(adr) = "1"
        End With
    End If
End Sub
0
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
16.03.2011, 18:08 4
По-моему даже изобретение MouseMove для листа excel не избавит нас от дальнейших граблей: как вы собираетесь отключить нормальную обработку действий Excel при зажатых правой или левой кнопок мыши? Все сложней, чем кажется на первый взгляд.
0
7 / 7 / 0
Регистрация: 16.03.2011
Сообщений: 26
16.03.2011, 18:12 5
Цитата Сообщение от mc-black Посмотреть сообщение
По-моему даже изобретение MouseMove для листа excel не избавит нас от дальнейших граблей: как вы собираетесь отключить нормальную обработку действий Excel при зажатых правой или левой кнопок мыши? Все сложней, чем кажется на первый взгляд.
Если Вы воспроизведете работу кода, то увидите, что стандартное контекстнозависимое меню в чейке отключилось! Это что - просто что бы спросить? Или я чего то не понял?
0
2785 / 717 / 106
Регистрация: 04.02.2011
Сообщений: 1,443
17.03.2011, 11:28 6
Просто тот вариант, что могу предложить я, он трудоемкий, и я не знаю - не факт, что он сработает. Смысл: сабклассировать окно Excel или окно запущенной формы, захватить (SetCapture) события мыши нашим окном (WM_MOUSEMOVE или что-то подобное) и далее - следить за перемещением. Вопрос не слишком простой, так как понадобится кое-что понимать в Windows API и шустро набрасывать код. Если будете копать дальше, ключевые слова здесь: SetCapture, subclassing, WM_MOUSEMOVE. hWnd окон Excel находят обычно через FindWindow.
0
0 / 0 / 0
Регистрация: 18.02.2011
Сообщений: 3
18.03.2011, 00:03  [ТС] 7
очень сложно для самоучки

Добавлено через 10 минут
попробую объяснить зачем мне это надо. Может тогда у кого-нить появятся альтернативные варианты реализации.

Есть табель учета рабочего времени и есть ограничения по часам отдыха и работы накладываемые на каждого работника. Сутки разбиты на 24 часа, каждый час на 0.5 т.е. всего 48 ячеек для каждых суток. В оригинаде каждый работкник в конце рабочего дня ставит крест "x" в ячеку, когда он работал. и оставляет ячеку пустой, если отдыхал.

НО ДАЖЕ ЭТА ПРОЦЕДУРА ЗАПОЛНЕИЯ КРЕСТАМИ ПОКАЗАЛАСЬ НЕКОТОРЫМ УНИКУМАМ СЛИШКОМ СЛОЖНОЙ.

Поэтому и возникла идея "рисовать" кресты мышкой.

Стандартные события Excel по right или leftclick в данном случае мне не нужны. Более того в код будут вставленны строки убирающие любые меню, кроме сохранить, закрыть и...все. Подсчет времени будет вестись стандартными формулами Excel в скрытых ячеках.

Все что толжен видеть рабочий, открыв книгу - это таблицу. : Строки - дни месяца; столбцы - сутки разбитые на 48 получасовых интервалов....
0
7 / 7 / 0
Регистрация: 16.03.2011
Сообщений: 26
18.03.2011, 07:55 8
Цитата Сообщение от mc-black Посмотреть сообщение
Просто тот вариант, что могу предложить я, он трудоемкий, и я не знаю - не факт, что он сработает. Смысл: сабклассировать окно Excel или окно запущенной формы, захватить (SetCapture) события мыши нашим окном (WM_MOUSEMOVE или что-то подобное) и далее - следить за перемещением. Вопрос не слишком простой, так как понадобится кое-что понимать в Windows API и шустро набрасывать код. Если будете копать дальше, ключевые слова здесь: SetCapture, subclassing, WM_MOUSEMOVE. hWnd окон Excel находят обычно через FindWindow.
Нашел вот тут про мыша: //http://vsokovikov.narod.ru/New_MSDN_API/Mouse_input/ogl_mouse.htm

Вот может кто объяснит, каким образом код:
C++
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
LRESULT APIENTRY MainWndProc(HWND hwndMain, UINT uMsg, 
                             WPARAM wParam, LPARAM lParam) 
{ 
    HDC hdc;                       // дескриптор контекста устройства 
    RECT rcClient;                 // прямоугольник рабочей области 
    POINT ptClientUL;              // верхний левый угол рабочей области
    POINT ptClientLR;              // нижний правый угол рабочей области 
    static POINTS ptsBegin;        // исходная точка
    static POINTS ptsEnd;          // новая конечная точка 
    static POINTS ptsPrevEnd;      // предыдущая конечная точка 
    static BOOL fPrevLine = FALSE; // флажок предыдущей линии 
 
    switch (uMsg) 
    { 
       case WM_LBUTTONDOWN: 
 
            // Захват ввода данных от мыши. 
 
            SetCapture(hwndMain); 
 
            // Получим экранные координаты рабочей области, 
            // и преобразуем их в рабочие координаты. 
 
            GetClientRect(hwndMain, &rcClient); 
            ptClientUL.x = rcClient.left; 
            ptClientUL.y = rcClient.top; 
 
            // Добавим по единице с правой и нижней стороны, поскольку 
            // координаты полученные при помощи GetClientRect не 
            // включают в себя крайний левый и крайний нижний пиксели. 
 
            ptClientLR.x = rcClient.right + 1; 
            ptClientLR.y = rcClient.bottom + 1; 
            ClientToScreen(hwndMain, &ptClientUL); 
            ClientToScreen(hwndMain, &ptClientLR); 
 
            // Скопируем рабочие координаты рабочей области в 
            // член rcClient структуры. Ограничим курсор мыши рабочей 
            // областью с помощью передачи rcClient структуры в 
            // функцию ClipCursor. 
 
            SetRect(&rcClient, ptClientUL.x, ptClientUL.y, 
                ptClientLR.x, ptClientLR.y); 
            ClipCursor(&rcClient); 
 
            // Преобразуем координаты курсора в структуру POINTS, 
            // которая определяет исходную точку рисуемой линии 
            // в ходе сообщения WM_MOUSEMOVE. 
 
            ptsBegin = MAKEPOINTS(lParam); 
            return 0; 
 
        case WM_MOUSEMOVE: 
 
            // Когда мышь движется, пользователь, чтобы нарисовать линию, 
            // должен удерживать нажатой левую кнопку мыши. 
 
            if (wParam & MK_LBUTTON) 
            { 
 
                // Получим контекст устройства (DC) для рабочей области. 
 
                hdc = GetDC(hwndMain); 
 
                // Ниже следуют функции гарантирующие, что пиксели  
                // предыдущей нарисованной линии установятся в белый и
                // те же самые новой линии установятся в черный. 
 
                SetROP2(hdc, R2_NOTXORPEN); 
 
                // Если линия была нарисована раньше сообщения WM_MOUSEMOVE 
                // то рисование проходит поверх ее. Линия стирается при помощи 
                // установки ее пикселей в белый цвет. 
 
                if (fPrevLine) 
                { 
                    MoveToEx(hdc, ptsBegin.x, ptsBegin.y, 
                        (LPPOINT) NULL); 
                    LineTo(hdc, ptsPrevEnd.x, ptsPrevEnd.y); 
                } 
 
                // Преобразуем текущие координаты курсора в структуру
                // POINTS, а затем нарисуем новую линию. 
 
                ptsEnd = MAKEPOINTS(lParam); 
                MoveToEx(hdc, ptsBegin.x, ptsBegin.y, (LPPOINT) NULL); 
                LineTo(hdc, ptsEnd.x, ptsEnd.y); 
 
                // Установим флажок предыдущей линии, сохраним конечную 
                // точку новой линии, а затем восстановим прежний DC. 
 
                fPrevLine = TRUE; 
                ptsPrevEnd = ptsEnd; 
                ReleaseDC(hwndMain, hdc); 
            } 
            break; 
 
        case WM_LBUTTONUP: 
 
            // Пользователь закончил рисовать линию. Сбросим флажок 
            //  предыдущей линии, освободим курсор мыши, и освободим 
            // мышь от захвата. 
 
            fPrevLine = FALSE; 
            ClipCursor(NULL); 
            ReleaseCapture(); 
            return 0; 
 
        case WM_DESTROY: 
            PostQuitMessage(0); 
            break; 
 
        // Обработка других сообщений.
"прикрутить" к VBA?
0
18.03.2011, 07:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2011, 07:55
Помогаю со студенческими работами здесь

Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "Microsoft.Office.Interop.Excel.Worksheet"
Доброго времени суток. Суть проблемы такова: написал программку добавил функцию сохранения в...

WebBrowser не поддерживает Event MouseDown и Event MouseUp
Здравствуйте, у меня имеется WebBrowser control в windowsFormApp, но он не поддерживает Event...

event.returnValue is deprecated. Please use the standard event.preventDefault() instead
Выдаёт ошибку event.returnValue is deprecated. Please use the standard event.preventDefault()...

Как узнать координаты мышки из event:Event
как из переменной event достать координаты? knob_MC.addEventListener(MouseEvent.MOUSE_DOWN,...

Worksheet
Подскажите пожалуйста хороший для пхп....и вообще ссылку на какой то учебник..где будет объяснено...

WorkSheet.Index
Получения index у Excel файла страницы, использую так int = i; WorkSheet.Index при этом WorkSheet...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru