1

Тема: AHK: Работа с Excel

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

F6::
ControlClick, EXCEL<1, A ; на выделенной ячейке взаимодействуем с контролом - строкой формул
Send ^+{left} ; выделяем нужную информацию (это кол-во позиций, без нее мы не будем знать,сколько строк нужно скопировать)
Send ^{vk43} ; копируем
amount :=Clipboard
amount -= 1 ; поскольку обычно выделение уже автоматически стоит на нужной позиции, выделять нам остается на 1 строку меньше - будет видно далее.
MsgBox, %amount% ; проверяем переменную
Send {esc} ; деактивируем контрол
Send {left 12} ; ищем следующую ячейку с нужными данными
ControlClick, EXCEL<1, A
Send {left 2} ; здесь лежит номер док-а, он нужен не весь
Send ^+{left}
Send ^{vk43}
Number :=Clipboard
MsgBox, %Number%
Send {esc}
IfExist, C:\Users\Максим\Desktop\Новая папка (8)\все\%Number%.docx ; здесь лежат все документы
   {
    Run, C:\Users\Максим\Desktop\Новая папка (8)\все\%Number%.docx
    WinActivate ahk_exe winword.exe
    Winwaitactive ahk_exe winword.exe
    Sleep, 3000 
    Send ^{vk46} ; через нажатие Ctrl+F ищем столбец, из которого первым делом будем копировать данные
    SendRaw № плавки
    Send {enter}
    Send {esc}
    Sleep, 200
    Send {down} ; из шапки таблицы спускаемся непосредственно к данным
    Sleep, 200
    Send +{down %amount%} ; эта переменная помогает нам скопировать именно столько строк,сколько нужно
    Sleep, 200
    Send ^{vk43}
    melting :=Clipboard
    MsgBox, Плавки %melting% ; каждая переменная проверяется, в готовой версии это уберется
    Send ^{down 3} ; путем перемещения курсора находим следующий столбец с нужными данными
    Send +{down %amount%}
    Sleep, 200
    Send ^{vk43}
    length :=Clipboard
    MsgBox, Длина %length%
    Send ^{down}
    Send +{down %amount%}
    Sleep, 200
    Send ^{vk43}
    weigth :=Clipboard
    MsgBox, Вес %weigth%
    WinActivate ahk_exe excel.exe
    Winwaitactive ahk_exe excel.exe
    Send {right 6}
    Sleep,200
    Send %melting% ; переменная почему то копируется не в исходном виде, а через строку,хотя до этого видна в правильном формате. так же, при ручном копировании из ворда в эксель,строки вставляются подряд.
    MsgBox, %amount% ; решил проверить переменную еще раз, т.к. следующая команда с ней не выполнялась
    Sleep,200
    Send {vk26 %amount%} ; когда копируешь несколько строк,при перемещении курсора на следующий столбец, он остается на уровне нижней строки.Команда должна поднимать курсор вновь на верхнюю строку. Здесь и далее она почему то не срабатывает
    Send {right 3}
    Sleep,200
    Send %length%
    Sleep,200
    Send {vk26 %amount%}
    Send {right}
    Sleep,200
    Send %weigth%
    }
return

Из-за двух проблем работа стоит на месте.
1) Переменные из ворда в эксель вставляются не в исходном виде,как строка-ниже-строка-ниже-строка, а как строка-пустая строка-строка-пустая строка-строка. При копи-пастинге в ручную этой проблемы нет.
2) Не срабатывает простейшая команда с переменной.
Кто нибудь знает как решить эти проблемы,или может быть, видит, где я ошибся?
Я прикрепил образец таблицы эксель. В начале показано как должно быть, далее -  как у меня получается.

Post's attachments

Таблица.xlsx 14.29 kb, 6 downloads since 2014-11-24 

You don't have the permssions to download the attachments of this post.

2

Re: AHK: Работа с Excel

Если все делать по-взрослому, то наверное правильнее через com.
http://www.autohotkey.com/board/topic/6 … for-excel/
Но непрограммисту там разобраться будет непросто.
Вижу 2 варианта - либо изучать, либо заказывать.
А то все эти ваши Send выглядят ненадежно.

3 (изменено: stealzy, 2014-11-24 14:31:08)

Re: AHK: Работа с Excel

1) Копируете вы ч\з ctrl+c а вставляете ч\з Send. Вы же вручную не вставляете ч\з Send? ctrl+v —

SendPlay ^{vk56}

Другой вариант - удалить лишние переносы и Send.

