1

Тема: AHK: hotkey для переключения листов в Excel

Имеем:
мышь с доп.кнопками (XButton1/2, т.е. Browser_Back/Next) и скрипт, который при нажатии XB1/2 (или Win+стрелки вверх/вниз) сворачивает/восстанавливает окна, а при нажатии LButton+XB1/2 в любом окне (браузеры, проводник, те что поддерживают) выполняет - Назад/Вперед (Browser_Back/Next). Скрипт работает уже давно, все устраивает:


;------------------------------------------------------
; add minimize Active window to Win+DownArrow or XButton1
#Down::
XButton1::
;...
;commands for minimize
;...
Return
;------------------------------------------------------
; add restore last minimized window to Win+UpArrow or XButton2
#Up::
XButton2::
;...
;commands for restore
;...
Return

;------------------------------------------------------
; add back/forward to LButton+XButton1/2
~LButton & ~XButton1::
~LButton & ~XButton2::
Return

Задача:
добавить в этот скрипт - в Excel при нажатии LButton+XB1/2 переключение листов (в экселе это Ctrl+PgDown/Up).
Попробовал так:


;------------------------------------------------------
; add change pages previous/next in active Excel to LButton+XButton1/2
#IfWinActive, ahk_class XLMAIN
LButton & XButton1::
Send, ^{PgUp}
;MsgBox, change to previous page
#IfWinActive
Return

#IfWinActive, ahk_class XLMAIN
LButton & XButton2::
Send, ^{PgDn}
;MsgBox, change to next page
#IfWinActive
Return

Не работает, сенды улетают куда-то мимо... если заменить сенд, для теста, на msgbox, то бокс срабатывает. Предполагаю что мешает конструкция ~LButton & ~XButton:: из основного скрипта, но как их подружить?

2

Re: AHK: hotkey для переключения листов в Excel

Да банально:

#IfWinActive, ahk_class XLMAIN
LButton & XButton1::Send, ^{PgUp}
LButton & XButton2::Send, ^{PgDn}
Return

Не понял, правда, зачем ещё ЛКМ держать при этом.
А для "без" можно, например, циклическую переключалку сделать. Создать пару макросов:

Sub PrevSheet()
  If ActiveSheet.Index = 1 Then _
  Worksheets(Worksheets.Count).Activate Else Worksheets(ActiveSheet.Index - 1).Activate
End Sub
Sub NextSheet()
  If Worksheets.Count = ActiveSheet.Index Then _
  Worksheets(1).Activate Else Worksheets(ActiveSheet.Index + 1).Activate
End Sub

, назначить на Ctrl+u/j и использовать:

#NoTrayIcon
#IfWinActive ahk_class XLMAIN
*$XButton1::^u
*$XButton2::^j

3

Re: AHK: hotkey для переключения листов в Excel

Flasher, к сожалению то, что банально, то не работает, о чем я и писал - так уже пробовал.

Flasher пишет:

Не понял, правда, зачем ещё ЛКМ держать при этом.

ЛКМ держать потому как, по просто XButton 1/2 в основном скрипте у меня уже работает свернуть/восстановить окна (возможно не логично, но так сложилось у меня исторически, а привычка наше все ).
И поэтому Вперед/Назад (например в браузере) у меня висит на ЛКМ+XButton1/2 и теперь вот хочу добавить на них же это переключение листов в экселе (тоже типа вперед,назад).
Если добавить еще клаву то да, работает, я уже пробовал раньше, но надо без нее)).

Не понятно почему в этом "банальном" коде сенды экселем не воспринимаются...

4

Re: AHK: hotkey для переключения листов в Excel

А так?

*$XButton1::^vk55
*$XButton2::^vk4A
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: Flasher, 2016-06-01 22:39:53)

Re: AHK: hotkey для переключения листов в Excel

dumper09 пишет:

так уже пробовал

У меня на 2013 мои варианты работают.

dumper09 пишет:

возможно не логично

Ну, да, несколько странно. Хотя ещё от мыши зависит, насколько удобно эти кнопки расположены.

