1 (изменено: iSerge, 2017-04-28 23:36:53)

Тема: AHK: if делает неверное сравнение...

...или у меня руки из ж.. помогите разобраться!

Доброго времени суток!
Предыстория для понимания:
есть доки excel, в них нужно выполнять определенные действия, пытаюсь эти действия автоматизировать.

http://s019.radikal.ru/i639/1704/b8/a64fc4631ba0.png

В колонке А содержится артикул штуковины под наименованием в колонке Б (артикулы - 7ми значные числа (2481, 2482 строки. те, что мелкие (2483-2509 - неведомые числа под'штуковин)).
Задача слудующая:
-в случае, если у штуковины нет под'штуковин - выделять ее красным цветом
-в случае, если у штуковины есть подштуковины - "растягивать"/копировать артикул (к. А) и наименование (к. Б) штуковины на под'штуковины.

Т.е. выглядеть в финале должно так:

http://s018.radikal.ru/i521/1704/ec/ba67acc4bb9f.png

Однако, на промежуточном этапе что то пошло не так.

http://s019.radikal.ru/i634/1704/71/ad1fbe945ffd.png

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

Если первый артикул как и надо, выделился красным, то следующий почему то посчитал, что 7161259 < 8


\::
Var3=____
nachalo:
var100=
var101=
nstroki=0
var55=0
Send, ^{vk43}
var100=%clipboard%
send, {down}
Send, ^{vk43}
var101=%clipboard%
start:
msgbox %var100% %var101%
IfInString, var101, %var3%												;; 1ое условие - проверка на "___" в след. строке колонки
	{
		if (nstroki=0)													;;1 Проверка на наличие под'штуковин
			{
			send, {up}
			send, {LShift down}
			send, {right}
			send, {LShift up}
			MouseClick, left, 280, 100
			goto next													;; goto next
			}
		else if (nstroki>0)												;;1 Проверка на наличие под'штуковин
			{
			send, {up}
			send, {up %nstroki%}
			send, {LShift down}
			send, {right}
			send, {LShift up}
			Send, ^{vk43}
			send, {LShift down}
			send, {down %nstroki%}
			send, {LShift up}
			Send, ^{vk56}
			goto next													;; goto next
			}
		else
			{
			msgbox if __ error
			return
			}
	}
else if (var100>var101)													;;2ое условие (наличие под'штуковины)
	{
	nstroki+=1
	send, {down}
	sleep 1
	Send, ^{vk43}
	var101=%clipboard%
	goto start
	}
else if (var100<var101)													;; 3е условие (следующий артикул)
	{
		if (nstroki=0)													;; if var100<var101 =0
			{
			send, {up}{LShift down}{right}{LShift up}
			MouseClick, left, 280, 100
			goto next													;; goto next
			}
		else if (nstroki>0)												;; if var100<var101 >0
			{
			send, {up}{up %nstroki%}{LShift down}{right}{LShift up}
			Send, ^{vk43}
			send, {LShift down}{down %nstroki%}{LShift up} 
			Send, ^{vk56}
			goto next													;; goto next
			}
		else
			{
			msgbox if var100<var101 error
			return
			}
	}

next:
msgbox next
return

В чем причина такого исхода?

P.S. Может есть идеи по оптимизации/ускорению выполненею скрипта?

2 (изменено: stealzy, 2017-04-28 21:52:59)

Re: AHK: if делает неверное сравнение...

Ммм, родные макросы excel не пробовали освоить?
Если ahk больше нравится, вот так можно оперировать через COM.

Ах да, исправьте заголовок на работу с excel. Если у вас что-то не работает, не надо спешить кидать тапком в язык.
С чего вы взяли, что у вас в переменных именно такие значения? Выведите себе MsgBox с переменными перед сравнением, а потом уже придирайтесь.
Или оставайтесь при своем мнении, но тогда зачем вам ahk? Ищите язык с нормальным If, удачи.

3 (изменено: iSerge, 2017-04-29 13:47:41)

Re: AHK: if делает неверное сравнение...

stealzy
Да мне ексель то по сути не нужен, по этому голову забивать не хочу.
Вот возникла такая задача, большого объема, решил автоматизировать. Ахк как то мне понятней и проще, но, увы, почему он решает что 7161259 < 8 мне не понятно.
+ В любом случае буду сидеть перед экраном и следить за происходящим т.к. есть определенные условия, которые проще и быстрей будет выполнить вручную, нежели внедрять это в скрипт, замедляя его работу дополнительными проверками.

4 (изменено: iSerge, 2017-04-29 13:47:20)

Re: AHK: if делает неверное сравнение...

stealzy
При чем тут эксель, дело в сравнении переменных ведь.
Вывел значения, на 7 проверяет - все ок, переходит на 8 и все, идет не по тому условию.

http://i013.radikal.ru/1704/4b/71cad8e4fcd1.png
http://s018.radikal.ru/i524/1704/46/6314aecc87fe.png

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

5 (изменено: stealzy, 2017-04-28 23:09:12)

Re: AHK: if делает неверное сравнение...

Отступы блоков кода сделать не помешало бы. Сейчас понять что к чему относиться невозможно.
Goto сильно ухудшает читаемость, лучше не использовать.
Sleep 1 - не нужен. Send {Up}{LShift down}{Right}{LShift up}.

6

Re: AHK: if делает неверное сравнение...

iSerge, отредактируйте свои сообщения и расставьте заглавные буквы и точки.

7 (изменено: stealzy, 2017-04-28 23:12:32)

Re: AHK: if делает неверное сравнение...

If (7161259 < 8)
	MsgBox If не работает!
Else
	MsgBox Ты подлый лгун! Разбирайся, где накосячил.

8 (изменено: iSerge, 2017-04-29 13:46:35)

Re: AHK: if делает неверное сравнение...

stealzy
Отступы сделал, подписал 3 этапа условий.
Без Goto не обойтись же в данном случае.
Без Sleep 1 не успевает все команды обработать, потому и Send'ов такая куча.

If (7161259 < 8)
	MsgBox If не работает!
Else
	MsgBox Ты подлый лгун! Разбирайся, где накосячил.

Так то оно так, если бы в условии было так, однако в коде следующее:


Вкратце
msgbox %var100% %var101% ;; - тут "7161259" и "8"
IfInString, var101, %var3% ;; 1ое условие, проверка на "____", не подходит
else if (var100>var101) ;; 2ое условие (если (7161259>8)), не подходит!!! <<<
else if (var100<var101) ;; 3е условие (если (7161259<8)), подходит!!! <<<

9 (изменено: stealzy, 2017-04-29 00:48:41)

Re: AHK: if делает неверное сравнение...

Без Sleep 1 не успевает

SetKeyDelay 30 попробуйте.

Без Goto не обойтись

Да ну? В редакторе замените все "goto next" на "MsgBox next".

var100:=7161259, var101:=8
msgbox % var100 " " var101 ; - тут "7161259" и "8"
IfInString, var101, ___ ; 1ое условие, проверка на "____", не подходит
	MsgBox ok
else if (var100>var101) ; 2ое условие (если (7161259>8)), не подходит!!! <<<
	MsgBox Опять врешь
else if (var100<var101) ; 3е условие (если (7161259<8)), подходит!!! <<<
	MsgBox Да?

Еще какие претензии к If остались?

Метки nachalo и start не нужны. На месте метки start делаете цикл, на месте goto start ставите continue.
Return из процедуры по горячей клавише / не обозначен.
Вообще ничего путного из такой работы с экселем через нажатия клавиш не выйдет.
Если "ексель не нужен" используйте ahk gui. Если нужен, используйте предназначенные для него средства.

10 (изменено: Alectric, 2017-04-29 09:53:24)

Re: AHK: if делает неверное сравнение...

В переменную ентер затисался.

var100:=7161259 "`n", var101:=8
msgbox % var100 " " var101 ; - тут "7161259" и "8"
IfInString, var101, ___ ; 1ое условие, проверка на "____", не подходит
	MsgBox ok
else if (var100>var101) ; 2ое условие (если (7161259>8)), не подходит!!! <<<
	MsgBox Опять врешь
else if (var100<var101) ; 3е условие (если (7161259<8)), подходит!!! <<<
	MsgBox Да?

Чисть переменные от ентеров перед сравнением.

stringreplace,var100,var100,`n,,all
stringreplace,var101,var101,`n,,all
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

11

Re: AHK: if делает неверное сравнение...

iSerge
Ознакомьтесь с правилами полностью. В частности:

Избегайте избыточного цитирования! Не цитируйте пост, на который отвечаете, целиком. Используйте цитирование только в том случае, если иначе не будет понятно, на что Вы отвечаете, и старайтесь выбирать только ключевые фразы.

Вместо полных цитат последних постов участников достаточно обращений по нику (см. в правый угол поста). Прошу принять во внимание и исправить в своих постах. Тем более не нужно цитировать модераторские обращения, достаточно выполнить просьбу.

12

Re: AHK: if делает неверное сравнение...

stealzy
Спасибо за знакомство с "SetKeyDelay"!
По поводу Goto next - там будет прокрутка до следующего артикула, в случае кучи строк с "___".
Хотя, после вашего сообщения, думаю затисать это в условие с "___".
Alectric
Спасибо! Проблема решилась по вашей наводке.
Только `n не помогало, заменил на `r`n.
Думал конечно, что может быть из-за ентеров, только до этого момента же все норм было.
Главное, проблема решена, еще раз спасибо за помощь!

13

Re: AHK: if делает неверное сравнение...

iSerge, а чем вам не понравилось предложение stealzy автоматизировать через COM?

14

Re: AHK: if делает неверное сравнение...

Malcev
Я, конечно, не знаю каким методом там происходит работа, но, помимо описанных мной требований к вносимым изменениям, имеются еще несколько условий, встречающихся крайне редко (внесение этих условий в скрипт - затормозит скорость выполнения. Проще ручками при визуальном обнаружении во время слежения за правильнотью хода и полнотой выполнения).
Поэтому я решил все таки остановиться на моем варианте, ввиду отсутствия необходимости в чем либо дополнительно разбираться, а так же его достаточности для моих нужд в конкретном варианте.

Если не сложно, можете вкратце описать, чем тот вариант будет лучше и принцип его работы? Он работает в фоне или так же, в активном окне? Спасибо.

15

Re: AHK: if делает неверное сравнение...

Ваш вариант менее надежный (зависит от нажатий клавиш) и более медленный (слипы).
А через апи библиотеку вы даёте команды напрямую приложению.

16

Re: AHK: if делает неверное сравнение...

Malcev
Понятно, спасибо.
Добавил в закладки, как-нибудь посижу, почитаю.

17

Re: AHK: if делает неверное сравнение...

Без goto:

SetKeyDelay 30
var100:="", var101:="", nstroki:=0, var55:=0

\::
	clipboard := ""
	Send ^{vk43}
	ClipWait 1
	var100 := clipboard, clipboard := ""
	Send {down}^{vk43}
	ClipWait 1
	var101 := clipboard

	Loop {
		Msgbox % var100 " " var101

		If InStr(var101, "____") {
			if (nstroki=0) {
				send {up}{LShift down}{right}{LShift up}
				MouseClick left, 280, 100
				MsgBox next
			}
			else if (nstroki>0) {
				send {up}{up %nstroki%}{LShift down}{right}{LShift up}^{vk43}{LShift down}{down %nstroki%}{LShift up}^{vk56}
				MsgBox next
			}
			else {
				msgbox if __ error
			}
		}
		else if (var100>var101) {
			nstroki+=1
			clipboard := ""
			send {down}^{vk43}
			ClipWait 1
			var101 := clipboard
			Continue
		}
		else if (var100<var101) {
			if (nstroki=0) {
				send {up}{LShift down}{right}{LShift up}
				MouseClick left, 280, 100
				MsgBox next
			}
			else if (nstroki>0)	{
				send {up}{up %nstroki%}{LShift down}{right}{LShift up}^{vk43}{LShift down}{down %nstroki%}{LShift up}^{vk56}
				MsgBox next
			}
			else {
				msgbox if var100<var101 error
			}
		}

		Break
	}
	Return

18

Re: AHK: if делает неверное сравнение...

stealzy
Благодарю!
Моя версия иногда сбоит, сейчас потестю вашу.

19

Re: AHK: if делает неверное сравнение...

stealzy
Доделал вариант с Loop, что бы автоматом переходил к следующим артикулам, однако, при одинаковых значениях SetKeyDelay 33, вариант с Goto показал себя более надежно (меньше сбоев, не тех действий).
Может, моя вина опять, в Loop не доразобрался? Хотя, при SetKeyDelay 60 Loop не сбоит, но 60 слишком медленно.

Loop


CoordMode, Mouse , Screen
SetKeyDelay 33

Numpad9::
	{
		Reload
		return
	}

\::

	Loop {
		var100:=""
		var101:=""
		nstroki:=0
		clipboard := ""
		Send ^{vk43}
		ClipWait 10
		StringReplace, clipboard, clipboard, `r`n,,All
		var100 := clipboard	;;, clipboard := ""
		Send {down}^{vk43}
		ClipWait 10
		StringReplace, clipboard, clipboard, `r`n,,All
		var101 := clipboard
	
		Loop {
			
			If InStr(var100, "_") {
				Loop {
					Send, ^{vk43}
					ClipWait 10
					StringReplace, clipboard, clipboard, `r`n,,All
					var101=%clipboard%
					If InStr(var101, "_") {
						send, {down}
						Continue
					}
					Else Break
				}
				Break
			}
			Else If InStr(var101, "_") {
				if (nstroki=0) {
					send {up}{LShift down}{right}{LShift up}
					MouseClick left, 280, 100
					Send, {down %nstroki%}{down}
					var100+=1				
				}
				else if (nstroki>0) {
					send {up}{up %nstroki%}{LShift down}{right}{LShift up}^{vk43}{LShift down}{down %nstroki%}{LShift up}^{vk56}{down %nstroki%}{down}
					var100+=1	
				}
				else {
					msgbox if __ error
				}
			}
			Else If (var100>var101) {
				nstroki+=1
				clipboard := ""
				send {down}^{vk43}
				ClipWait 10
				StringReplace, clipboard, clipboard, `r`n,,All
				var101 := clipboard
				Continue
			}
			else if (var100<var101) {
				if (nstroki=0) {
					send {up}{LShift down}{right}{LShift up}
					MouseClick left, 280, 100
					Send, {down %nstroki%}{down}
					var100+=1	
				}
				else if (nstroki>0)	{
					send {up}{up %nstroki%}{LShift down}{right}{LShift up}^{vk43}{LShift down}{down %nstroki%}{LShift up}^{vk56}
					Send, {down %nstroki%}{down}
					var100+=1	
				}
				else {
					msgbox if var100<var101 error
				}
			}
	
			Break
		}
		Continue
	}

Goto


CoordMode, Mouse , Screen
SetKeyDelay 33

Numpad9::
	{
		send, {LShift up}{Ctrl up}
		Reload
		return
	}

\::
nachalo:
var100=
var101=
nstroki=0
var55=0
Send, ^{vk43}
sleep 1
StringReplace, clipboard, clipboard, `r`n,,All
sleep 1
var100=%clipboard%
send, {down}
Send, ^{vk43}
sleep 1
StringReplace, clipboard, clipboard, `r`n,,All
sleep 1
var101=%clipboard%
start:
;;stringreplace, var100,var100,`n,,all
;;stringreplace, var101,var101,`n,,all
;;msgbox %var100% %var101%
IfInString, var101, _												;; if __
	{
		if (nstroki=0)													;; if __ =0
			{
			send, {up}{LShift down}{right}{LShift up}
			MouseClick, left, 280, 100
			MouseMove, 195, 637
			send, {down %nstroki%}{down}
			var100+=1
			goto next													;; goto next
			}
		else if (nstroki>0)												;; if __ >0
			{
			send, {up}{up %nstroki%}{LShift down}{right}{LShift up}
			Send, ^{vk43}
			send, {LShift down}{down %nstroki%}{LShift up}
			Send, ^{vk56}
			send, {down %nstroki%}{down}
			var100+=1
			goto next													;; goto next
			}
		else
			{
			msgbox if __ error
			return
			}
	}
else if (var100>var101)													;; if var100>var101
	{
	nstroki+=1
	send, {down}
	Send, ^{vk43}
	sleep 1
	StringReplace, clipboard, clipboard, `r`n,,All
	sleep 1
	var101=%clipboard%
	goto start
	}
else if (var100<var101)													;; if var100<var101
	{
		if (nstroki=0)													;; if var100<var101 =0
			{
			send, {up}{LShift down}{right}{LShift up}
			MouseClick, left, 280, 100
			MouseMove, 195, 637
			send, {down %nstroki%}{down}
			var100+=1
			goto next													;; goto next
			}
		else if (nstroki>0)												;; if var100<var101 >0
			{
			send, {up}{up %nstroki%}{LShift down}{right}{LShift up}
			Send, ^{vk43}
			send, {LShift down}{down %nstroki%}{LShift up} 
			Send, ^{vk56}
			send, {down %nstroki%}{down}
			var100+=1
			goto next													;; goto next
			}
		else
			{
			msgbox if var100<var101 error
			return
			}
	}

next:
Send, ^{vk43}
sleep 1
StringReplace, clipboard, clipboard, `r`n,,All
sleep 1
var101=%clipboard%
sleep 1
if (var100=var101)
	{
	goto nachalo
	}
else IfInString, var101, _
	{
	send, {down}
	goto next
	}
return

20

Re: AHK: if делает неверное сравнение...

stealzy
Ну, например, делает не то, что нужно (Goto тоже иногда то встанет, то сделает не то, что нужно. На параметре SetKeyDelay 33, но реже, чем это делает вариант с Loop. А на более высоких значениях (~60) оба нормально работают).
Просто интересно, это уже от того, что проц у меня не очень, а при наличии более быстрого проца и параметр у SetKeyDelay можно меньше ставить? (Или других комплектующих ПК) Или это "предельные скорости" самого ahk?

21 (изменено: Indomito, 2017-05-01 02:40:36)

Re: AHK: if делает неверное сравнение...

iSerge
Я извиняюсь, что вклиниваюсь в вашу милую беседу.
Может стоит использовать проверенные средства?
Например Microsoft Visual Studio Professional там есть ну скажем куча языков и готовые библиотеки, если денег жалко или не знаешь где скачать, то я могу дать Microsoft Visual Studio 2010 Express, она бесплатная и обрезанная, но всё делает + она проще.


Бесплатное ПО от Microsoft

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

22

Re: AHK: if делает неверное сравнение...

stealzy
Проблема то уже решена, остался вопрос только по скорости "автомата".
Т.е. это уже от экселя зависит, а не от железа/ahk? Я спрашиваю потому, что ожидается обновление железа в ближайшее время и интересует, стоит ли дождаться его, что бы все это быстрее сделалось или же ждать смысла нет ибо на скорость выполнения это не повлияет?
Indomito
За совет спасибо, почитаю что и для чего можно использовать.
Однако, в данном случае, уже готово решение, которое меня устраивает.

23

Re: AHK: if делает неверное сравнение...

stealzy
Понял, спасибо, тогда буду дожидаться железа.
За совет спасибо, уже раскидал SendMode до/после ^{vk43}.