IE操作メモ① - getElementById("id名")のエラー処理
IE操作時の開発メモ
コチラの記事は、ブログ管理人の開発メモです。
開発する際にまた検索する手間を省くため、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倍に底上げする方法
こんばんわ、にゃんたです。
前回に引き続き、ExcelVBA開発の効率化を上げる方法について、
ご紹介していこうと思います。
前回の記事はこちら↓
siroexcelvba.hatenablog.com
VBEの各ウィンドウの役割について
VBEを開くと、以下のような画面が表示されるかと思います。
※背景色や文字色などは前回の記事にて設定しています。
まずはウィンドウごとの役割について説明させていただきます。
①プロジェクトエクスプローラー
エクセルVBAのVBE画面の左上に位置するウィンドウでプロジェクトエクスプローラと言います。
1つのワークブックを1プロジェクトとして、そのプロジェクト内のオブジェクト一覧を表示します。
③イミディエイトウィンドウ
通常はソースに書いた「Debug.Print "メッセージ"」で出力結果を表示したり、変数の値をここで書いて確認したり、
色々とできます。例) 「?変数名」を入力してエンターで値確認可能など
※別の記事で次回以降にまとめます
④ローカルウィンドウ
変数入っている値を確認することができます。
配列の値や、階層の深い変数などの値を確認するときに便利です。
これらのウィンドウ間の移動をマウスでやると、
【マウスの移動時間】 × 【移動回数】
の時間がかかってしまいます!!
ソースを書いている時間に比例して、塵も積もれば山となっていくためこの
基礎開発時間を短縮できるに越したことはないと思います!
どう解決するか?
ウィンドウ間を移動するショートカットキーを覚えるだけ
です。
ショートカットキー
プロジェクトエクスプローラー:Ctrl + R
コード :F7
イミディエイトウィンドウ :Ctrl + G
実際はショートカットキーを覚え、イミディエイトウィンドウを如何に活用するか?が重要だったりするのですが、
イミディエイトウィンドウの詳細な使い方は次回にてご紹介させていただきます!
ではではーノシ
ExcelVBA開発効率を5倍速にする方法① - VBEをカスタマイズしよう
ExcelVBA開発効率を5倍に底上げする方法
こんばんわ、にゃんたです。
みなさんExcelVBA作ってますか?
VBAを作る上で開発速度など意識されてますか?
今回は、今まで開発を行ってきた中で、
これは開発速度がかなりあがる!!!!
といったテクニックをピックアップして1つずつご紹介しようと思います。
第一回はVBEのカスタマイズです。
VBEカスタマイズ後のイメージ
VBAを書く際のエディターですが、通常だと背景が白になっているかと思います。
ですが、これをカスタマイズするとこんな感じに見せるようにすることができるのです!
変数、コメント 、構文など見やすくなるためバグの発見などがしやすくなり開発効率がとても上がります。
【ExcelVBA入門】ExcelVBAにおけるエラー処理の書き方
ExcelVBAにおけるエラー処理
こんにちわ、にゃんたです。
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
エラー箇所でエラー発生時のエラー場所がわかるようにしておき、エラー現象でエラーの減少を表示しています。
こうしておくことで、どこの処理で何のエラーが発生したのかわかるようになります。
エラーメッセージはこんな感じで出ます。
関数名は残念なことに、自動で取得できないのでそこだけ注意!!
以上、エラー処理の書き方でしたー
ではではノシ
ランサーズの過去データ分析準備①
Excelマクロ + IEを使ったランサーズ案件一覧作成マクロ
こんにちは。にゃんたです。
前回までで、Googleにアクセスして検索結果をExcelに出力するマクロを開発しました。
このままでもほしい人いるかもしれないんですが、
どうせならユーザが困っていることを解決できるようなマクロ作りたいですよね。
なので、まずは「ランサーズ」にある特定キーワードの案件を取得して表示するマクロ作ってみようと思います。分析とかに使えそうだよね。
過去案件一覧見て、ユーザが欲している困っている情報を分析して、
勉強して力になれたら最高ですね。
通常、過去案件見たい場合はページをクロールして、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=マクロ
どうやら、allやsystemに入っている部分を変えれば大カテゴリを変えられる模様
で、「/」のあとに続けて中・小カテゴリが入っているみたいですね。
なので、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
なので、要素数ごとに処理変えねばなりません。
.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
普通に行けた。
最終ページをどこから取得しよう?
「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に書き込んだらこうなりました。
※処理重いので注意
なんとかできた。
明日はこれを使って傾向を分析して学習方針固めようと思います。
ではではーノシ
*1:pager.Length - 1
初めてのIE操作
ExcelでIE操作する基本を学ぼう
こんにちわ、MacroCatのsiroです。
初めてのIE操作ということで、ExcelからIEのデータを抽出するマクロを作ってみましたので、簡単にご紹介します!
上記記事ですが、とってもわかりやすくて素敵でした。
すらーっと進んで一通り書いてあることはやってみたので、自分で決めた仕様でなにか簡単なものを作ってみようと思います!
みんな大好きGoogle先生に質問した結果をExcelに残そう!
ランサーズでも、Amazonでも、楽天でもそうなんですが、一覧リストって基本ページ移動して確認するじゃないですか。
全部表示すると重いので1ページに表示できる件数を絞って表示するのはわかるんですけど、もっとこう広範囲に一覧で見たいなーってときありません?
と、いうことで、まずはGoogleで検索した結果を保存するマクロを作ってみました!
単純なGoogle検索のみなので、需要がどのぐらいあるかわかりませんが、Amazonとか、楽天とか、食べログとかで同じようなツールを作ったら、ほしい人いそうですね。
以下に、開発時のtipsをまとめています。
IEから各要素(id、class、tagなど)を取得する方法はこちら
IEから取得した要素が存在しなかった場合の処理はこちら
その他製造時のメモ
コメントアウト設定
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設定周り、開発手法で目からウロコの本
セルに値を書き込む場合について
書き方二通りある。
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
当ブログについて
初めまして
初めまして、Excelマクロ開発の請負を行っております、MacroCatのsiroと申します。
Excelマクロ開発、フリーランス、開発効率化、自動化などについて、情報発信していくためにブログを開設しました。
読んでいる方の少しでもためになる情報を発信していきます!
フリーランスになった理由については以下記事にまとめています。
以下記事に私がどんな人なのか?どんな思いでフリーランスになったのか?などじっくり説明しています。
Excel-Tips
また、技術記事もアップしています。
ExcelVBAをメインにphpも少しずつアップしていくと思います。
また、開発依頼の方は こちら からお問い合わせいただけます。
お気軽にご連絡ください。
以上、宜しくお願いいたします。
siro
お問い合わせ
私のブログを読んでいただいている方のお力になれればと思い、問い合わせフォームを作成しました。
ExcelVBAの開発依頼や、技術に関する質問、ブログに関するコメントなどお気軽にご連絡ください。
お問い合わせフォーム