CoCoのYDブログ

心に思い浮かんだことを少し掘り下げ発信します

【VBA】IEの更新や戻るボタンの処理

こんにちは

 

今回はIEの更新や戻るボタンについて調べました。

IEで操作ができるならVBAでも操作が可能なはず!

 

調べてみた結果プロパティひとつで簡単に処理できるようで

意外とあっさりでした。

 

IEの更新

InternetExplorerオブジェクト.Refresh

 

これだけですね。

更新する場合はこの後にページが開き終わるまで待つ必要があります。

 

戻るボタン

InternetExplorerオブジェクト.GoBack

戻るのもこれだけで済みますね。

これもページを開き終わるまで待つ必要がありますね。

 

URLの取得

InternetExplorerオブジェクト.LocationURL

もしくは

InternetExplorerオブジェクト.document.URL

で取得できるようです。

 

今回も短いですがこの辺で

【VBA】水平揃え垂直揃え

こんにちは

涼しくなってきましたね。

 

今日は水平揃えと垂直揃えのお話です。

使うことはあまり無いんじゃないかな・・・

とはいえまとめさせていただきますよ。

 

水平揃え

水平はHorizontalAlignmentプロパティを使用します。

Horizontalは水平な、Alignmentは直線にするという意味です。

つまり水平に揃えるという意味ですかね。

 Range("A:A").HorizontalAlignment = xlGeneral

このような形で使用します。

効果
xlGeneral 標準(デフォルトの状態)
xlLeft 左揃え
xlCenter 中央ぞろえ
xlRight 右揃え

 

垂直揃え

では垂直揃えも見ていきましょう。

垂直はVerticalAlignmentプロパティを使用します。

Verticalは垂直のという意味ですね。

水平揃え同様

Range("A:A").VerticalAlignment = xlTop

と使用します。

効果
xlTop 上揃え
xlCenter 中央揃え
xlBottom 下揃え

 

 あらかじめセルに設定しておけば使うことはほぼ無いと思うのですが、水平揃え・垂直揃えの説明でした。

【VBA】フォントプロパティでフォントを操作する

こんにちは

今回はフォントを操作してみましょう。

フォントプロパティを使えばフォントの色や大きさ、太文字など様々な操作が行えます。

 

よく使うもの

フォントの色変更

フォントの色はインデックス番号で指定する方法、RGBで指定する方法、16進数で指定する方法があります。

インデックス番号は以下のとおりです。

1~56まであるそうです。

.Font.ColorIndex=1のように使用します。

f:id:takataka2743:20180916144900p:plain

 

次にRGBを使用して指定します。

.Font.ColorIndex=RGB(赤の数値,緑の数値,青の数値)のように使用します。

[その他の色]から[色の設定]の[色の設定]を開きRGBの値を確認することができます。

f:id:takataka2743:20180916145355p:plain

f:id:takataka2743:20180916145410p:plain

 

最後に16進数で表す方法ですが、自分はあまり使いませんね。

.Font.Color = &HFFFFFF のように使うらしいのですが詳しくないため省略とさせてください。

 

フォントの設定変更

基本的にTrue/Falseで有効/無効を切り替えます

フォントの太文字の変更

Range("A1").Font.Bold = True
Range("A1").Font.Bold = False

 

斜体の変更

Range("A1").Font.Italic = True
Range("A1").Font.Italic = False

 

取り消し線の変更

Range("A1").Font.Strikethrough = True
Range("A1").Font.Strikethrough = False

 

下線の変更

Range("A1").Font.Underline = True
Range("A1").Font.Underline = False

 

 

【VBA】知っておくと便利なEndプロパティ

こんにちは

今回はEndプロパティの説明です。

基本的なところなので知ってる人は多そうですが、一応説明します。

Endプロパティは簡単に説明すると選択したセルの終端を選択するものです。

簡単に説明するとセルを選択して[Ctrl]と[←]や[Ctrl]と[↓]を押したときに選択されるセルのことですね。

 

余談ですが、Excelを初めて触ったときに、Excelの終わりってどこなんだろうかとずっと右や下を押していた記憶がありますwそのときに教えてあげたかった知識ですね(遠い目)

 

下準備

あらかじめシートをこんな感じにしてみましょうか

f:id:takataka2743:20180916081219p:plain

