MacroCat@Siro - ExcelVBA・PHP・フリーランス

ExcelVBA、WEBスクレイピング、その他技術に関して書いていきます。

IE操作メモ① - getElementById("id名")のエラー処理

IE操作時の開発メモ

f:id:sirosiro346:20171003235423j:plain

コチラの記事は、ブログ管理人の開発メモです。
開発する際にまた検索する手間を省くため、Tips + 一言コメントで記事を書いています。

getElementById("id名")のエラー処理


        'URLを開く
        objIE.navigate strURL(i)

        'ページのデータを取得するために、ページが表示されるまで待つ
        Call SysContentCls.DisplayWait(objIE)

        'objIEで読み込まれているHTMLドキュメントをセット
        Set htmlDoc = objIE.document

        'ElementByIdでエラーが返ってきた場合のエラー処理追加
        If htmlDoc.getElementById("olp_feature_div") Is Nothing Then
            Debug.Print "なし"
        Else
            Debug.Print "あり"
        End If


If htmlDoc.getElementById("olp_feature_div") Is Nothing Then

objectだから、NullじゃなくてNothingで判定するみたいですね。
忘れないように気を付けなければ。

ではではーノシ

ExcelVBA開発効率を5倍速にする方法② - 脱マウス操作で速度を上げよう!

ExcelVBA開発効率を5倍に底上げする方法

f:id:sirosiro346:20171003181716j:plain

こんばんわ、にゃんたです。
前回に引き続き、ExcelVBA開発の効率化を上げる方法について、
ご紹介していこうと思います。

前回の記事はこちら↓
siroexcelvba.hatenablog.com

VBEの各ウィンドウの役割について

VBEを開くと、以下のような画面が表示されるかと思います。

f:id:sirosiro346:20171003182522p:plain
※背景色や文字色などは前回の記事にて設定しています。

まずはウィンドウごとの役割について説明させていただきます。

①プロジェクトエクスプローラ

エクセルVBAのVBE画面の左上に位置するウィンドウでプロジェクトエクスプローラと言います。
1つのワークブックを1プロジェクトとして、そのプロジェクト内のオブジェクト一覧を表示します。

②コード

実際にソースコードを書く場所です。
プロジェクトエクスプローラーで選択(ダブルクリック)したソースが表示されます。

③イミディエイトウィンドウ

通常はソースに書いた「Debug.Print "メッセージ"」で出力結果を表示したり、変数の値をここで書いて確認したり、
色々とできます。例) 「?変数名」を入力してエンターで値確認可能など
※別の記事で次回以降にまとめます

④ローカルウィンドウ

変数入っている値を確認することができます。
配列の値や、階層の深い変数などの値を確認するときに便利です。


これらのウィンドウ間の移動をマウスでやると、
【マウスの移動時間】 × 【移動回数】 
の時間がかかってしまいます!! 

ソースを書いている時間に比例して、塵も積もれば山となっていくためこの
基礎開発時間を短縮できるに越したことはないと思います!


どう解決するか?

ウィンドウ間を移動するショートカットキーを覚えるだけ

です。


ショートカットキー

プロジェクトエクスプローラー:Ctrl + R
コード           :F7
イミディエイトウィンドウ  :Ctrl + G




実際はショートカットキーを覚え、イミディエイトウィンドウを如何に活用するか?が重要だったりするのですが、
イミディエイトウィンドウの詳細な使い方は次回にてご紹介させていただきます!


ではではーノシ

ExcelVBA開発効率を5倍速にする方法① - VBEをカスタマイズしよう

ExcelVBA開発効率を5倍に底上げする方法

f:id:sirosiro346:20171002165507j:plain

こんばんわ、にゃんたです。
みなさんExcelVBA作ってますか?
VBAを作る上で開発速度など意識されてますか?

今回は、今まで開発を行ってきた中で、
これは開発速度がかなりあがる!!!!
といったテクニックをピックアップして1つずつご紹介しようと思います。
第一回はVBEのカスタマイズです。

VBEカスタマイズ後のイメージ

VBAを書く際のエディターですが、通常だと背景が白になっているかと思います。
ですが、これをカスタマイズするとこんな感じに見せるようにすることができるのです!

f:id:sirosiro346:20171002215123p:plain

変数、コメント 、構文など見やすくなるためバグの発見などがしやすくなり開発効率がとても上がります。

設定方法

①ツールからオプションを開く

f:id:sirosiro346:20171002215143p:plain

②「エディターの設定」タブを開く

f:id:sirosiro346:20171002170858p:plain

③以下設定を行う