StringReplace,a,A_LoopField,`r,,all ; по совету ув. teadrinker заменил `n на `r
    r := r . a

Лишние переносы связаны с особенностью переноса каретки. В win это CR;LF, в мак CR, в лин LF. Хз почему, AHK считает что CR;LF это два переноса подряд.
UPD: только что разобрались:http://forum.script-coding.com/viewtopic.php?id=10138

2) Переменной там не место. Заключите это в цикл:

Send {vk26}

и пусть он пройдется %amount% раз.

+ offtop

Забавно, зачем люди скачивают вашу таблицу.
Просто из любопытства? Не качал=)

Win7x64 up to 2018, AutoHotkey 1.1.30.00

4 (изменено: Deluxe, 2014-11-24 16:33:56)

Re: AHK: Работа с Excel

Malcev пишет:

Если все делать по-взрослому, то наверное правильнее через com.

В том то и дело, что я пока на стадии личинки программиста.

Но непрограммисту там разобраться будет непросто.

Особенно, если он плохо знает английский язык...

stealzy пишет:

Другой вариант - удалить лишние переносы и Send.

Долго пытался понять, что же означают  a,A_LoopField , и почему именно так написаны. Справка мне в помощь.
На будущее `r -переносит курсор (каретку)в начало новой строки , `n - в начало текущей строки ?
Сделал так)


    Send ^{vk43}
    StringReplace,melting,clipboard,`r,,all 
    r := r . a
    MsgBox, Плавки %melting%
    Send ^{down 3}
    Send +{down %amount%}
    Sleep, 200
    Send ^{vk43}
    StringReplace,length,clipboard,`r,,all 
    r := r . a
    MsgBox, Длина %length%
    Send ^{down}
    Send +{down %amount%}
    Sleep, 200
    Send ^{vk43}
    StringReplace,weigth,clipboard,`r,,all 
    r := r . a
    MsgBox, Вес %weigth%

Возникло три вопроса.
Первый : после вставки переменной курсор не остается на последней строке, а смещается еще на 1 вниз. На самом деле,это не принципиально,решаемо добавлением нажатия Up...Но,может,для надежности,это решаемо как то при помощи все той же команды,StringReplace?
Второй : зачем нужна строка

r := r . a


Сначала делал без нее, прямо как в примере, в справке. Потом переделал, как предложено вами и, честно сказать, не понял, что поменялось...
И третий вопрос : чем мне заменить send? СontrolSetText не помог, при его использовании ничего не меняется (хотя в AU3_Spy изменения видны).

2) Переменной там не место. Заключите это в цикл:

Send {vk26}

и пусть он пройдется %amount% раз.

Но раньше ведь в  коде подобная команда прекрасно работала.
Сделал, как вы порекомендовали - все отлично работает!

Кстати, сейчас,пока писал это сообщение,решил проверить. Заменил

Loop %amount%
{
send {up}
}

на старый

Send {up %amount%}

Все работает. Не понимаю, почему раньше то не работало...

+ OFF

Забавно, зачем люди скачивают вашу таблицу.
Просто из любопытства? Не качал=)

ну а что, зря я её что ли прикреплял?

5 (изменено: Alectric, 2014-11-24 17:19:30)

Re: AHK: Работа с Excel

Deluxe пишет:
r := r . a

"r" и "a" это переменные с простым именем в виде одной буквы.
" . " - это Конкатенация.


stealzy пишет:

StringReplace,a,A_LoopField,`r,,all

Переменная "a" использована в этом выражении.

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

6

Re: AHK: Работа с Excel

"r" и "a" это переменные с простым именем в виде 1-й буквы.
" . " - это Конкатенация.

Окей.
Тогда, если нет переменной r в этом выражении, точнее,ей не присвоено значение ранее,значит она по умолчанию пуста?
Что дает объединение пустой переменной с другой переменной?
Вот если разбирать конкретный пример из моего кода

Send ^{vk43}
    StringReplace,melting,clipboard,`r,,all 
    r := r . melting

Что содержит теперь переменная r, где и зачем её теперь применять? При условии, что ранее в своем коде я ей не присваивал никаких значений...

7

Re: AHK: Работа с Excel

В "r" будет содержимое из "melting".

Я не знаю зачем stealzy записал это выражение...

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

8

Re: AHK: Работа с Excel

Alectric пишет:

В "r" будет содержимое из "melting".

Я не знаю зачем stealzy записал это выражение...

Спасибо!

А насчет этого я прав?

На будущее `r -переносит курсор (каретку)в начало новой строки , `n - в начало текущей строки ?

9 (изменено: stealzy, 2014-11-24 21:25:57)

Re: AHK: Работа с Excel

Я же писал по пунктам, кот. вы указали. У вас появились лишние переносы строки, так?

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

Я написал, что это особенность команды Send, и написал как от этого избавиться.
В переменной r находится то же, что и в melting, только без лишних переносов(пустых строк)
Мне надо было правильно обозвать переменные. Переименуем переменнную "r" в "melting_bez_lishnih_perenosov":