下準備めっちゃ雑w

こんなんだから中級者だと(ry

例で作ってるだけなので真似される方は適当に作っちゃってください

実際に仕事で使う場合、何百何千と品名があり、数も変動するためいちいち何番まであるとか

サンプルプログラム

購入品のリストと在庫品のリストの比較を行ってみましょうか

もし在庫品名と購入品名が被った場合、購入品名のフォントを赤色にするといった感じにしましょう。

ではサンプルです。

Sub 比較()
    Dim i As Long
    Dim j As Long

    For i = 2 To Range("A2").End(xlDown).Row
        For j = 2 To Range("D2").End(xlDown).Row
            If Cells(i, 2) = Cells(j, 5) Then
                Cells(i, 2).Font.Color = RGB(255, 0, 0)
                Exit For
            Else
                Cells(i, 2).Font.Color = RGB(0, 0, 0)
            End If
        Next j
    Next i
End Sub

 1行目:プロシージャの開始

2~3行目:変数宣言

4行目:なし

5行目:変数iのFor文開始(2~range("A2")の下方向終端の行数まで)

6行目:5行目同様変数jのFor文開始

7行目:Cells(i, 2) とCells(j, 5)の比較

8行目:条件が合致していれば購入リストの品名を赤にする

9行目:For文から抜ける

10行目:Else処理の開始

11行目:条件に不一致の場合、購入リストの品名を黒くする

12行目:If文の終了

13~14行目:変数を返す

15行目:プロシージャの終了

 

蛇足

Endプロパティによけいなものが付いてるけどあれって何?

Range("A2").End(xlDown).Row

この赤文字の所ですね。

これはRowプロパティといって指定されたセルの行番号を返しなさいという命令です。

読み方はロゥかな?

この場合、Range("A2")から[Ctrl]+[↓]へ行ったセルの行番号を返しなさいという事になります。

 

Rowが行番号なら列番号は何?

列番号を返す場合はColumn(コラム)ですね。

これも同じようにCellsやRangeの後ろに付けます。

 

RowsやColumnsがあるんだけど?

たまに打ち間違えるやつですねw

RowsやColumnsはRangeオブジェクトとして値を返します。

つまりRows(1)はRange("1:1")と同じ意味ですね。

Columns("3:5")はRange("C:E")と同じですね。

うーん、自分には使いこなせる気がしないw

 

右や左も.End(xlRight)や.End(xlLeft)になるの?

昔僕もやらかしましたが、左右の場合は変わってきます。

左右の場合はToが付くので注意しましょう。

 プロパティ 方向
 .End(xlUp)  上:Ctrl+↑方向
 .End(xlDown)  下:Ctrl+↓方向
 .End(xlToLeft)  左:Ctrl+←方向
 .End(xlToRight)  右:Ctrl+→方向

 

 

ちなみにですが、下の図のようなケースが発生する場合があるかもしれませんね。

文字の入力されたセルの間に空白セルがまぎれている場合、終端行は空白セルの上の行になってしまいます。

これでは処理が中途半端で終わってしまいます。

f:id:takataka2743:20180916094941p:plain

 

この場合Range("A10000").End(xlUp).rowのように上から下の終端行を探すのではなく、下から上へ終端行を探すのもひとつの手ですね。

とはいえ、その終端行が空白だった場合も中途半端になってしまうため実行する前に確認したり、ミスを防ぐための処理を加える必要はありますね。

【VBA】ソースコードでどこをいじればいいの?

こんにちは

IEを使用する際に見なくてはならないのがソースコードです。

でも開いてみるとごちゃごちゃしており、どこがどのコードなの?と思うと思います。

 

ということで今回はいじる範囲がどのソースか調べる方法を教えます。とはいえ独学で勉強しているのでもしかしたらもっといい方法があるかも・・・という逃げ道を用意させてくださいw

 

じゃあどうしたらよいのか

まずIEで操作したいページを開きます。

私がよく使うページならAmazonさんですね。

検索のキーワードを入れるボックスをクリック

そして右クリックして要素の調査をクリック

f:id:takataka2743:20180915220933p:plain

 

するとこんな画面が出てきます。

この青くマークされてるのがキーワードのところですね。

For Each 文とgetElementsTagName("Input")で出てきたソースのnameが”field-keywords”なら・・・みたいにプログラムを組むことが可能ですよね。

f:id:takataka2743:20180915221148p:plain

 

IEの場合は上のようになっていますが、僕が普段使用しているFireFoxの場合はというと

f:id:takataka2743:20180915221714p:plain

自分が今どこを触っているのか見やすく表示してくれるため分かりやすいですね。

このように使用するブラウザで若干の違いはあるようです。

 

自分にあったブラウザを探してみるのも良いかもしれませんね。

【VBA】Amazonで商品検索

こんにちは

今回はAmazonで商品検索をします。

言葉で言うのは簡単なんですけどね。

 

Amazonでの商品検索

1.IEを開く

2.Amazonにアクセス

3.欲しい商品名を入力

4.表示された商品のページを開く

 

すごく・・・簡単です。

これをVBAで表示すると結構なコードになりそうw

 

ではコードを見ていきましょう

サンプルコード

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub Amazon_search()
    Dim ie As InternetExplorer
    Dim textInput As IHTMLElement

    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ie.navigate "https://www.amazon.co.jp/"

    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Loop
    Sleep 3000

    For Each textInput In ie.document.getElementsByTagName("input")
        If InStr(textInput.Name, "field-keywords") > 0 Then
            textInput.Value = "ジャック・ライアン"
            Exit For
        End If
    Next

    Dim form As HTMLFormElement
    For Each form In ie.document.getElementsByTagName("input")
        If InStr(form.Value, "検索") > 0 Then
            form.Click
            Exit For
        End If
    Next

    Do While ie.Busy Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
        Loop
    Sleep 3000

    Dim title As IHTMLElement
    For Each title In ie.document.getElementsByTagName("A")
        If InStr(title.innerText, "ジャック・ライアン") > 0 And title.innerText Like "*字幕*" Then
            title.Click
        Exit For
        End If
    Next
End Sub

1行目:Sleep関数の宣言

2行目:プロシージャの開始

3~4行目:変数宣言

5行目:なし

6行目:ieにInternetExplorer.Applicationを設定

7行目:IEを表示

8行目:Amazonを開く

9行目:なし

10~12行目:読み込みが終わるまで待機

13行目:Sleep関数で3秒待機

14行目:なし

15行目:For Each文でソースコード内の”input”タグの数繰り返す

16行目:検出されたコードでNameが"field-keywords"かどうか

17行目:検索のワードに"ジャック・ライアン"を入れる

18行目:For文を抜ける

19行目:If文を抜ける

20行目:NextでFor文を繰り返す

21行目:なし

22行目:formを変数宣言

23行目:For Each文でソースコード内の”input”タグの数繰り返す

24行目:検出されたコードでValueが"検索"かどうか

25行目:検索ボタンをクリック

26行目:For文を抜ける

27行目:If文を抜ける

28行目:NextでFor文を繰り返す

29行目:なし

30~33行目:ページを開くまで待機

34行目:なし

35行目:変数宣言

36行目:For Each文でソースコード内の”A”タグの数繰り返す

37行目:If文で"ジャック・ライアン"と"字幕"が記載されたリンクかどうか

38行目:リンクをクリック

39行目:For文を抜ける

40行目:If文を抜ける

41行目:NextでFor文を繰り返す

42行目:プロシージャの終了

 

いやぁ長いw

そして自分がジャック・ライアンにはまっているからという理由でこんなプログラムを作成したという

 

本当に面白いんですよこの作品は

時間があればぜひ見ていただきたいです。

AmazonPrimeなら無料で観れます!

f:id:takataka2743:20180915220200p:plain

作成してみて

  本を読んである程度IEを使用したプログラムを組んでは見たものの、未だにこの変数宣言でいいの?と思うところは多々ありますね。

特に検索ボタンを押すところなんて

form.submitで最初はやろうとしたんですが、エラーが出てきて何で?となりました。

とりあえず動かさなくてはということでClickを使用しましたが、

この当たりが中級者なんだろうなぁと痛感しました。

 

  リンクをクリックするところは字幕のページをクリックするように設定しています。これは、そのままで開くと吹替え版が表示されるため、andを使用して字幕の方を開けるのではないかと思いやってみました。問題なく開けて安心しました。

 

内容が長すぎるため今回はこの辺で