標準コード :前景/黄色    、 背景/黒
コメント  :前景/濃いグレー 、 背景/黒
キーワード :前景/水色    、 背景/黒
識別子   :前景/白     、 背景/黒
フォント名 :好きなフォントでよいです。メイリオなど 
サイズ   :10 or 11 (画面サイズによって変えてみてください)

これだけです

すぐに設定が済むので、まだVBEいじったことがない人が騙されたと思って 触ってみてください。笑

ではではーノシ

【ExcelVBA入門】ExcelVBAにおけるエラー処理の書き方

ExcelVBAにおけるエラー処理

f:id:sirosiro346:20170924144345j:plain

こんにちわ、にゃんたです。
ExcelVBAのエラー処理について、個人的な書き方についてメモ。


エラー処理とは?

エラー処理とは、ソース実行時エラーとなった場合の処理を記述して起き、
エラー原因の特定をしやすいようにしたり、予期せぬエラーでアプリ強制終了しないように防いだりできます。

ExcelVBAにおけるエラー処理

まずは、ソースコードを先にお見せします

'
' 機能    :エラー処理テスト
'
' 引数    :
'
' 返り値   :
'
' 備考    :
'
Sub errorTest()
On Error GoTo errorTest_Err '①エラー発生時にエラー処理へ移動
    'Main処理

    Dim intTest As Integer
    
    '②int型に入らない値を意図的に入れて、エラー発生
    intTest = 1000000
    
    '成功時のメッセージ
    MsgBox "エラーなし", vbInformation
        
    Exit Sub
    
'③エラー発生時の処理
divideBaseWord_Click_Err:
    
    '④エラーメッセージを表示
    MsgBox "エラーが発生しました。" & vbCrLf & _
                "【エラー箇所】:" & "Main.errorTest" & "です。" & vbCrLf & _
                "【エラー現象】:" & Err.Number & ":" & Err.Description, vbCritical
    Exit Sub
    
End Sub

①エラー発生時にエラー処理へ移動

On Error GoTo errorTest_Err
これは、エラー発生時に「On Error GoTo errorTest_Err」に飛ぶよ。
といった意味。

基本的には、「関数名 + _Err」が一般的だと思います。

③エラー発生時の処理

①でソースの最初に書いた「On Error GoTo errorTest_Err」の処理を書きます
On Error GoTo errorTest_Err:

④エラーメッセージの表示

ここでは、エラー発生時のメッセージを表示しています。

    '④エラーメッセージを表示
    MsgBox "エラーが発生しました。" & vbCrLf & _
                "【エラー箇所】:" & "Main.errorTest" & "です。" & vbCrLf & _
                "【エラー現象】:" & Err.Number & ":" & Err.Description, vbCritical
    Exit Sub

エラー箇所でエラー発生時のエラー場所がわかるようにしておき、エラー現象でエラーの減少を表示しています。
こうしておくことで、どこの処理で何のエラーが発生したのかわかるようになります。

エラーメッセージはこんな感じで出ます。
f:id:sirosiro346:20170924150630p:plain

関数名は残念なことに、自動で取得できないのでそこだけ注意!!

以上、エラー処理の書き方でしたー

ではではノシ

ランサーズの過去データ分析準備①

 

Excelマクロ + IEを使ったランサーズ案件一覧作成マクロ

こんにちは。にゃんたです。

前回までで、Googleにアクセスして検索結果をExcelに出力するマクロを開発しました。

siroexcelvba.hatenablog.com

 

このままでもほしい人いるかもしれないんですが、

どうせならユーザが困っていることを解決できるようなマクロ作りたいですよね。

なので、まずは「ランサーズ」にある特定キーワードの案件を取得して表示するマクロ作ってみようと思います。分析とかに使えそうだよね。

過去案件一覧見て、ユーザが欲している困っている情報を分析して、

勉強して力になれたら最高ですね。

 

通常、過去案件見たい場合はページをクロールして、10件ずつ見たりしなきゃいけないんですが、それだと日が暮れてしまうので、

ボタンをポチッ

っと押したあとほうっておくと自動で出力してくれるものを作りたいと思います。

 

ランサーズのURLを考察してみた

まずは、ランサーズの画面を開いて、URLを見てました。

 

カテゴリ:すべて
 http://www.lancers.jp/work/search/all?keyword=マクロ

 

カテゴリ:システム開発・運用
 http://www.lancers.jp/work/search/system?keyword=マクロ

 

カテゴリ:システム開発・運用>Web・システム開発
 http://www.lancers.jp/work/search/system/development?keyword=マクロ

 

