<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: hotkey для переключения листов в Excel]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11655&amp;type=atom" />
	<updated>2016-06-10T15:32:04Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11655</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105087#p105087" />
			<content type="html"><![CDATA[<p><span style="color: green"><strong>dumper09</strong>, Ваши смайлики поедают точки.<br /><span class="postimg"><img src="http://apachan.net/thumbs/201506/09/fwhr2om91zin.jpg" alt="http://apachan.net/thumbs/201506/09/fwhr2om91zin.jpg" /></span><br />Верните точки в свои сообщения.</span></p>]]></content>
			<author>
				<name><![CDATA[ypppu]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5974</uri>
			</author>
			<updated>2016-06-10T15:32:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105087#p105087</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105075#p105075" />
			<content type="html"><![CDATA[<p>Странно.<br />У меня на 2016 работает.<br />Надо проверять с помощью msgbox где затык.<br />Чему равен first после Send, {LButton Up}.<br />Чему равен Selection.<br />Отлавливаются ли события тут:<br /></p><div class="codebox"><pre><code>           if (event = &quot;SheetActivate&quot;)
           {
              Global NewSelection := &quot;&quot;
              Global Selection := oExcel.Selection.address
           }
           if (event = &quot;SheetSelectionChange&quot;)
           {
              if (NewSelection != &quot;&quot;)
                 Global Selection := NewSelection
              Global NewSelection := oExcel.Selection.address
           }
        }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-10T13:32:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105075#p105075</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105071#p105071" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>А как эксел поймет, что вы решили переключаться, а не выделить ячейуи?</p></blockquote></div><p>Так же как у вас - перехватить ЛКМ, потом симулировать. <br />Этот код ошибку не вызывает и переключается, но и ячейка выделяется всегда.</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-10T13:14:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105071#p105071</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105065#p105065" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>А я думал в направлении запрета в экселе выделять ячейки на момент переключения, а потом разрешать</p></blockquote></div><p>А как эксел поймет, что вы решили переключаться, а не выделить ячейуи?<br />А так?<br /></p><div class="codebox"><pre><code>ComObjError(false)
Global oExcel := ComObjActive(&quot;Excel.Application&quot;)
ComObjConnect(oExcel, new Workbook_Events)                      ; Connect to the workbooks&#039;s events
#If WinActive(&quot;ahk_class XLMAIN&quot;) and GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
~LButton::
first := 1
return

XButton1::
XButton2::
Send, {LButton Up}
if (first = 1)
{
   oExcel.range(Selection).select()
   first = 0
}
If (A_ThisHotkey = &quot;XButton1&quot;)
   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 = &quot;SheetActivate&quot;)
           {
              Global NewSelection := &quot;&quot;
              Global Selection := oExcel.Selection.address
           }
           if (event = &quot;SheetSelectionChange&quot;)
           {
              if (NewSelection != &quot;&quot;)
                 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, &quot;Short&quot;)    ; Get &quot;cancel&quot; value. Bool=2 bytes
        NumPut(-1, ComObjValue(Cancel), &quot;Short&quot;)                 ; Change value. -1 is True in VB
        NewValue := NumGet(ComObjValue(Cancel), 0, &quot;Short&quot;)              ; Get new &quot;cancel&quot; value
        TrayTip, Blocked, % &quot;Old value: &quot; OldValue &quot;`nNew value: &quot; NewValue
    }
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-10T10:36:30Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105065#p105065</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105063#p105063" />
			<content type="html"><![CDATA[<p><strong>Malcev</strong> да, так уже лучше) А я думал в направлении запрета в экселе выделять ячейки на момент переключения, а потом разрешать... У вас я так понял момент ЛКМ перехватывается, запоминается адрес ячейки и дальше сендами делаем клик, а после ХБ восстанавливаем этот адрес и перекл.лист, да? А что за ComObjError(false) - откл.ошибки?</p><p>Вообщем работает, но не стабильно - во первых заметил, когда скрипт запущен и загрузить эксел, то нормал (перелючает листы и ячейку не выбирает), а если выйти и зайти снова в эксел, то выбирает, пока не перегрузить скрипт. Во вторых на строке <strong>oExcel.range(Selection).select()</strong> частенько выдает ошибку 0x80010001 - вызов отклонен или 0x800A03EC - Source, Description, HelpFile (null)</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-10T10:23:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105063#p105063</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105061#p105061" />
			<content type="html"><![CDATA[<p>Можно так еще попробовать:<br /></p><div class="codebox"><pre><code>ComObjError(false)
#If WinActive(&quot;ahk_class XLMAIN&quot;)
LButton::
oExcel := ComObjActive(&quot;Excel.Application&quot;)
if (oExcel.Selection.address != &quot;&quot;)
   Selection := oExcel.Selection.address
Send {LButton down}
first := 1
keyWait LButton
Send {LButton up}
return
#If

#If WinActive(&quot;ahk_class XLMAIN&quot;) and GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
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</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-10T07:00:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105061#p105061</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105053#p105053" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Alectric пишет:</cite><blockquote><p>Нашел старую мышь с этими кнопками - проверил всё работает. Был момент когда не работало, но потом вдруг заработало. Загадка какая-то... не работала именно команда &quot;send&quot;.</p></blockquote></div><p>Не работает, по разному пробывал и ни разу, только если ХБ1 поменять.</p><div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p>А у вас ячейка в экселе что ли по отжатию левой кнопки мыши выделяется?</p></blockquote></div><p>Нет, как только нажал и держишь ЛБ, перед нажатием ХБ1, ячейка уже выбралась((. Если держать ЛБ а ХБ1 кликать, то листы меняются и ячейки конечно не выбираются, и как отпустишь ЛБ тоже не выбирается. Но вот на том, начальном листе, откуда начали менять, т.е. там где нажали ЛБ там ячейка изменилась.<br />И этот код тоже выбирает ячейку.</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-09T21:47:08Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105053#p105053</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105021#p105021" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Вопрос с невыбором ячейки по ЛКМ остался открытым</p></blockquote></div><p>А у вас ячейка в экселе что ли по отжатию левой кнопки мыши выделяется?<br />Можно еще так попробовать:<br /></p><div class="codebox"><pre><code>#If WinActive(&quot;ahk_class XLMAIN&quot;) and GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
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</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-09T13:19:22Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105021#p105021</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=105011#p105011" />
			<content type="html"><![CDATA[<p>Нашел старую мышь с этими кнопками - проверил всё работает. Был момент когда не работало, но потом вдруг заработало. Загадка какая-то... не работала именно команда &quot;send&quot;.<br />Про &quot;trig&quot;: сначала выполняется присвоение &quot;trig:=!trig&quot; (переменной присваивается инверсное значение, т.е. &quot;true&quot;, т.к. до присвоения переменная равна &quot;false&quot;); затем проверяется условие &quot;if&quot; на &quot;true/false&quot;. При втором нажатии значение переменной уже равно &quot;true&quot; и меняется на &quot;false&quot;, &quot;if&quot; не выполняется по этому выполняется &quot;else&quot;.</p>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2016-06-09T07:33:36Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=105011#p105011</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104987#p104987" />
			<content type="html"><![CDATA[<p><strong>Alectric</strong> задумка интересная на жест мышки повесить, но ... не переключает так листы (тестировал конечно без своего скрипта, чисто ваш). Если заменить ХБ1 на ЛБ то переключает, прикольно. Но тогда ЛКМ конечно пропадает.</p><p>И еще: <strong>if trig:=!trig</strong> означает - если значение переменной trig противоположно предыдущему значению trig то... Так?</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-08T18:31:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104987#p104987</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104942#p104942" />
			<content type="html"><![CDATA[<p>Зажать XButton1 и водить мышкой влево\вправо - переключение листов; нажать XButton2 - свернуть окно, еще раз - развернуть.</p><div class="codebox"><pre><code>#If WinActive(&quot;ahk_class XLMAIN&quot;)

XButton1::
mousegetpos,sx
while,GetKeyState(&quot;XButton1&quot;,&quot;P&quot;)
{
  sleep,100
  mousegetpos,x

  if (abs(sx-x)&gt;a_screenwidth/8)
  {
    if (sx&gt;x)
      Send,^{PgUp}
    else if (sx&lt;x)
      send,^{PgDn}
    sx:=x
  }
;  tooltip,% sx &quot;`t&quot; x &quot;`n&quot; sy &quot;`t&quot; 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
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Alectric]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26027</uri>
			</author>
			<updated>2016-06-08T12:28:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104942#p104942</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104935#p104935" />
			<content type="html"><![CDATA[<p><strong>Malcev</strong> так напрямую работать не будет - дублирование, т.к. на ХБаттоны уже ранее завязаны Minimize/Restore. Я к if... добавил else и собрал все в одну конструкцию. Так работает, спасибо за наводку.</p><p>Также спасибо всем форумчанам кто отозвался и помог с решением о переключении листов, <strong>Malcev</strong>у особенно.</p><p>Вопрос с невыбором ячейки по ЛКМ остался открытым. Буду что-то пробывать...</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-08T10:50:16Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104935#p104935</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104917#p104917" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>#If WinActive(&quot;ahk_class XLMAIN&quot;) and GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
XButton1::
Send, {LButton Up}^{PgUp}
return
XButton2::
Send, {LButton Up}^{PgDn}
return
#If

XButton1::
if GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
   Send, {XButton1}
return
XButton2::
if GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
   Send, {XButton2}
return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-07T20:39:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104917#p104917</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104899#p104899" />
			<content type="html"><![CDATA[<p>Странно, даже без ~LButton &amp; ~XButton1:: ... (листы конечно начали перелючаться), ячейка все равно выбирается. У меня правда Excel2010... Но, ведь тогда не работает Вперед\Назад. </p><p>Вообще вот этот код:<br /></p><div class="codebox"><pre><code>
~LButton &amp; ~XButton1::
~LButton &amp; ~XButton2::
Return
</code></pre></div><p>в скрипте 10 можно заменить другим, чтобы работали Вперед\Назад (и не отвалились остальные хоткеи с экселем)?</p>]]></content>
			<author>
				<name><![CDATA[dumper09]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=33931</uri>
			</author>
			<updated>2016-06-07T19:27:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104899#p104899</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: hotkey для переключения листов в Excel]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=104888#p104888" />
			<content type="html"><![CDATA[<p>Тогда не знаю.<br />Так как этот код у меня работает исправно на Win7+ excel 2016.<br />Предыдущий я тестировал на Win10+excel 2016.<br />Если вы его вставляете в 10 пост, то это надо убрать:<br /></p><div class="codebox"><pre><code>~LButton &amp; ~XButton1::
~LButton &amp; ~XButton2::
Return</code></pre></div><p>То есть так:<br /></p><div class="codebox"><pre><code>#If WinActive(&quot;ahk_class XLMAIN&quot;) and GetKeyState(&quot;LButton&quot;, &quot;P&quot;)
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</code></pre></div><p>У меня ячейка не выбирается.</p>]]></content>
			<author>
				<name><![CDATA[Malcev]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26930</uri>
			</author>
			<updated>2016-06-07T16:38:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=104888#p104888</id>
		</entry>
</feed>