dumper09 пишет:

Если добавить еще клаву то да, работает, я уже пробовал раньше, но надо без нее)).

В каком смысле "добавить ... клаву"?


serzh82saratov
Не тот скрипт. Это из моего мода. ))

6

Re: AHK: hotkey для переключения листов в Excel

serzh82saratov пишет:

А так?

Нет, тоже что предложил и Flasher, да и кнопки мыши не те - а дело, думаю, именно в них.

У меня на 2013 мои варианты работают.

Если взять только чистый "банальный" скрипт (ваш), то конечно работает и у меня. Но если вставить его в мой скрипт из 1го поста, там где используется:


; add back/forward to LButton+XButton1/2
~LButton & ~XButton1::
~LButton & ~XButton2::
Return

то не работает. Грешу на этот кусок скрипта. А этот код нужен как раз для Вперед/Назад, которая на лкм+xbutton. Может и можно его как-то заменить.
Что интересно, тот же "банальный" код в экселе срабатывает, если заменить (для теста) сенд на msgbox - окошко выскакивает.

В каком смысле "добавить ... клаву"?

Использовать... имел ввиду, что если не ЛКМ+XButton, а * это Ctrl+XButton или Shift+XButton, то работает тоже, но задача без клавы.

7

Re: AHK: hotkey для переключения листов в Excel

dumper09 пишет:

Но если вставить его в мой скрипт из 1го поста, там где используется:

В какой из? В первый? Так там вместо кода комментарии ;commands for. Весь код-то где?

dumper09 пишет:

а * это Ctrl+XButton или Shift+XButton, то работает тоже, но задача без клавы

А как это относится к моему предложению забиндить хоткеи на макросы с последующим переназначением их на мышь в AHK?

8

Re: AHK: hotkey для переключения листов в Excel

Flasher пишет:

В какой из? В первый? Так там вместо кода комментарии ;commands for. Весь код-то где?

Скрипт большой, весь думаю постить нет смысла, там много на управление с пульта ДУ и мультимедиа делал, поэтому выложу часть где идет обработка мышака. Во всяком случае этот кусок, в плане экселя, уже не работает))


