AutoitでEXCELの値を他のフォームに移し替える。

##どれで役立つか
・会社独自のソフトに値を入れ込む必要があるが、
　csvの読み込みができないので一つずつ打ち込んで入力している方に。

##はじめに
今回は自動化ツールのautoitを使って
Excelでまとめた値を他のフォームに移し替える作業についてまとめてみました。

csvで一気に取り込みができたら楽なのですが
その仕様がなく、EXCELの値をコピーし、独自ソフトに貼り付けのループというのは意外と多いです。

今回のコードは、EXCELの値をメモ帳にコピーしているだけですが
メモ帳を「フォームの特定の場所」に変更すれば応用できると思います。

##材料
・autoit
・[autoスパイツール](https://qiita.com/pophope/items/0cff94cd72df4a0069ab)

スパイツールは、フォームの特定の場所を取得をするためにを必要です。
以前の記事で使い方をまとめています。

##素材について
![pic1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/7f3df822-f912-0b17-9a76-71275dfdc0b9.jpeg)

今回は画像のように
顧客,品番,数量,価格をエクセルで入力してあるものとします。

##コード

```ruby:excel.au3
#include <Excel.au3> 
#include <include/UIAWrappers.au3>
AutoItSetOption("MustDeclareVars", 1)

dim $oExcel
dim $oWorkbook
dim $i
dim $customer,$hinban,$lot,$price
dim $start,$end

$start = InputBox("桁数について","はじめての行は")
$end = InputBox("桁数について","終わりの行は")

;メモ帳の特定場所をmemo.window.editという変数に格納
_UIA_setVar("memo.window.edit","title:=テキスト エディター;classname:=Edit")　
;============


; Excelを起動します
$oExcel = _Excel_Open()

; Excelで開くファイルを指定します(下記ではデスクトップ上のbook1.xlsxを開く想定)
$oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\Desktop\book1.xlsx")

For $i = #start To $end ;はじまりからおわりまでfor

    $customer = $oWorkbook.activesheet.cells($i,1).value ;　行i番目　列1番目の値を$customerとする。
    $hinban = $oWorkbook.activesheet.cells($i,2).value　　; 行i番目　列2番目の値を$hinbanとする。
    $lot = $oWorkbook.activesheet.cells($i,3).value
    $price = $oWorkbook.activesheet.cells($i,4).value

    _UIA_action("memo.window.edit","setfocus")
    _UIA_action("memo.window.edit","type",$customer) ;メモ帳に貼り付け
    _UIA_action("memo.window.edit","type",$hinban)
    _UIA_action("memo.window.edit","type",$lot)
    _UIA_action("memo.window.edit","type",$price)
    
Next
MsgBox(0,"お知らせ","おわったよ")
```

スパイツールを使ってUIAを使う場合は、
拡張機能の「UIAWrappers.au3」と「CUIAutomation2.au3」が必要です。
また型宣言も必要になるっぽいです。dimの所です。VBAみたい。

ファイル配置はこちらです。
スパイツールからコピペしてきた「UIAWrappers.au3」と「CUIAutomation2.au3」を
includeの中に入れておきます。
![pic2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376165/785d74aa-d210-9acc-154d-5b218d187ab6.jpeg)

##書き順について
この記事は、プログラミングがわからない人向けに書いています。
実際に私が書いた順番はこのような感じです。

```ruby:excel(ver0.1).au3
#include <Excel.au3> 

; Excelを起動します
$oExcel = _Excel_Open()

; Excelで開くファイルを指定します(下記ではデスクトップ上のbook1.xlsxを開く想定)
$oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\Desktop\book1.xlsx")

For $i = 1 To 2 ;はじまりからおわりまでfor

    $customer = $oWorkbook.activesheet.cells($i,1).value ;　行i番目　列1番目の値を$customerとする。
    MsgBox(0,"お知らせ","$customer")

Next

```

autoitでExcelを操作するときに
Excel.au3を読みこませます。
そこからエクセル開いて、どのファイルを開くか選択して、
行1行目、列1行目（A1）を取得してMsgboxで出力しました。


取得できる項目を増やして
はじまりの行とおわりの行をinputboxで聞き出して
あとで活用することに

```ruby:excel(ver0.5).au3
#include <Excel.au3>

$start = InputBox("桁数について","はじめての行は")
$end = InputBox("桁数について","終わりの行は")

; Excelを起動します
$oExcel = _Excel_Open()

; Excelで開くファイルを指定します(下記ではデスクトップ上のtest.xlsxを開く想定)
$oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\Desktop\book1.xlsx")

For $i = $start To $end
    $customer = $oWorkbook.activesheet.cells($i,1).value
    $hinban = $oWorkbook.activesheet.cells($i,2).value
    $lot = $oWorkbook.activesheet.cells($i,3).value
    $price = $oWorkbook.activesheet.cells($i,4).value
Next
MsgBox(0,"お知らせ","おわったよ")
```

スパイツールでメモ帳の「この項目はなんていう」を取得。
それを設定すると型宣言と必要みたいなので、今のようなコードになりました。

```ruby:excel.au3
#include <Excel.au3> 
#include <include/UIAWrappers.au3>
AutoItSetOption("MustDeclareVars", 1)

dim $oExcel
dim $oWorkbook
dim $i
dim $customer,$hinban,$lot,$price
dim $start,$end

$start = InputBox("桁数について","はじめての行は")
$end = InputBox("桁数について","終わりの行は")

;メモ帳の特定場所をmemo.window.editという変数に格納
_UIA_setVar("memo.window.edit","title:=テキスト エディター;classname:=Edit")　
;============


; Excelを起動します
$oExcel = _Excel_Open()

; Excelで開くファイルを指定します(下記ではデスクトップ上のbook1.xlsxを開く想定)
$oWorkbook = _Excel_BookOpen($oExcel, "C:\Users\Desktop\book1.xlsx")

For $i = #start To $end ;はじまりからおわりまでfor

    $customer = $oWorkbook.activesheet.cells($i,1).value ;　行i番目　列1番目の値を$customerとする。
    $hinban = $oWorkbook.activesheet.cells($i,2).value　　; 行i番目　列2番目の値を$hinbanとする。
    $lot = $oWorkbook.activesheet.cells($i,3).value
    $price = $oWorkbook.activesheet.cells($i,4).value

    _UIA_action("memo.window.edit","setfocus")
    _UIA_action("memo.window.edit","type",$customer) ;メモ帳に貼り付け
    _UIA_action("memo.window.edit","type",$hinban)
    _UIA_action("memo.window.edit","type",$lot)
    _UIA_action("memo.window.edit","type",$price)
    
Next
MsgBox(0,"お知らせ","おわったよ")
```

##おわりに
今回はメモ帳でしたが
会社独自のソフト（会計ソフト、売上計上ソフトなど）の「この部分」というのを取得して
今回のコード書き換えると出来上がると思います。

_UIA_actionでは
"type"（追記）ですが"setvalue"（上書き）でも動くと思います。


また私の会社では、実際に売上計上をプログラムで自動計上しています。

今回紹介した仕様に追加して
在庫がない場合にフォームからエラーが出た時の処理も記載しています。

・品番を入れたら、「在庫がないエラー」が出ていないか検知
・その分は計上しない。
・エクセルのその行の所に「在庫なし」と記載
・次の計上スタート

パソコンでパチパチ打つだけ作業は自動化して
考える仕事に注力しています。