前投稿した以下2つの記事の内容をミックスさせました。
Excelでパスワードを「*」で表示させる
ExcelVBAでIEからユーザID・パスワードを入力してログインする
同じマクロを使って、どちらでもログインできるように作りました。
VBAソースコード
Sub login()
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
objIE.Visible = True 'IEを表示
Dim strUrl As String '次ページのURL
strUrl = "https://connpass.com/login/"
objIE.navigate strUrl 'IEでURLを開く
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
DoEvents
Loop
Dim strUsername As String
strUsername = GetUsername
Dim strPassword As String
strPassword = GetPassword
Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
htmlDoc.getElementsByName("username")(0).Value = strUsername 'name="username"にユーザー名を入力
htmlDoc.getElementsByName("password")(0).Value = strPassword 'name="password"にパスワードを入力
htmlDoc.getElementById("login_form").submit 'フォームの内容を送信
End Sub
Function GetUsername() As String
Dim username As String
username = ActiveSheet.Range("C3").Value 'ユーザー名を取得する
GetUsername = username
End Function
Function GetPassword() As String
Dim password As String
If Range("C4").Value = "" Then
password = ActiveSheet.OLEObjects("TextBox3").Object.Value 'パスワードをテキストボックスから取得する
Else
password = Range("C4").Value 'パスワードをセルから取得する
End If
GetPassword = password
End Function
備忘録
ActiveXコントロールを使っているときは、OLEObjectを使うこと
テキストボックスからの値の取得方法を調べて、最初は「strPassword = TextBox3.Value」と書いていました。
すると「オブジェクトが必要です」というエラーに。
こちらとしてはオブジェクトあるじゃん・・と思いながら。
しかしActiveXコントロールのオブジェクトは取得方法が違うようです。
各 OLEObject オブジェクトは、ActiveX コントロール、リンクされた OLE オブジェクト、または埋め込まれている OLE オブジェクトを表します。
★ActiveXコントロールを使っているときは、OLEObjectを使うこと
戻り値を返すメソッドには、Functionプロシージャを使うこと
今回ユーザーネームを取得するところとパスワードを取得するところを、外に出してみました。
しかしなかなかうまくいかないのは、「Subプロシージャ」と「Functionプロシージャ」の違いを分かっていなかったからでした。
Subプロシージャ:戻り値がない
Functionプロシージャ:戻り値を返せる
【VBA】Sub/Functionプロシージャの違いと使い方【Excelマクロ】より
最初はSubプロシージャで書いていたため、戻り値を受け取れていなかったようです。
★戻り値を返すメソッドには、Functionプロシージャを使うこと