Menu, Tray, Icon, Shell32.Dll, 209
Menu, Tray, Tip, -=| My_System.Ahk |=-`nконтроль хоткеев и ДУ

;------------------------------------------------------
; add minimize All windows (as system key Win+M) to Win+PageDown
#PgDn::#m

;------------------------------------------------------
; add unminimize All windows to Win+PageUp
#PgUp::WinMinimizeAllUndo

;------------------------------------------------------
; add minimize Active window to Win+DownArrow or XButton1
#Down::
XButton1::
WinGet, MinMaxID, ID, A
WinGetClass, MinMaxClass, A
If MinMaxClass = BaseWindow_RootWnd
  MinMaxClass = Winamp v1.x
If MinMaxClass = Afx:400000:0:10011:1900010:0
  MinMaxClass = Maxthon2_Frame
If MinMaxClass = PSDocC
  MinMaxClass = Photoshop
WinMinimize, ahk_class %MinMaxClass%
Return

;------------------------------------------------------
; add restore last minimized window to Win+UpArrow or XButton2
#Up::
XButton2::
If MinMaxClass = Winamp v1.x
  WinActivate, ahk_class %MinMaxClass%
If MinMaxClass = Maxthon2_Frame
  WinActivate, ahk_class %MinMaxClass%
If MinMaxClass = Photoshop
  WinActivate, ahk_class %MinMaxClass%
Else
  {
  WinRestore, ahk_id %MinMaxID%
  WinActivate, ahk_id %MinMaxID%
  }
Return

;------------------------------------------------------
; add back/forward to LButton+XButton1/2
~LButton & ~XButton1::
~LButton & ~XButton2::
Return

;------------------------------------------------------
; add zoom in/out in running Photoshop to LButton+WheelUp/Down
#IfWinActive, ahk_class Photoshop
LButton & WheelUp::
#IfWinActive, ahk_class PSDocC
LButton & WheelUp::
Send, {Click Up}
Send, ^{NumpadAdd}
#IfWinActive
Return

#IfWinActive, ahk_class Photoshop
LButton & WheelDown::
#IfWinActive, ahk_class PSDocC
LButton & WheelDown::
Send, {Click Up}
Send, ^{NumpadSub}
#IfWinActive
Return

;------------------------------------------------------
; add change pages previous/next in running Excel to Shift+XButton1/2
#IfWinActive, ahk_class XLMAIN
LButton & XButton1::
Send, ^{PgUp}
;MsgBox, test - change previous page in book
#IfWinActive
Return

#IfWinActive, ahk_class XLMAIN
LButton & XButton2::
Send, ^{PgDn}
;MsgBox, test - change next page in book
#IfWinActive
Return
Flasher пишет:

А как это относится к моему предложению забиндить хоткеи на макросы с последующим переназначением их на мышь в AHK?

Ну так в Вашем же примере обработки ЛКМ+ХБ все равно нету. * - модификатор, так? ЛКМ+ХБ не пляшет, а Стрл+ХБ или Шифт+ХБ срабатывает, поэтому и написал про клаву. Опять же как самостоятельный скрипт, не в составе моего, он работает. Если с моим - таже беда, что сенд посылать, что Ваш ^u/^j, не срабатывает.

9

Re: AHK: hotkey для переключения листов в Excel

dumper09
* - это не модификатор. См. мануал. ЛКМ+ХКМ там, да, не было, т.к. написано "без" ЛКМ. Но это поправимо.
Проблема тут не в Send-ах, а в использовании разносортицы сочетаний LButton/XButton1/XButton2.
Что в исходном виде, что так

~XButton1::SendPlay, {Ctrl DOWN}{PgDn}{Ctrl UP}
~XButton2::SendPlay, {Ctrl DOWN}{PgUp}{Ctrl UP}

, работать с учётом всех привязок не будет.
Я особо не ковырял, но предлагаю поупражняться на If GetKeyState("LButton", "P") в комбинациях.
Кстати, не очень ясно зачем писать?:

#IfWinActive, ahk_class Photoshop
LButton & WheelDown::

Грешу на этот кусок скрипта. А этот код нужен как раз для Вперед/Назад, которая на лкм+xbutton. Может и можно его как-то заменить.

Вот эту вещь не понял. Как это должно работать?

10 (изменено: dumper09, 2016-06-03 23:54:26)

Re: AHK: hotkey для переключения листов в Excel

Flasher пишет:

Кстати, не очень ясно зачем писать?:

Сейчас фотошопа под рукой нет - вроде как колесик не зумил, может фотошоп старый. Давно это было, сейчас уже и не помню)) Да не суть, этот кусок можно и выкинуть, но это делу не поможет.

Flasher пишет:

Вот эту вещь не понял. Как это должно работать?

Вы про ЛКМ+ХБ? Хороший вопрос, сам задумывался)) чтоб заменить. Решил повесить вперед\назад на эту комбинацию - после долгих тестов заработал этот скрипт. Не знаю... В драйвере мыши ничего не переназначал. По ХБ1/2 (вообще без AHK) выполняется по умолчанию вперед/назад. Скрипт работает на чистой системе (ну AHK только есть)). Кстати, вы его запускали? Он работает у вас (не считая экселя)? Не уверен, но думаю что по ~ AHK "пропускает" действие кнопки дальше в систему и при этих нажатых кнопках мышь выполняет действие по умолчания.

А что значит разносортица? Упростим скрипт, оставив только:


#Down::
XButton1::
WinGet, MinMaxID, ID, A
WinGetClass, MinMaxClass, A
WinMinimize, ahk_class %MinMaxClass%
Return

#Up::
XButton2::
WinRestore, ahk_id %MinMaxID%
WinActivate, ahk_id %MinMaxID%
Return

~LButton & ~XButton1::
~LButton & ~XButton2::
Return

#IfWinActive, ahk_class XLMAIN
LButton & XButton1::
Send, ^{PgUp}
;MsgBox, change to previous page!
#IfWinActive
Return

#IfWinActive, ahk_class XLMAIN
LButton & XButton2::
Send, ^{PgDn}
;MsgBox, change to next page!
#IfWinActive
Return

В экселе не срабатывает. Заменим сенд на msgbox - окошко есть, значит хоткей обрабатывается? Непонятно.

11

Re: AHK: hotkey для переключения листов в Excel

dumper09 пишет:

Кстати, вы его запускали? Он работает у вас (не считая экселя)?

XButton работают, но непоследовательно. После ряда переходов всё сводится к Рабочему столу, странная логика, отличная от стандарных Alt+Tab/Esc.

dumper09 пишет:

А что значит разносортица?

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

dumper09 пишет:

В экселе не срабатывает. Заменим сенд на msgbox - окошко есть, значит хоткей обрабатывается? Непонятно

Если закомментировать

~LButton & ~XButton1::
~LButton & ~XButton2::
Return

, то начинает работать. Я так и не понял, зачем эти строки. ~ нужно ставить в случае назначения, а не вхолостую.

12 (изменено: Alectric, 2016-06-05 11:20:12)

Re: AHK: hotkey для переключения листов в Excel


#IfWinActive, ahk_class XLMAIN

LButton & XButton1::
arr:=[]
try Xl := Excel_Get("A")
For sheet in xl.ActiveWorkbook.Worksheets
  arr.push(sheet.Name)
for i, e in arr
  if (e=Xl.Activesheet.name)
    s:=i, break
s++
if (s>arr.MaxIndex())
  s:=1
try Xl.Sheets(arr[s]).Select
ObjRelease(Xl)
return

LButton & XButton2::
arr:=[]
try Xl := Excel_Get("A")
For sheet in xl.ActiveWorkbook.Worksheets
  arr.push(sheet.Name)
for i, e in arr
  if (e=Xl.Activesheet.name)
    s:=i, break
s--
if (s<1)
  s:=arr.MaxIndex()
try Xl.Sheets(arr[s]).Select
ObjRelease(Xl)
return

#IfWinActive

Excel_Get(WinTitle="ahk_class XLMAIN", Excel7#=1) {
	WinGetClass, WinClass, %WinTitle%
	if (WinClass == "XLMAIN") {
		ControlGet, hwnd, hwnd, , Excel7%Excel7#%, %WinTitle%
    if Not ErrorLevel {
		window := Acc_ObjectFromWindow(hwnd, -16)
	if ComObjType(window) = 9
        while Not xl
			try xl := window.application
			catch e
		if SubStr(e.message,1,10) = "0x80010001"
			ControlSend, Excel7%Excel7#%, {Esc}, %WinTitle%
		else
			return "Error accessing the application object."
		}
	}
return xl
}

Требуется библиотека Acc.ahk.

Excel_Get().

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

13

Re: AHK: hotkey для переключения листов в Excel

Flasher пишет:

XButton работают, но непоследовательно. После ряда переходов всё сводится к Рабочему столу, странная логика, отличная от стандарных Alt+Tab/Esc.

Хм, причем тут алт+таб, переключение окон здесь вообще нет. Скрипт точно из поста #10? По ХБаттон1 любое стандартное окно должно свернуться на панель задач, а по ХБаттон2 восстановиться и стать активным. Тоже по клаве Win+стрелки вниз(вверх). При нажатии ЛКМ+ХБаттон1(2) в Проводнике (к примеру) должно работать Назад(Вперед). Это работает на разных компах и системах, еще с ХР.

Flasher пишет:

Если закомментировать ... ,  то начинает работать.

В экселе? Это да, но тогда пропадает возможность Вперед(Назад). Я изначально про это и писал.

Alectric пишет:

Требуется библиотека Acc.ahk.
Excel_Get().

Спасибо, попробывал. Действительно, срабатывания появились, но как-то непостоянно и редко(( Не уловил закономерность

14 (изменено: Alectric, 2016-06-05 14:59:20)

Re: AHK: hotkey для переключения листов в Excel

dumper09 пишет:

Не уловил закономерность

Виновата "LButton", попробуй использовать другую комбинацию. Изначально я проверял на "F1" "F2", т.к. нету "XButton".

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15

Re: AHK: hotkey для переключения листов в Excel

Alectric пишет:

Виновата "LButton", попробуй использовать другую комбинацию. Изначально я проверял на "F1" "F2", т.к. нету "XButton".

Если заменить например на RButton & XButton, то переключение листов срабатывает четко, но тогда сама ПКМ перестает работать в экселе. А если клаву использовать то сработает и обычный Send, ^{PgUp/PgDown}. Задача стоит без клавы обойтись. Может можно как-то изменить ваш код, чтоб LButton нормально работала?

16

Re: AHK: hotkey для переключения листов в Excel

Попробуй такой вариант:

#include,acc.ahk

#If GetKeyState("LButton","P") and WinActive("ahk_class XLMAIN")

XButton1::
send,{lbutton up}
arr:=[]
try Xl := Excel_Get("A")
For sheet in xl.ActiveWorkbook.Worksheets
  arr.push(sheet.Name)
for i, e in arr
  if (e=Xl.Activesheet.name)
    s:=i, break
s++
if (s>arr.MaxIndex())
  s:=1
try Xl.Sheets(arr[s]).Select
ObjRelease(Xl)
return

XButton2::
send,{lbutton up}
arr:=[]
try Xl := Excel_Get("A")
For sheet in xl.ActiveWorkbook.Worksheets
  arr.push(sheet.Name)
for i, e in arr
  if (e=Xl.Activesheet.name)
    s:=i, break
s--
if (s<1)
  s:=arr.MaxIndex()
try Xl.Sheets(arr[s]).Select
ObjRelease(Xl)
return

#IfWinActive

Excel_Get(WinTitle="ahk_class XLMAIN", Excel7#=1) {
	WinGetClass, WinClass, %WinTitle%
	if (WinClass == "XLMAIN") {
		ControlGet, hwnd, hwnd, , Excel7%Excel7#%, %WinTitle%
    if Not ErrorLevel {
		window := Acc_ObjectFromWindow(hwnd, -16)
	if ComObjType(window) = 9
        while Not xl
			try xl := window.application
			catch e
		if SubStr(e.message,1,10) = "0x80010001"
			ControlSend, Excel7%Excel7#%, {Esc}, %WinTitle%
		else
			return "Error accessing the application object."
		}
	}
return xl
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

17

Re: AHK: hotkey для переключения листов в Excel

Alectric пишет:

Попробуй такой вариант:

Так еще хуже - ни одного срабатывания.

18

Re: AHK: hotkey для переключения листов в Excel

Сначала нужно зажать левую кнопку, затем нажать Х-кнопку. Ты так действовал?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

19

Re: AHK: hotkey для переключения листов в Excel

Alectric кнопки вроде умею нажимать)) И вижу что в коде написано... Не фурычит. Вы учитываете что я тестирую ваш код в составе своего скрипта из поста #10? Ваш первый вариант из поста #12 изредка но срабатывал, а этот никак

20 (изменено: Malcev, 2016-06-06 21:38:55)

Re: AHK: hotkey для переключения листов в Excel

У вас проблема в том, что при зажатой левой кнопке мыши вы отправляете комбинацию клавиш экселу, которую он, при зажатой левой кнопке мыши, не воспринимает.
Можно так:

#IfWinActive, ahk_class XLMAIN
LButton & XButton1::
Send, {LButton Up}^{PgUp}
;MsgBox, change to previous page!
#IfWinActive
Return

21

Re: AHK: hotkey для переключения листов в Excel

Если бы оно было так, то как объяснить это?:

dumper09 пишет:

Если взять только чистый "банальный" скрипт (ваш), то конечно работает и у меня

22 (изменено: Malcev, 2016-06-06 23:14:41)

Re: AHK: hotkey для переключения листов в Excel

Возможно шорткаты к макросам эксел и при зажатой левой кнопке мыши воспринимает.
Я проверял код из 10 сообщения.

23

Re: AHK: hotkey для переключения листов в Excel

Речь про первый в моём посте (без макросов).

24

Re: AHK: hotkey для переключения листов в Excel

Ну тогда надо ждать автора.
У меня ваш не работает.

25

Re: AHK: hotkey для переключения листов в Excel

Malcev, да про лбаттон вы правы! Спасибо, ваш код работает стабильно. Наконец-то
Один нюанс - эксел ловит теперь и сам ЛКМ, т.е. после переключения листа выбирается ячейка, та над которой был курсор когда нажат этот хоткей. От этого можно как-то избавиться или только замена лбаттон на др.кнопку?

26 (изменено: Malcev, 2016-06-07 18:37:09)

Re: AHK: hotkey для переключения листов в Excel

А так?

#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
XButton1::
Send, {LButton Up}^{PgUp}
return
XButton2::
Send, {LButton Up}^{PgDn}
return
#If

27

Re: AHK: hotkey для переключения листов в Excel

Malcev пишет:

А так?

Увы, так вовсе не работает.

28 (изменено: Malcev, 2016-06-07 20:52:47)

Re: AHK: hotkey для переключения листов в Excel

Тогда не знаю.
Так как этот код у меня работает исправно на Win7+ excel 2016.
Предыдущий я тестировал на Win10+excel 2016.
Если вы его вставляете в 10 пост, то это надо убрать:

~LButton & ~XButton1::
~LButton & ~XButton2::
Return

То есть так:

#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
XButton1::
Send, {LButton Up}^{PgUp}
return
XButton2::
Send, {LButton Up}^{PgDn}
return
#If

#Down::
XButton1::
WinGet, MinMaxID, ID, A
WinGetClass, MinMaxClass, A
WinMinimize, ahk_class %MinMaxClass%
Return

#Up::
XButton2::
WinRestore, ahk_id %MinMaxID%
WinActivate, ahk_id %MinMaxID%
Return

У меня ячейка не выбирается.

29

Re: AHK: hotkey для переключения листов в Excel

Странно, даже без ~LButton & ~XButton1:: ... (листы конечно начали перелючаться), ячейка все равно выбирается. У меня правда Excel2010... Но, ведь тогда не работает Вперед\Назад.

Вообще вот этот код:


~LButton & ~XButton1::
~LButton & ~XButton2::
Return

в скрипте 10 можно заменить другим, чтобы работали Вперед\Назад (и не отвалились остальные хоткеи с экселем)?

30

Re: AHK: hotkey для переключения листов в Excel

#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
XButton1::
Send, {LButton Up}^{PgUp}
return
XButton2::
Send, {LButton Up}^{PgDn}
return
#If

XButton1::
if GetKeyState("LButton", "P")
   Send, {XButton1}
return
XButton2::
if GetKeyState("LButton", "P")
   Send, {XButton2}
return

31

Re: AHK: hotkey для переключения листов в Excel

Malcev так напрямую работать не будет - дублирование, т.к. на ХБаттоны уже ранее завязаны Minimize/Restore. Я к if... добавил else и собрал все в одну конструкцию. Так работает, спасибо за наводку.

Также спасибо всем форумчанам кто отозвался и помог с решением о переключении листов, Malcevу особенно.

Вопрос с невыбором ячейки по ЛКМ остался открытым. Буду что-то пробывать...

32 (изменено: Alectric, 2016-06-08 16:31:58)

Re: AHK: hotkey для переключения листов в Excel

Зажать XButton1 и водить мышкой влево\вправо - переключение листов; нажать XButton2 - свернуть окно, еще раз - развернуть.

#If WinActive("ahk_class XLMAIN")

XButton1::
mousegetpos,sx
while,GetKeyState("XButton1","P")
{
  sleep,100
  mousegetpos,x

  if (abs(sx-x)>a_screenwidth/8)
  {
    if (sx>x)
      Send,^{PgUp}
    else if (sx<x)
      send,^{PgDn}
    sx:=x
  }
;  tooltip,% sx "`t" x "`n" sy "`t" y
}
return