カテゴリ:システム開発・運用>Web・システム開発>Excelマクロ作成・VBA開発
 http://www.lancers.jp/work/search/system/vba?keyword=マクロ

 

どうやら、allsystemに入っている部分を変えれば大カテゴリを変えられる模様
で、「/」のあとに続けて中・小カテゴリが入っているみたいですね。

なので、URLを変えればカテゴリの指定はできそう。

 

ちなみに、今回のサブ目的は
「ランサーズのVBAに関する過去案件の洗い出し」なので、
VBA」で過去案件含め結果を表示するマクロ
を作ろうかと思います。


IE操作するためのクラス名、IDなどの確認方法

まずは、IE操作を行う対象のサイトがどんな構成になっているか確認する必要があります。

とってくる項目のTag名や、Classや、IDなど事前に確認したうえでマクロを書く必要があるので。

 

【確認方法】
 ・InternetExplolerの場合
   F12の管理者ツールを起動して確認
  
 GoogleChromeの場合
  「Ctrl + Shift + I」でデベロッパツール開いて確認

※個人的にはGoogleChromeがおすすめです  

 

Lancersで確認してみた

どうやら、検索結果はdivタグの「jobCard__col jobCard__col--main」というクラス内にあるようです。
なので、処理はこのDIVの数分ループでよいかと。


こんな感じ

>||

Set div = htmlDoc.getElementsByTagName("div") 'HTMLドキュメント内のspan要素をコレクションとしてGet
For Each el In div

If el.className Like "jobCard__col jobCard__col--main" Then '要素のclassが「g」の場合のみ以下処理を実施
Debug.Print "クラス名:" + el.className

' 'データ確認
Debug.Print el.getElementsByTagName("p")(0).innerText 'タイトルを表示

End If

Next el

||<

 


さて、次に金額やらなにやら項目取ろうと思ったんですが・・・

10000 ~ 20000円

・10000
・~
・20000

これがそれぞれprice-numberというクラスになっていて
かつ、要素数が1つの場合と2つの場合と3つの場合があって

※1つの場合
・~
・20000

※2つの場合
・~
・20000

※3つの場合
・10000
・~
・20000

 

なので、素数ごとに処理変えねばなりません。

VBAで要素数取得に関して、調べてたらこんな素敵なサイト

www.vba-ie.net

.Lengthで取得できるようなので、条件追加してみた

 

>|vb|

If el.getElementsByClassName("price-number").Length = 3 Then

Debug.Print el.getElementsByClassName("price-number")(0).innerText + _
el.getElementsByClassName("price-number")(1).innerText + _
el.getElementsByClassName("price-number")(2).innerText
Else

Debug.Print el.getElementsByClassName("price-number")(0).innerText + _
el.getElementsByClassName("price-number")(1).innerText

End If

||<

 

el.getElementsByClassName("price-number").Length
というもので取得できるようですね。

 

ランサーズでは応募までの締切残日数を持っているので、
それもついでに取得してみた。

 

>|vb|

'残日数
Debug.Print el.getElementsByClassName("jobCard-below__col jobCard-below__col--time")(0).innerText

<||

 

こちらもクラス指定で簡単に取れました。

 

ページ遷移して情報を取得せねばならぬ

ページ遷移する方法だけど、postでページを指定しているサイトがほとんどだと思うので、ランサーズでもURLを比較してみた。

 

・1ページ目
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1

・2ページ目
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=2

 

ふむふむ。どうやら「page=ページ数」を指定すればいけるらしい。
ためしに「page=1」でも1ページ目が検索されるか確認してみた。

http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=1

f:id:sirosiro346:20170922204707p:plain

普通に行けた。

 

最終ページをどこから取得しよう?

「page=XXX」で指定できるのはわかったんですが、最終ページがどこなのかわからないと、どこまでループすればよいか不明なので、取得する処理を書いておく必要があります。

ランサーズの場合、「最後へ>>」という便利なボタンのリンクが、
http://www.lancers.jp/work/search/system/vba?keyword=マクロ&completed=1&page=XX
となってたので、ここのXXから取得することに。

最後の文字だけほしいので、Right関数とsplit関数を使って数字のみ抽出
http://officetanaka.net/excel/vba/tips/tips62.htm
※ここのサイトいつもお世話になってます

 

>|vb|

Dim pager As IHTMLElementCollection 'pagerのHTMLエレメントコレクションを準備

Set pager = htmlDoc.getElementsByClassName("pager__item__anchor") '「最後へ」ボタンのclassを指定して値取得
intMaxPage = Split(Right(pager*1.href, 5), "=")(1) '最大ページ数のみ取得

||< 