Loop, parse,melting,,`r
    melting_bez_lishnih_perenosov := melting_bez_lishnih_perenosov . A_LoopField 

SendRaw % melting_bez_lishnih_perenosov

Или так:



; melting_bez_lishnih_perenosov:=RegExReplace(melting, "\R", "`n")
SendRaw % RegExReplace(melting, "\R", "`n") ; взято у teadrinker

Или ctrl+v вместо Send.

Win7x64 up to 2018, AutoHotkey 1.1.30.00

10

Re: AHK: Работа с Excel

stealzy пишет:
Loop, parse,melting,,`r
    melting_bez_lishnih_perenosov := melting_bez_lishnih_perenosov . A_LoopField 

SendRaw % melting_bez_lishnih_perenosov

Работает некорректно. Копирует множество раз одну и ту же переменную столбцом. Поэтому мне пришлось сразу отмести этот вариант.

 melting_bez_lishnih_perenosov:=RegExReplace(melting, "\R", "`n")
SendRaw % RegExReplace(melting, "\R", "`n") ; взято у teadrinker

Работает аналогично тому,что я написал у себя в коде (читай,взял из примера в справке)

Send ^{vk43}
    StringReplace,melting,clipboard,`r,,all

У обоих вариантов есть одно НО. После копирования переменной (которая копируется именно так,как надо) курсор останавливается не на последней скопированной строке, а спускается на одну ниже (пустую).
Пришлось менять код в соответствии с этим нюансом.

Send %melting%
    Sleep,200
    Send {up}
    Send {up %amount%} ; 
    Send {right 3}

Добавил еще одну команду {up},чтобы компенсировать этот спуск на 1 строку.
Однако, когда я копирую в переменную данные с 1 позицией (одной строкой), при завершении копирования курсор не спускается ниже,а остается на этой строке.
Из-за этого все "сползает" вверх на 2 строки( я ведь копирую всего 3 переменных. Первая копируется как надо, следующая поднимается выше на 1 строку, третья еще на 1 строку).
Уже голову сломал, как исправить этот косяк в условиях цикла.
Может сделать условие, если %amount%=0 (ведь выше то мы вычитаем из этой переменной единицу) , то выполнить такие то условия. Только я не знаю таких команд для переменных.
И еще парочку дополнений, которые я хочу внести, но не знаю,как реализовать.
1) Некоторые данные вводятся в разных единицах измерения. Например, длина. Где то она указывается в метрах (12,53)
а где то в сантиметрах (1253). Мне нужно привести все данные к одному виду. Так,чтобы отображались в метрах,через запятую.И все это при условии, что в общем списке они вперемешку. Что нибудь типа "если число содержит "." или "," переходим к следующему числу. Если в нем нет "." или "," , то редактируем его следующим образом" -  например, таким

ControlClick, EXCEL<1, A
Send {left 2}
Send Raw ,
Send {enter}

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

2) И еще. Нужно сравнить две переменных, если они равны, то строка в экселе заливается зеленым цветом, если нет - красным.

Loop  {
sum := ; перед каждым повтором очищаем переменную
ControlClick, EXCEL<1, A
Send ^+{left}
send ^{vk43}
kol :=clipboard
MsgBox, %kol% ; кол-во строк,которые мы будем суммировать
Send {esc}
Send {left}
ControlClick, EXCEL<1, A
Send ^+{left}
send ^{vk43}
Send {esc}
summ :=clipboard ; это число, с которым мы будем сравнивать (по идее оно находится в другом документе, но к этому еще вернемся после)
MsgBox, %summ%
Send {left}
loop %kol%
{
ControlClick, EXCEL<1, A
Send ^+{left}
send ^{vk43}
num :=clipboard ; копируем первую строку
sum +=%num% ; суммируем с пустой переменной, это будет вторая переменная для сравнения
Send {esc}
Send {down}
}
; сравниваем переменные
; в зависимости от условий выбираем цвет заливки
ControlClick, X363 Y104, A
Send {up 3} ; зеленый

Send {up 3}
Send {left 4} ; красный
Send {enter}
}
Return

Как менять цвет, кроме как при помощи ControlClick,  в голову ничего не приходит, т.к. в экселе у этого контрола нет своего уникального ClassNN...

11

Re: AHK: Работа с Excel

Нет таких команд?
Может, кто нибудь все-таки знаком с подобными командами, и сможет скинуть ссылку на них...
Я был бы очень благодарен!

12

Re: AHK: Работа с Excel

Делайте через com.
Ссылка на англ. форум во втором посте.

13 (изменено: Deluxe, 2014-11-25 23:09:11)

Re: AHK: Работа с Excel

Malcev пишет:

Делайте через com.
Ссылка на англ. форум во втором посте.


Жаль, что я английский плохо знаю...
Неужели нет аналогов подобных команд в AHK "Если есть такой символ, то..", "Если эта переменная равна другой переменной,то...", "Если эта переменная равна этому (числу), то...","Если это число равно этому числу,то..." в русском переводе в справке? Все перекопал, но не смог найти. Мог и по неопытности пропустить нужные команды,приняв их за что то другое...
По-дурацки выходит, мне дают наводку, а у меня не хватает знаний,чтобы разобраться.
Или можно оправдаться незнанием иностранного языка?

14

Re: AHK: Работа с Excel

А на что же тогда переводчик от гугла?

15 (изменено: Alectric, 2014-12-08 18:19:30)

Re: AHK: Работа с Excel

Появилось свободное время.
Написал пример использования COM.
Читай комментарии:

f1::

; Взять заголовок активной вкладки (или самой программы, наверно верней будет) в Exel для дальнейшей работой с объектом
Xl := ComObjActive("Excel.Application")

;Xl.Visible := True ;by default excel sheets are invisible

; записать в клетку А1
Xl.Range("A1").Value := "hello world!" . a_Hour ":" a_min ;set cell 'A1' to a string
; про переменные начинающиеся с "A_" читай в справке

; считать из клеток А1 и A2
msgbox,% "A1=" Xl.Range("A1").Value "`nA2=" Xl.Range("A2").Value