#If

#Up::
XButton2::
if trig:=!trig
{
  WinGet, MinMaxID, ID, A
  WinGetClass, MinMaxClass, A
  WinMinimize, ahk_class %MinMaxClass%
}
else
{
  WinRestore, ahk_id %MinMaxID%
  WinActivate, ahk_id %MinMaxID%
}
Return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

33

Re: AHK: hotkey для переключения листов в Excel

Alectric задумка интересная на жест мышки повесить, но ... не переключает так листы (тестировал конечно без своего скрипта, чисто ваш). Если заменить ХБ1 на ЛБ то переключает, прикольно. Но тогда ЛКМ конечно пропадает.

И еще: if trig:=!trig означает - если значение переменной trig противоположно предыдущему значению trig то... Так?

34 (изменено: Alectric, 2016-06-09 11:42:05)

Re: AHK: hotkey для переключения листов в Excel

Нашел старую мышь с этими кнопками - проверил всё работает. Был момент когда не работало, но потом вдруг заработало. Загадка какая-то... не работала именно команда "send".
Про "trig": сначала выполняется присвоение "trig:=!trig" (переменной присваивается инверсное значение, т.е. "true", т.к. до присвоения переменная равна "false"); затем проверяется условие "if" на "true/false". При втором нажатии значение переменной уже равно "true" и меняется на "false", "if" не выполняется по этому выполняется "else".

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