問題ないっぽいので、指定したページまでデータを取得するよう、For文を追加して、
Excelに書き込んだらこうなりました。

※処理重いので注意

 

youtu.be

 

なんとかできた。

明日はこれを使って傾向を分析して学習方針固めようと思います。

 

ではではーノシ

*1:pager.Length - 1

初めてのIE操作

 

ExcelIE操作する基本を学ぼう

f:id:sirosiro346:20171012103146p:plain

こんにちわ、MacroCatのsiroです。

初めてのIE操作ということで、ExcelからIEのデータを抽出するマクロを作ってみましたので、簡単にご紹介します!

tonari-it.com

上記記事ですが、とってもわかりやすくて素敵でした。

すらーっと進んで一通り書いてあることはやってみたので、自分で決めた仕様でなにか簡単なものを作ってみようと思います!

 

 みんな大好きGoogle先生に質問した結果をExcelに残そう!

f:id:sirosiro346:20171012103458j:plain

 

ランサーズでも、Amazonでも、楽天でもそうなんですが、一覧リストって基本ページ移動して確認するじゃないですか。

全部表示すると重いので1ページに表示できる件数を絞って表示するのはわかるんですけど、もっとこう広範囲に一覧で見たいなーってときありません?

 

と、いうことで、まずはGoogleで検索した結果を保存するマクロ作ってみました!

youtu.be

 

単純なGoogle検索のみなので、需要がどのぐらいあるかわかりませんが、Amazonとか、楽天とか、食べログとかで同じようなツールを作ったら、ほしい人いそうですね。

 

以下に、開発時のtipsをまとめています。

ExcelIE操作を行うときの参考になればと思います。

 

IEから各要素(id、class、tagなど)を取得する方法はこちら

siroexcelvba.hatenablog.com

IEから取得した要素が存在しなかった場合の処理はこちら

siroexcelvba.hatenablog.com

 

その他製造時のメモ 

コメントアウト設定

https://tonari-it.com/excel-vba-vbe-comment-shortcut-key/
※他にもショートカットとかほんと勉強になる部分が多いです

 

stop変数使って値確認

https://tonari-it.com/vba-immediate-command-input/

 

VBAクラス周りで分かりやすかったサイト

https://ateitexe.com/how-to-use-class-module/

 

VBE設定周り、開発手法で目からウロコの本

https://www.amazon.co.jp/exec/obidos/ASIN/4798049999/ref=nosim?tag=maftracking92466-22&linkCode=ure&creative=6339


セルに値を書き込む場合について

書き方二通りある。

Range("A2").value = "書き込む値"
Cells(1, 2) = "書き込む値"

直接セル指定ならRange、forとかで処理する必要あるならCells
が良いかなーと個人的に感じました。

Rangeはセル指定なので、AとかBとかがforでカウントしていかかないといけないので。
列だけなら、Range("A" + i).value = "書き込む値"
のように力業にすることもできますが。。。

http://sugoikaizen.com/excelvba/column_80/

 

Forの書き方

いつも忘れてしまうのでこの場で書いておきます。

For カウンタ変数 = 初期値 To 繰り返し回数 Step 加算値
 繰り返し回数までの処理
Next

 

参考:http://excelvba.pc-users.net/fol6/6_3.html
※Step 加算値を書かなかった場合は1ずつ増えていきます

 

 ではではーノシ

 

siro

 

当ブログについて

初めまして

f:id:sirosiro346:20171005224338j:plain

 

初めまして、Excelマクロ開発の請負を行っております、MacroCatsiroと申します。

Excelマクロ開発、フリーランス、開発効率化、自動化などについて、情報発信していくためにブログを開設しました。

読んでいる方の少しでもためになる情報を発信していきます!

 

フリーランスになった理由については以下記事にまとめています。

以下記事に私がどんな人なのか?どんな思いでフリーランスになったのか?などじっくり説明しています。

siroexcelvba.hatenablog.com

 

Excel-Tips

また、技術記事もアップしています。

ExcelVBAをメインにphpも少しずつアップしていくと思います。

 ●Tips - VBA

 ●Tips - IE操作

 ●Tips - ユーザフォーム

 ●Tips - 開発効率化

 ●Tips - Excel操作

 

また、開発依頼の方は こちら からお問い合わせいただけます。

お気軽にご連絡ください。

 

以上、宜しくお願いいたします。

 

siro

お問い合わせ

私のブログを読んでいただいている方のお力になれればと思い、問い合わせフォームを作成しました。
ExcelVBAの開発依頼や、技術に関する質問、ブログに関するコメントなどお気軽にご連絡ください。


お問い合わせフォーム