; считывать 10 клеток поочереди
loop,10
  msgbox,% "A" A_Index "=" Xl.Range("A" . A_Index).Value

; чтоб было понятней расписал:
;loop,10
;{
;  var:=Xl.Range("A" . A_Index).Value
;  msgbox,% "A" A_Index "=" var
;}

clipboard=

; копировать колонку А в буфер обмена
Xl.Range("A:A").Copy ;copy cell to clipboard
sleep,100
msgbox,clipboard=`n%clipboard%
sleep,3000

; вставить в колонку В
Xl.Range("B:B").PasteSpecial(-4163) ;'-4163' is the constant for values only
Xl.CutCopyMode := false  ; это можно применять только после завершения копирования иначе ошибка
sleep,3000

; изменить формат колонки А
tooltip,изменить формат колонки А в текстовый
Xl.Range("A:A").NumberFormat := "@" ;change the column format to 'text'
sleep,3000

; режим "вырезать" вкл.? наверно используется перед функцией копирования чтобы снять выделение после него.
; не знаю что на самом деле делает
;Xl.CutCopyMode := False ;deselect cells (use this with copy)

; сохранить как
BookName=c:\test
tooltip,Сохранить как %BookName%
XL.ActiveWorkbook.SaveAs(BookName) ;'bookname' is a variable with the path and name of the file you desire
sleep,3000
tooltip

; открыть
;Xl_Workbook := Xl.Workbooks.Open(Path) ;handle to specific workbook


Xl.Range("A2").Value := "hello world!" ;set cell 'A1' to a string
; быстрое сохранение
Xl_Workbook.Save() ;quick save already existing file

; сортировать по колонке А
tooltip,сортировать по колонке А
Xl.Range("A1:Q100").Sort(Xl.Columns(1), 1) ;sort sheet by data in the 'a' column
sleep,3000

; сменить цвет колонки А на желтый
Xl.Range("A:A").Interior.Color := 0x00ffff ; BGR формат
; В2 на синий
Xl.Range("B2").Interior.Color := 0xff0000

tooltip,Пока все.`nЖми эскейп.

return

esc::
exitapp

Открой документ предварительно заполни разными данными первые 2-е колонки затем запусти скрипт и нажми F1.
Проверял на Exel2007.

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

16 (изменено: Deluxe, 2014-11-26 19:33:59)

Re: AHK: Работа с Excel

Malcev пишет:

А на что же тогда переводчик от гугла?

Он просто ужасно переводит. Теряется смысл большинства предложений.
Но самое плохое в том, что он коверкает примеры кодов. Где то может пробел перенести, где то вообще символ украсть...

Alectric пишет:

Появилось свободное время.
Написал пример использования COM.

Ты меня просто поражаешь! Спасибо большое)

Блин,надо же так, когда я уже совсем отчаялся, и начал ваять собственный код без комов , а точнее,уже почти закончил, мне ответили с готовыми примерами) Спасибо еще раз!

А я как раз заглянул задать вопрос про сравнение переменных.

