ExcelのデータをIEでWEBページに連続して転記するためのVBAスクリプト

#やりたいこと
- ExcelのデータをWEBページに転記して登録したい。
    - 複数行のデータは連続して投入できるようにしたい。
- VBAの練習（初めて書きました）
    - 本当はGoogle Spreadsheetでやりたかったけれど、実現方法が見つけられず。


#完成したコード
```vb
'Microsoft Internet Controlsが必要なので、ツール->参照設定->Microsoft Internet Controlsにチェックを入れて「OK」

Sub OpenIEAndSetValue()
    Dim IE As Object
    Dim LastRow, i As Integer

    Set IE = New InternetExplorerMedium
    Set idSheet = ThisWorkbook.Worksheets("ID") 'このシートにID/PWが書いてある。
    Set dataSheet = ThisWorkbook.Worksheets("Data") 'このシートに元データがある。
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を取得
    
    'URLを開く。
    With IE
      .Visible = True
      .navigate "（ここにURLを入れる。）"
    End With
    
    '表示されるまで待機
    Do While IE.Busy Or IE.readyState <> 4
    DoEvents
    Loop
    
    'ログイン
    Set objecElement = IE.Document
    With objectElement
                      
        .GetElementById("loginId").Value = idSheet.Cells(1, 2)
        .GetElementById("password").Value = idSheet.Cells(2, 2)
        .GetElementById("btn_login").Click
      
      '2行目から最終行まで繰り返し。
      '1行目はヘッダー行のため、i=2始まり。  
      For i = 2 To LastRow
         
          .GetElementById("ColumnAValue").Value = dataSheet.Cells(i, 1) 'カラムA（1列目）のデータをセット
          .GetElementById("ColumnBValue").Value = dataSheet.Cells(i, 2) 'カラムB（2列目）のデータをセット

          .GetElementById("btn_ok").Click 'OKボタンを押す

      Next

    End With
    
End Sub
```
※本来は各画面遷移時に描画待ちの処理を入れる必要がありますが、煩雑になるため省略しています。

#コードの説明
```vb
'Microsoft Internet Controlsが必要なので、ツール->参照設定->Microsoft Internet Controlsにチェックを入れて「OK」

Sub OpenIEAndSetValue()
    Dim IE As Object
    Dim LastRow, i As Integer

    Set IE = New InternetExplorerMedium
```
今回のケースでは、転記先のWEBサイトが社内のイントラネットに存在しているので、IEを`InternetExplorerMedium`で立ち上げる。
詳しくは拙記事をご参照ください。

- [Excel VBAでIE操作時にオートメーションエラーが出た時は、対象のURLが「信頼済みサイト」に登録されているからかもしれない。 - Qiita](https://qiita.com/3mc/items/da045e86d25ef697ec43)


```vb
    Set idSheet = ThisWorkbook.Worksheets("ID") 'このシートにID/PWが書いてある。
    Set dataSheet = ThisWorkbook.Worksheets("Data") 'このシートに元データがある。
```

ログインが必要なサイトなので、Excelのシート「ID」にログイン情報を記載しておく。
転記元のデータはシート「Data」に記入する。

```vb
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を取得
```
最終行まで繰り返しの処理をするので、行数を取得しておく。

- [最終行の取得（End,Rows.Count）｜VBA入門](https://excel-ubara.com/excelvba1/EXCELVBA318.html)


```vb
    'URLを開く。
    With IE
      .Visible = True
      .navigate "（ここにURLを入れる。）"
    End With
    
    '表示されるまで待機
    Do While IE.Busy Or IE.readyState <> 4
    DoEvents
    Loop
```

IEでページを開く場合にお決まりの呪文のようです。

```vb
    'ログイン
    Set objecElement = IE.Document
    With objectElement
                      
        .GetElementById("loginId").Value = idSheet.Cells(1, 2)
        .GetElementById("password").Value = idSheet.Cells(2, 2)
        .GetElementById("btn_login").Click
```
`loginId`というID属性を持っている要素（テキストボックス）に、シート「ID」（`idSheet`）のA2セルの値（`Cells(1, 2)`）をセットする。
同様に、`password`というID属性を持っている要素には、B2セルの値（`Cells(2, 2)`）をセットする。
そして、`btn_login`という要素（ボタン）をクリックしてログイン。

```vb

      '2行目から最終行まで繰り返し。
      '1行目はヘッダー行のため、i=2始まり。  
      For i = 2 To LastRow
         
          .GetElementById("ColumnAValue").Value = dataSheet.Cells(i, 1) 'カラムA（1列目）のデータをセット
          .GetElementById("ColumnBValue").Value = dataSheet.Cells(i, 2) 'カラムB（2列目）のデータをセット

          .GetElementById("btn_ok").Click 'OKボタンを押す

      Next

    End With
    
End Sub
```
Excelの1行目はヘッダー行なので、`i = 2`から始まって、`LastRow`まで繰り返しの処理をする。

#参考URL
- [最終行の取得（End,Rows.Count）｜VBA入門](https://excel-ubara.com/excelvba1/EXCELVBA318.html)
- [Excel VBA automatic fill and submit web forms from excel data](https://www.mrexcel.com/forum/excel-questions/915165-excel-vba-automatic-fill-submit-web-forms-excel-data.html)