35

Re: AHK: hotkey для переключения листов в Excel

Вопрос с невыбором ячейки по ЛКМ остался открытым

А у вас ячейка в экселе что ли по отжатию левой кнопки мыши выделяется?
Можно еще так попробовать:

#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
SetWinDelay, -1
XButton1::
WinActivate, ahk_class Shell_TrayWnd
Send {LButton Up}
WinActivate, ahk_class ahk_class XLMAIN
Send ^{PgDn}
return
XButton2::
WinActivate, ahk_class Shell_TrayWnd
Send {LButton Up}
WinActivate, ahk_class ahk_class XLMAIN
Send ^{PgUp}
return
#If

36

Re: AHK: hotkey для переключения листов в Excel

Alectric пишет:

Нашел старую мышь с этими кнопками - проверил всё работает. Был момент когда не работало, но потом вдруг заработало. Загадка какая-то... не работала именно команда "send".

Не работает, по разному пробывал и ни разу, только если ХБ1 поменять.

Malcev пишет:

А у вас ячейка в экселе что ли по отжатию левой кнопки мыши выделяется?

Нет, как только нажал и держишь ЛБ, перед нажатием ХБ1, ячейка уже выбралась((. Если держать ЛБ а ХБ1 кликать, то листы меняются и ячейки конечно не выбираются, и как отпустишь ЛБ тоже не выбирается. Но вот на том, начальном листе, откуда начали менять, т.е. там где нажали ЛБ там ячейка изменилась.
И этот код тоже выбирает ячейку.

37

Re: AHK: hotkey для переключения листов в Excel

Можно так еще попробовать:

ComObjError(false)
#If WinActive("ahk_class XLMAIN")
LButton::
oExcel := ComObjActive("Excel.Application")
if (oExcel.Selection.address != "")
   Selection := oExcel.Selection.address
Send {LButton down}
first := 1
keyWait LButton
Send {LButton up}
return
#If

#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
XButton1::
Send, {LButton Up}
if (first = 1)
{
   oExcel.range(Selection).select()
   first = 0
}
Send, ^{PgUp}
return

XButton2::
Send, {LButton Up}
if (first = 1)
{
   oExcel.range(Selection).select()
   first = 0
}
Send, ^{PgDn}
return
#If

38

Re: AHK: hotkey для переключения листов в Excel

Malcev да, так уже лучше) А я думал в направлении запрета в экселе выделять ячейки на момент переключения, а потом разрешать... У вас я так понял момент ЛКМ перехватывается, запоминается адрес ячейки и дальше сендами делаем клик, а после ХБ восстанавливаем этот адрес и перекл.лист, да? А что за ComObjError(false) - откл.ошибки?

Вообщем работает, но не стабильно - во первых заметил, когда скрипт запущен и загрузить эксел, то нормал (перелючает листы и ячейку не выбирает), а если выйти и зайти снова в эксел, то выбирает, пока не перегрузить скрипт. Во вторых на строке oExcel.range(Selection).select() частенько выдает ошибку 0x80010001 - вызов отклонен или 0x800A03EC - Source, Description, HelpFile (null)

39 (изменено: Malcev, 2016-06-10 14:46:18)

Re: AHK: hotkey для переключения листов в Excel

А я думал в направлении запрета в экселе выделять ячейки на момент переключения, а потом разрешать

А как эксел поймет, что вы решили переключаться, а не выделить ячейуи?
А так?

ComObjError(false)
Global oExcel := ComObjActive("Excel.Application")
ComObjConnect(oExcel, new Workbook_Events)                      ; Connect to the workbooks's events
#If WinActive("ahk_class XLMAIN") and GetKeyState("LButton", "P")
~LButton::
first := 1
return

XButton1::
XButton2::
Send, {LButton Up}
if (first = 1)
{
   oExcel.range(Selection).select()
   first = 0
}
If (A_ThisHotkey = "XButton1")
   Send, ^{PgUp}
else
   Send, ^{PgDn}
return
#If


class Workbook_Events
{
    __Call(Event, Args*)
    {
        static EventList                         ; List of recent events that are not implemented
		if (IsFunc(this[Event]))           ; If there is a method defined for this event, call it
			this[Event].Call(Args)
		else                              ; Else display EventList and add this event to the list
        {
           if (event = "SheetActivate")
           {
              Global NewSelection := ""
              Global Selection := oExcel.Selection.address
           }
           if (event = "SheetSelectionChange")
           {
              if (NewSelection != "")
                 Global Selection := NewSelection
              Global NewSelection := oExcel.Selection.address
           }
        }
    }
    BeforeClose(Cancel, wkb)
    {
        ; Reference: 
        ; https://autohotkey.com/board/topic/69847-com-events-using-byref-parms/?p=442260
        OldValue := NumGet(ComObjValue(Cancel), 0, "Short")    ; Get "cancel" value. Bool=2 bytes
        NumPut(-1, ComObjValue(Cancel), "Short")                 ; Change value. -1 is True in VB
        NewValue := NumGet(ComObjValue(Cancel), 0, "Short")              ; Get new "cancel" value
        TrayTip, Blocked, % "Old value: " OldValue "`nNew value: " NewValue
    }
}

40

Re: AHK: hotkey для переключения листов в Excel

Malcev пишет:

А как эксел поймет, что вы решили переключаться, а не выделить ячейуи?

Так же как у вас - перехватить ЛКМ, потом симулировать.
Этот код ошибку не вызывает и переключается, но и ячейка выделяется всегда.

41 (изменено: Malcev, 2016-06-10 17:32:20)

Re: AHK: hotkey для переключения листов в Excel

Странно.
У меня на 2016 работает.
Надо проверять с помощью msgbox где затык.
Чему равен first после Send, {LButton Up}.
Чему равен Selection.
Отлавливаются ли события тут:

           if (event = "SheetActivate")
           {
              Global NewSelection := ""
              Global Selection := oExcel.Selection.address
           }
           if (event = "SheetSelectionChange")
           {
              if (NewSelection != "")
                 Global Selection := NewSelection
              Global NewSelection := oExcel.Selection.address
           }
        }

42

Re: AHK: hotkey для переключения листов в Excel

dumper09, Ваши смайлики поедают точки.
http://apachan.net/thumbs/201506/09/fwhr2om91zin.jpg
Верните точки в свои сообщения.