F9::
Loop 1 
{
    sum :=
    ControlClick, EXCEL<1, A
    Send {left 2}
    Send ^+{left}
    Send ^{vk43} ; ищем и копируем номер док-а в котором лежит нужное нам значение
    Number :=Clipboard
    Send {esc}
    Sleep, 200
    IfExist, C:\Users\Максим\Desktop\Documents\%Number%.docx
    {
        Run, C:\Users\Максим\Desktop\Documents\%Number%.docx
        WinActivate ahk_exe winword.exe
        Winwaitactive ahk_exe winword.exe
        Sleep, 3000
        Send ^{vk46}
        Sleep, 200
        SendRaw Всего по сертификату
        Sleep, 200
        Send {enter}
        Send {esc}
        Sleep, 200
        Send ^{down 2}
        Send ^+{down}
        Sleep, 200
        Send ^{vk43} 
        summ :=clipboard ; находим,копируем и заносим в переменную нужное число (нецелое, с 3 знаками после точки)
        MsgBox, %summ%
        Sleep, 200
        Send !{vk73}
        WinActivate ahk_exe excel.exe
        Winwaitactive ahk_exe excel.exe
        Sleep, 600
        Send ^{right 2}
        ControlClick, EXCEL<1, A
        Send ^+{left}
        send ^{vk43}
        kol :=clipboard ; находим кол-во позиций (строк) которые нам нужно сложить
        MsgBox, %kol%
        Send {esc}
        Send {left 2}
        loop %kol%
        {
            ControlClick, EXCEL<1, A
            Send ^+{left}
            send ^{vk43}
            num :=clipboard ; выделяем и копируем по 1 строки для сложения
            sum +=%num% ; суммируем строки
            Send {esc}
            Send {down}
        }
        If sum = %summ% ; сравниваем данные из документа с результатами сложения из таблицы
        {
            MsgBox, %sum% равно %summ%
            Send {up}
            Send {right 2}
            Send +^{left 5}
            ControlClick, X363 Y104, A
            Send {up 3} ; зеленый
            Send {enter}
        }
        If sum != %summ%
        {
            MsgBox, %sum% не равно %summ%
            Send {up}
            Send {right 2}
            Send +^{left 5}
            ControlClick, X363 Y104, A
            Send {up 3} ;
            Send {left 4} ; красный
            Send {enter}
        }
        Send {down}
        Send {left 12}
    }
    IfNotExist, C:\Users\Максим\Desktop\Documents\%Number%.docx
    {
        Send {down}
    }
}
Return

Возникла неожиданная проблема с сравнением данных.
И в таблице, и в документе данные указаны как нецелые числа с 3 знаками после запятой.
При проверке одного документа MsgBox показал результат 51.76500(сложения данных из таблицы) равно 51.765 (данные из документа) . Все сходится, выделил строку зеленым цветом,все как надо.
На проверку следующей строки выдал такие результаты 50.612000 не равно 50.612 .
Я в недоумении, что послужило ошибкой, ведь числа одинаковые, а в примере выше сравнение точно так же идет между числом с 3 значащими цифрами после точки и 3 нулями в конце и аналогичным числом но без нулей...
Подскажите пожалуйста, из-за чего это произошло?

Через несколько минут
Я проверил еще несколько документов подобным образом. Везде числа совпадали, но выражение сравнения посчитало "неверными" несколько документов.

17 (изменено: Malcev, 2014-11-26 19:44:09)

Re: AHK: Работа с Excel

Если в чем-то сомневаетесь, то проверяйте простым примером.

a := "50.612000"
b := "50.612"
if (a = b) 
   msgbox

Видно причина в чем-то другом.

Он просто ужасно переводит. Теряется смысл большинства предложений.
Но самое плохое в том, что он коверкает примеры кодов. Где то может пробел перенести, где то вообще символ украсть...

http://forum.script-coding.com/viewtopic.php?id=4492

18 (изменено: Alectric, 2014-11-26 19:58:14)

Re: AHK: Работа с Excel

Возможно поможет прибавление к буферу 0, там где буферу присваивается именно число.

num :=clipboard + 0

...

Хотя врядли...

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

19

Re: AHK: Работа с Excel

Alectric пишет:

Возможно поможет прибавление к буферу 0, там где буферу присваивается именно число.

num :=clipboard + 0

...
Хотя врядли...

Прибавление нуля ничего не меняет.
Сегодня еще долго ковырялся - ответа так и не смог найти. Думал,что проблема может быть в переносах или лишних пробелах - нет, не в них...

Malcev пишет:

Если в чем-то сомневаетесь, то проверяйте простым примером.

a := "50.612000"
b := "50.612"
if (a = b) 
   msgbox

Видно причина в чем-то другом.

Проверял несколько раз, всегда равны результаты.
Читал описания, ничего на эту тему не написано.
Может,кто нибудь уже сталкивался с подобной проблемой?

20 (изменено: Alectric, 2014-12-08 09:13:33)

Re: AHK: Работа с Excel

Откуда именно берутся эти данные?
С текста ворда или из таблицы ворда?

Чтобы повторить ошибку у себя...

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

21 (изменено: Deluxe, 2014-12-08 11:37:11)

Re: AHK: Работа с Excel

Alectric пишет:

Откуда именно берутся эти данные?
С текста ворда или из таблицы ворда?

Чтобы повторить ошибку у себя...

Начну с самого начала. Есть табличка. Пустая. В неё данные копируются при помощи скрипта из вордовского документа, из таблицы. Часть вносятся вручную (т.к. не все документы есть в эл. виде) .
Затем, эта табличка проверяется. Есть вторая, проверочная таблица, и там стопроцентно правильные данные. Но в ней указывается уже общая масса. Мы оттуда копируем для сравнения число.
Потом идем в первую табличку, и суммируем данные. После сравниваем получившееся. Где то одинаковые цифры сравниваются нормально, где то оказывается,что они не равны. И это вне зависимости от того, каким методом прежде вносились данные в первую табличку, ручным или при помощи скрипта.

+ открыть спойлер

Решил добавить ради образца два стоблца из моей таблички. Один сравнивается, второй нет. Справа от столбцов указанны массы,с которыми сравниваю.
И скину кусок кода, которым проверяю.( На самом деле он выглядит несколько иначе,ведь работа идет с двумя файлами,да и таблички в них не целиком, а кусками, но суть от этого не меняется)

F10::
summ =
ControlClick, EXCEL<1, A   ; здесь выделение должно стоять на том числе, с которым будем сравнивать
Sleep, 100
Send ^+{left}
Sleep, 100
send ^{vk43}
StringReplace,Mass,clipboard,`,,.,all  ; в табличке все нецелые числа пишутся через запятую, а не точку (правило такое) . А при сложении после запятой знаки почему то не учитываются.
Send {esc}
Sleep, 100
Send {left}
loop 4    ; количество строк может быть разным, и тут стоит переменная. Для примера скинул два столбца с одинаковым кол-вом позиций.
{
ControlClick, EXCEL<1, A
Sleep, 100
Send ^+{left}
Sleep, 100
send ^{vk43}
StringReplace,num,clipboard,`,,.,all
summ +=%num%
Send {esc}
Send {down}
}
If summ = %Mass%
{
MsgBox %summ% РАВНО %Mass%
}
If summ != %Mass%
{
MsgBox %summ% НЕ РАВНО %Mass%
}
Return
Post's attachments

Пример.xlsx 7.69 kb, 3 downloads since 2014-12-08 

You don't have the permssions to download the attachments of this post.

22 (изменено: Alectric, 2014-12-08 13:46:58)

Re: AHK: Работа с Excel

Странно... если использовать COM результат точно такой же... Может дело в различии форматов ячеек...


f1::
; Взять заголовок активной вкладки (или самой программы, наверно верней будет) в Exel для дальнейшей работой с объектом
Xl := ComObjActive("Excel.Application")

; считать из клеток А1 и A2
;tooltip,% "A1=" Xl.Range("A1").Value "`nA2=" Xl.Range("A2").Value

mass:=Xl.ActiveCell.Value  ; берем значение выделенной ячейки

summ=
Send {left}
loop 4    ; количество строк может быть разным, и тут стоит переменная. Для примера скинул два столбца с одинаковым кол-вом позиций.
{
;  Sleep, 100
  num:=Xl.ActiveCell.Value
  StringReplace,num,num,`,,.,all
  summ +=num
  Send {down}
}
If summ = %Mass%
{
  MsgBox "%summ%" равно `n"%Mass%"
}
If summ != %Mass%
{
  MsgBox "%summ%" НЕ равно `n"%Mass%"
}

; сменить цвет колонки А на желтый
;Xl.Range("A:A").Interior.Color := 0x00ffff ; BGR формат
return

esc::
exitapp

...

Вот так работает, но не знаю будут ли ошибки при других условиях...
По тестируй.

f1::
; Взять заголовок активной вкладки (или самой программы, наверно верней будет) в Exel для дальнейшей работой с объектом
Xl := ComObjActive("Excel.Application")

; считать из клеток А1 и A2
;tooltip,% "A1=" Xl.Range("A1").Value "`nA2=" Xl.Range("A2").Value

mass:=Xl.ActiveCell.Value  ; берем значение выделенной ячейки

summ=
Send {left}
loop 4    ; количество строк может быть разным, и тут стоит переменная. Для примера скинул два столбца с одинаковым кол-вом позиций.
{
;  Sleep, 100
  num:=Xl.ActiveCell.Value
  StringReplace,num,num,`,,.,all
  summ +=num
  Send {down}
}
If summ contains %Mass%
  MsgBox "%summ%" равно `n"%Mass%"
else
  MsgBox "%summ%" НЕ равно `n"%Mass%"

; сменить цвет колонки А на желтый
;Xl.Range("A:A").Interior.Color := 0x00ffff ; BGR формат
return

esc::
exitapp
Win 10 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

23

Re: AHK: Работа с Excel

Возможно, дело в разном формате. Попробуй сравнивать не числа, а находить разницу между ними.
В примере ниже числа считаются равными, при точности до 8-го знака после запятой. Т.е. a=c, но a<>b

a := "50.612"
b := "50.6120001"
c := "50.61200001"
if EQU(a,b)
   msgbox a ~ b
if EQU(a,c)
   msgbox a ~ c
Return

EQU(a,b)
{
   Return % Abs(a - b) < 1.0e-7
}

24

Re: AHK: Работа с Excel

Дело оказалось не в формате ячеек, т.к. я об этом тоже думал, и специально приводил ячейки к одинаковому виду во всех вариантах.
На нужную мысль натолкнула фраза

Irbis пишет:

... при точности до 8-го знака после запятой ...

Хорошенько поковырялся в справочнике и мне повезло! Нашел,то,что нужно.

SetFormat, Float, 0.3

Всего то и нужно было убрать лишние нули. Я точно знаю, что у меня все данные пишутся с точностью не более 3х знаков после точки, а значит, остальные нули,образующиеся после сложения, совсем не нужны.
Почему то они как то влияли на результат сравнения...

Alectric , спасибо за помощь, но ты ведь знаешь, с COM я не дружу... Одно дело как то расковырять твой код и , возможно(ключевое слово) , понять его , но дело в том, что придется еще адаптировать под свой код, а там еще много разных команд... Во всяком случае, пока работа не позволяет тратить время на обучение COM и написание нового кода.
Кстати, и IfInString пробовал - не помогло. Это ведь аналог If contains , да?

И напоследок.

Irbis пишет:
a := "50.612"
b := "50.6120001"
c := "50.61200001"
if EQU(a,b)
   msgbox a ~ b
if EQU(a,c)
   msgbox a ~ c
Return

EQU(a,b)
{
   Return % Abs(a - b) < 1.0e-7
}

Наверно я совсем безнадежен, но понять, зачем тут 3 переменные, и почему у них последней цифрой стоит 1, а не 0 я не смог...
If EQU =  IfEqual/IfNotEqual ?

В любом случае, спасибо всем, кто помогал!

25 (изменено: Irbis, 2014-12-08 15:42:52)

Re: AHK: Работа с Excel

Deluxe пишет:

Наверно я совсем безнадежен, но понять, зачем тут 3 переменные, и почему у них последней цифрой стоит 1, а не 0 я не смог...

3 числа просто для примера - сравниваются сначала 1 и 2, потом 1 и 3. Первая пара не равна между собой с необходимой точностью (до 8-го знака), а вторая пара подходит под условие. Ноль или один на конце - абсолютно неважно, т.к. цифры на этих позициях и далее не берутся для сравнения.

If EQU =  IfEqual/IfNotEqual ?

Не совсем, это просто название для своей функции, хотя оно и происходит от слова equal. Вместо него вполне могло быть и MoyaFunkciyaDlyaSravneniyaChisel(), к примеру.

26

Re: AHK: Работа с Excel

Теперь понятно

27 (изменено: Alectric, 2014-12-08 16:24:23)

Re: AHK: Работа с Excel

Deluxe пишет:

с COM я не дружу

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

Все просто (читай комментарии):


Xl := ComObjActive("Excel.Application") ; ставиш это в начале - и зачем оно вообще нужно, да какая разница...
; такая запись в коде должна быть только одна

; и где угодно в коде применяешь это:
mass:=Xl.ActiveCell.Value  ; берем значение выделенной ячейки в переменную mass
; только перед этим кнопками навигации (вверх вниз и т.п.) выбираешь ячейку которую нужно взять.

;это полностью равноценно этому:
  ControlClick, EXCEL<1, A
  Sleep, 100
  Send ^+{left}
  Sleep, 100
  send ^{vk43}
  mass:=clipboard
; только работает быстрее и без лагов... наверно...

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

28

Re: AHK: Работа с Excel

Alectric пишет:

Да и не надо с этим дружить, просто бери непонятные тебе письмяна и используй в своем коде.
Все просто (читай комментарии):

Повеселили комментарии
Спасибо!)

+ Offtop

Вспомнил об одном твоем сообщении)

Alectric пишет:

А есть где-нибудь список команд, которые еще не переведены? Чтобы не переводить те для которых перевод уже есть.

http://www.autohotkey.com/board/topic/6 … for-excel/
Как насчет этого?

29 (изменено: Alectric, 2014-12-08 18:14:34)

Re: AHK: Работа с Excel

Deluxe пишет:

Вспомнил об одном твоем сообщении)

Ну так вот же вроде.

В непонятных командах обращай внимание на символы присвоения (":=" "="), это поможет тебе определить где именно переменная и из какого выражения она присваивается.

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

30 (изменено: Malcev, 2016-01-12 06:45:31)

Re: AHK: Работа с Excel

На проверку следующей строки выдал такие результаты 50.612000 не равно 50.612 .

Наверное, действительно, могут быть не равны.
Это получается баг?
Не работает:

a := 1.2 - 0.8
if (a = 0.4)
   msgbox 

Работает:

a := 1.2 - 0.7
if (a = 0.5)
   msgbox 

31

Re: AHK: Работа с Excel

Да, похоже на баг.
0.0 ... 0.4 сравнивает корректно. А 0.5 ... 0.9 обманывает.

32

Re: AHK: Работа с Excel

ypppu пишет:

0.0 ... 0.4 сравнивает корректно. А 0.5 ... 0.9 обманывает.

Это не так.

MsgBox, % (a := 1.1 - 0.6) . "`n" . (a = 0.500000)
MsgBox, % (a := 1.2 - 0.8) . "`n" . (a = 0.400000)

MsgBox, % (a := 1.2 - 0.7) . "`n" . (a = 0.500000)

Malcev, да, забавный баг, нужно в багрепорт написать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

33

Re: AHK: Работа с Excel

Написал.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

34

Re: AHK: Работа с Excel

Malcev опередил меня.

SetFormat, Float, 0.15
MsgBox, % (a := 1.1 - 0.6) . "`n" . (a = 0.500000)
MsgBox, % (a := 1.2 - 0.8) . "`n" . (a = 0.400000)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

35

Re: AHK: Работа с Excel

teadrinker пишет:

Это не так.

Здесь что-то интересное получается. Прошу объяснить на примерах:

+ 1
a := 0
Loop, 9
{
If a = 0.0
MsgBox %a%
If a = 0.1
MsgBox %a%
If a = 0.2
MsgBox %a%
If a = 0.3
MsgBox %a%
If a = 0.4
MsgBox %a%
If a = 0.5
MsgBox %a%
If a = 0.6
MsgBox %a%
If a = 0.7
MsgBox %a%
If a = 0.8
MsgBox %a%
If a = 0.9
MsgBox %a%

a := a + 0.1
}
+ 2
a = % 1.2 - 1.0
If a = 0.2
MsgBox %a%
a = % 1.2 - 0.9
If a = 0.3
MsgBox %a%
a = % 1.2 - 0.8
If a = 0.4
MsgBox %a%
a = % 1.2 - 0.7
If a = 0.5
MsgBox %a%
a = % 1.2 - 0.6
If a = 0.6
MsgBox %a%
a = % 1.2 - 0.5
If a = 0.7
MsgBox %a%
a = % 1.2 - 0.4
If a = 0.8
MsgBox %a%
a = % 1.2 - 0.3
If a = 0.9
MsgBox %a%
a = % 1.2 - 0.2
If a = 1.0
MsgBox %a%
a = % 1.2 - 0.1
If a = 1.1
MsgBox %a%

36

Re: AHK: Работа с Excel

ypppu пишет:

Прошу объяснить на примерах

А что именно? Там по ссылке вроде объяснили.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

37

Re: AHK: Работа с Excel

Хотел понять, почему в одних случаях условие оказывается истинным, а в других - ложным.
По ссылке

You need to define the number of decimal places or round the result.

Следует понимать, что перед любыми  операциями с числами с плавающей точкой обязательно воспользоваться командой SetFormat?

38

Re: AHK: Работа с Excel

ypppu пишет:

Хотел понять, почему в одних случаях условие оказывается истинным, а в других - ложным.

Когда результат выражения помещается в переменную, а в скрипте не используется SetFormat, Float, число не округляется, а просто отсекается хвост:

SetFormat, FloatFast, 0.16
MsgBox, % (a := 1.1 - 0.6) . "`n" . (a = 0.500000)
MsgBox, % (a := 1.2 - 0.8) . "`n" . (a = 0.400000)

MsgBox, % (a := 1.2 - 0.7) . "`n" . (a = 0.500000)
ypppu пишет:

Следует понимать, что перед любыми  операциями с числами с плавающей точкой обязательно воспользоваться командой SetFormat?

Для операций сравнения нужно пользоваться SetFormat, Float или округлением.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

39

Re: AHK: Работа с Excel

1.1 - 0.6 = 0.50000000000000011
А мужики-то и не знали!

40

Re: AHK: Работа с Excel

Во всяком случае, AHK здесь не при чём.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg