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

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

クラウドソーシングサービスで新着案件に素早く気付く仕組み① - 考察 / 決意

f:id:sirosiro346:20171022125504j:plain



新着案件を素早く察知する方法はないか?

おはようございます。siroです。
先日フリーランスになった理由について - MacroCat@Siro - ExcelVBA・PHP・フリーランスでもご紹介しましたが、
私は、フリーランスとしてクラウドソーシングサービス(ランサーズやクラウドワークス)を活用し、仕事を請け負っています。

先日、同じようにクラウドソーシングサービスを活用している方向けに以下のような記事をアップしました。

siroexcelvba.hatenablog.com

上記記事では、提案方法についてパターン分けして書いているのですが、そもそも案件を見つけるタイミングによっては既に数十件提案があったり、場合によっては提案されたら即依頼している顧客もいるため、いくら提案力・サービスの質を上げたとしても見つけられなかったというだけで、技術提供ができない可能性があります。

これは本当にもったいないなと思ったので、まずはクラウドソーシングサービスにもともと機能がないか?を調べてみました。

ランサーズの場合

ランサーズには、メール通知機能というものがあったためランサーズサポートチームに問い合わせしてみたところ、
以下回答がありました。

siro様

いつもランサーズをご利用いただきまして誠にありがとうございます。 
ランサーズサポートチームのXXXXでございます。

お問い合わせの件につきまして、以下に回答いたします。

特定のキーワードで抽出した案件が新着登録された際、メールで通知する機能がございます。
なお設定にあたっては、以下の手順でお手続きをお願いいたします。

----------------------------------------------------------------------------------
1、仕事の検索ページで、“VBA開発”などと検索します。
  仕事をさがす:http://www.lancers.jp/work/search/
2、現在の検索条件を保存 をクリックします。
  参考画像:https://gyazo.com/09bf37abdd3a1dae6caead3a422ae7e0
3、検索条件の名前を入力します。
  参考画像:https://gyazo.com/d5a4d9c1877050101ece52aeb743b47d
4、下記ページで、検索メールの内容に“VBA開発”が追加されたことを確認します。
  メール通知設定:http://www.lancers.jp/mypage/receive_email 
  参考画像:https://gyazo.com/291737eb2047d94cc9921bec4367e567
5、チェックボックスに印を入れているキーワードで、新規依頼が通知されます。
----------------------------------------------------------------------------------

お手数ではございますが、何卒よろしくお願いいたします。

その他、ご不明な点がございましたら、ご遠慮なくご連絡ください。 
今後ともランサーズをどうぞよろしくお願いいたします。

お、あるじゃないか!
と思ったんですが、さらに深堀して聞いてみると、この機能

リアルタイムに通知する機能ではない

ことがわかりました。
念のため通知頻度を上げられないか確認したところ以下回答あり。

新着案件を通知する機能は前回ご案内した内容のみとなっており、
また通知の頻度を上げることはできず、ご不便をおかけいたします。

カテゴリごとにメール通知くれるのは非常にありがたいんですが、数時間で提案者決定する人もいるのでちょっとこれだとまだ足りません。
※リアルタイム通知にするとその分負荷が高くなるのは理解しているのですが、利用者目線で言うと・・・といったところです

クラウドワークスの場合

こちらはそもそも通知内容をカスタマイズする設定がありません。
通知する/しないの選択のみです。

ただ、毎日3通以下メールが届きます。
・あなたにオススメのお仕事をご紹介!
・あなたが閲覧したお仕事をご紹介!
・エンジニアの皆さまにオススメの案件をご紹介!


閲覧履歴は迷っているときとかに使えそうですし、おすすめ案件から提案することもあるので便利なのですが、
ランサーズ同様 メール通知頻度がやっぱり少ないです。

ないなら作ってしまおう

きっと、私以外にも同じようにリアルタイムに通知してくれる機能を欲している人は多いはず。ということで、PHPで新着案件をメール通知してくれるサービス作ってみようと思います。
php + codeigniterの学習にもなるし、何より私のようにクラウドソーシングサービスで働いている人にとってもすごく便利だろうしいいこと尽くしかなーと思ったので。


α版・β版について

とはいえ、いきなりいろんな人が使えるツールを作るのって本当に大変で時間もかかるので以下のような段階に分けて作っていこうと思います。

■α版:まずは自分が満足のいくレベルのものを作る
siroの作業を効率化するということを目的に、以下機能でWEBサービスを作ります。
 1. 「VBA」「マクロ」で絞り込んだ結果から新着案件をメールで飛ばす
 2. 一覧をざっと確認できるようにする

■β版:他の人が利用できるレベルまで機能を拡張する
他のユーザも利用できるような機能を追加する
 1. ユーザ登録機能
 2. カテゴリを指定機能 


実現方法はいろいろ迷っているのですが、α版ができたら一旦公開予定です。お楽しみに。

siro

PHP + CodeigniterでWEB開発はじめました

f:id:sirosiro346:20171020173709p:plain

WEB開発はじめました

こんばんわ、siroです。
最近冷え込んできて部屋が寒くてやばいです。エアコンこっちの部屋にも買わないとそろそろ危ない気がしてきました。笑
さっそく脱線しましたが、今回からWEB開発の記事もアップしていこうと思います。

もともとExcelVBAの開発よりもWEB開発の方が携わった期間が長いのですが、WEBが得意です!
と大きな声で言えるようなレベルに自分はなっていないと思い、一番得意だったVBAをやっていたんですが、
最近ExcelVBAを開発していてすごく思うことがあるんです。

①大量データ扱う場合にExcelで実現できない場合がある
②WEBスクレイピングやるにしても処理速度が遅い

DBを利用しないときついような規模の開発や、速度的にExcelは課題を抱えているように思います。

それでもコストを安く提供できるし、Excelだったらほとんどの人がパソコンに入れているという意味で提供はしやすいのでメリットも多いんですが、ExcelVBAで仕事請け負っていると、これ絶対WEBで実現したほうが効率的だし、顧客も作業減ったりして良いんだけどなぁ・・・と思う機会が増えてきたので、ためしに提案数に対してどのぐらい感じるかカウントしてみたところ、、、

なんと4割もありました!

10件提案して4割が中・大規模案件または、DB等を利用してデータを利用したほうが良いようなものだったのです。

私が今までWEB開発、ExcelVBAを開発してきた感覚で感じていることなので何とも言えないかもしれませんが、
WEBで開発したらもっと良くできますよ!と提案できるようになった方が顧客も選択肢が増えるし嬉しいだろうなーと思ったのが最大の理由です。


なぜPHP

私は今まで以下のような開発経験があります。

php + codeigniter(2系)で社内システム開発 (半年ほど)
C# + ASP.NETで社内システム開発 (2年ほど)

学習コストはなるべく抑えたい(なるべく早く顧客に提案したい)かつ、提供しやすい言語がベスト!
だと思ったので、PHPを選択しました。

PHPはほぼすべてのレンタルサーバで稼働させることが可能ですし、
レンタルサーバも安いところは月額500円前後なので、それも提供しやすいなーと思ったからです。

単純にとっつきやすい言語だったという理由もあります。

フレームワークとは?

PHPは基本的にほとんど0の状態からプログラミングをしていきます。
また、もともと大規模開発を想定していなかったという背景もあるようで、
phpで開発する場合は例外なくフレームワークを利用します。
RubyだとRuby on Railsというフレームワークが人気だったりしますね


コーディングは作る人によって書き方や癖などが出やすいため、一定の質を担保した開発が難しくなってしまいます。
そういったものをもろもろ手助けしてくれるのが、フレームワークです。
(ちょっとざっくりしすぎたかも・・・)

もう少しシステム的に説明すると、
 ・ある程度の基礎的な部分をフレームワークが提供し、アプリ開発時にはそれを利用した書き方をしていく事ができる仕組み
 ・開発作業効率化ツール
みないなイメージですかね。
(まだざっくりなような・・・)

Webアプリとしての土台の仕組みとしてフレームワークを利用することで、以下のような様々なメリットがあります。
アプリ開発が高速化する  (少ないコード量で大きなことを実現できるようになるからです)
・保守性・可読性が上がる (ルールに則って書くためです)
・複数人で開発がしやすくなる (ルールが決まっているため、コミュニケーションがとりやすいです)


上記のような理由から、フレームワークは必要不可欠なので最初に何を使うか決める必要があります。

フレームワークっていろいろあるの?

PHPだけで言っても数十種類ぐらいあると思います。

有名どころで言うとこんな感じです
 ・CakePHJP
 ・Laravel
 ・FuelPHP
 ・Codeigniter
 ・Zend Framework


WEBスクレイピングをやりたかったため、速度を重視してフレームワークを検討し、
Codeigniterを採用することにすることにしました。
FuelPHPも高速かつCodeigniterよりも色々機能豊富だったのですが、学習コストを加味してCodeigniterにしました

レンタルサーバを用意しよう

まずは、作ったものをアップし、WEBサイトやWEBサービスとして表示するためのレンタルサーバを用意しなければなりません。
自分のローカル環境のみで動かすのであれば、そんなものは必要ないのですが他の人にも見てほしかったり、別のPCやネット環境から利用する場合は必須ですね。

おすすめレンタルサーバ
 ・ロリポップ     ←1番安い
 ・さくらサーバー  ←ロリポップより少し機能豊富ででも安い
 ・エックスサーバー  ←この中だと少し高いけど良いサーバー


今回は、さくらサーバーにすることにしました。
作ったもの動かしてみて動作とかでまたサーバー検討するかもしれません。
 

レンタルサーバーへのソースファイルアップ方法

基本的にはFTP通信でファイルアップロードします。

さくらサーバーの場合は、一応アップロードするツールがついているのでそちらでアップロードも可能です。
help.sakura.ad.jp

私の場合は、phpでの開発にPhpStormというIDEを使っているので、IDEで更新したファイルが自動的にサーバーにアップされるように設定しました。
IDEはソフトウェアの開発環境のことで、ソースを書いていくツールです。高機能なものを使うとコーディングが早くなります。
 無料のものでphp関連だと、eclipseが有名ですかね。PhpStormは有料ツールですが、使いこなしたときの速度が段違いだったので結構前に買っていました。

とりあえずレンタルサーバにアップしてみた

Codeigniterの説明しておいてまだ使っていないですが、とりあえずMacroCatのLPができたのでPhpStormからアップしてみました。
http://macro-cat.sakura.ne.jp/Home/index.html


一応まだあまり告知していませんが、このサイトからも仕事請け負うことができるようになっています。
※といっても問い合わせメールする機能しかまだないですが、、、笑

まとめ

今回は、phpでWEBアプリケーションを開発するための準備をしました。
次回以降はCodeigniterの記事もたまに書いていこうと思います。
おそらくソース + 一言の記事が量産されると思います。笑

では今日はこの辺で。

ノシ

【クラウドソーシング】仕事を依頼してもらうために重要な3つのコト

f:id:sirosiro346:20171019232813j:plain

こんにちは、siroです。
今回は、前回に引き続きフリーランス関連の記事について書こうと思います。
私と同じようにクラウドソーシング(ランサーズやクラウドワークスなど)を活用したフリーランス活動をしている方の
お力になれればと思います。

前回の記事はこちら。siroってどんな人?というのがわかると思います。
siroexcelvba.hatenablog.com

クラウドソーシングとは?

ネットを使って不特定多数の人々に業務を外注するサービスです。
作業は基本的にリモートワークで、クライアントの求めていることに対して要件(何を作りたいか?)をヒアリングし、
その要件を満たすものを提供するというお仕事です。

様々な方式があるのですが、私はシステム屋さんなので
「プロジェクト方式のクラウドソーシング」についてさらに深堀してご説明させていただきます。

プロジェクト方式の仕事決定までの流れ

プロジェクト方式の場合は以下のような流れで仕事を行います。

1. 顧客 :顧客が依頼したい作業を文章にし、クラウドソーシングサービスに応募依頼を行う
2. 開発者:応募依頼を見た開発者が内容を確認し、金額、納期、メッセージなどを添えて依頼に対して提案を行う
3. 顧客 :複数の提案内容から、金額、納期、提案内容、提案者のレベルなどを加味して依頼者を決定する

ここで重要なところは

3. 顧客 :複数の提案内容から、金額、納期、メッセージ内容、提案者のレベルなどを加味して依頼者を決定する

ここですね。

複数の提案者がいるわけですから、
どうやればたくさんの提案者の中から自分を選んでもらえるか?をしっかりと分析し、選んでもらうための提案を戦略的にしていく必要があるわけです。

以下で、意識し始めてから案件獲得率が格段にアップした3つの方法に関してご紹介させていただきます。

1. 依頼内容を正確に把握しよう - スピード重視 or 品質重視

私は提案する前に、まず以下の内容を確認します。

・上限金額
・納期
・応募内容

こちらを確認し、まずはスピード重視なのか品質重視なのかをざっくりと認識します。
その上で以下パターンに分けて提案を行っています。

パターン① - スピード最重視案件の場合

この場合は、

本当にこの人に依頼して素早くできるのだろうか?

ということを顧客が気にしているので以下のような提案方法をとっています。

1. 要件の簡易版(見て動作が簡単にわかるようなレベル)のサンプルを可能な限り早く作る
2. 提案文を送るときにサンプルを添付して、実力を示す


速度を重視しているわけですから、応募依頼を出してからの速度がかなり重要ですね。
とにかく早くサンプル作って提案をしています。

パターン② - 品質最重視案件の場合

この場合は、

本当にこの人に依頼して、良いものができるのだろうか?

ということを顧客が気にしているので以下のような提案方法をとっています。


1. 同じような実績に関して紹介できるレベルのものを作り、youtubeなどで動画を見せれる状態にしておく
2. 実績の紹介(動画)、仮納品後最終納品を行う形式に関して提案内容に記載し、提案を行う


※以下はWEBスクレイピング案件だった場合のサンプルです。抜粋して記載しています。

■今までの実績
 〇WEBデータ抽出(スクレイピング)
     ・Google検索結果取得
      https://youtu.be/oE9sxAgnRRM

     ・ランサーズ過去案件取得
      https://youtu.be/hLEhtOv-6wU

■依頼後の作業の流れ
 ① 要件ヒアリング
   ➡こちらは、実際に作りたいものを詳細確認する作業です。こちらから質問させていただきます。
 ② 製造・テスト
   ➡要件ヒアリングの結果をもとに、実際に製造(プログラミング)を行います。
 ③ 仮納品
   ➡一旦仮納品させていただき、動作に問題がないか?細かい部分などについてご確認いただきます。
 ④ 修正
   ➡仮納品後に指摘事項があった場合は、修正させていただきます。
 ⑤ 最終納品
   ➡修正完了後、内容に問題がなければ最終納品となります。

品質を重視しているわけですから、実績と信頼感がとても大事ですね。


そもそも実績がなかったら、こんな提案できないんじゃ・・・
と思う方もいるかもしれませんが、実績が現時点でない場合でも以下のようなことをやれば、
上記のような提案ができるようになります。


1. 格安でとにかく仕事を請け負い実績を作る。
極端な話、10000円で募集している案件に3000円で提案を行い、安さを武器に案件をまずは勝ち取ります。
その後、「え?こんなに安くてここまでやってもらえるの!?」と驚いてもらえるような、品質を提供し実績を作ります。

2. 過去案件を確認し、どのような技術が求められているか確認した上で、サンプルを作る。
仕事を請け負わなくても、過去案件を眺めているとなんとなくどんな技術が求められているか確認ができるので、
それを自分が請け負ったつもりでサンプルを作るというのも一つの手です。
案件が今まで多いということは、この先も同じような案件が募集される可能性が高いので、そのための準備を行うという作業ですね。


遠回りのように思えるかもしれませんが、私の場合は上記のような方法を実践して、
案件獲得率が格段にアップしました。


1は少しずるい方法な気もしますが、ランサーズはアカウントのランクが顧客に表示されてしまうため、
実績がないとそれだけの理由でメッセージを見ない方も多いと思ったので、アカウントの信頼度を上げる意味でも、
数回やってみると良いと思います。

2. 適切な金額を設定しよう

納期、提案内容ももちろん重要なのですが、それだけでは依頼されない場合があります。
それは、開発における金額設定です。

顧客からの応募は基本的に

5,000 ~ 10,000

など、範囲が決まっていますので、基本的にはその範囲内で提案が必要です。
提案の金額は自分の実績をどのぐらい証明できるか?作業にどのぐらい工数がかかるか?
で決定したものを提示しています。

3. 応募内容を見てわからない部分は遠慮なく質問しよう

顧客は困っていることを載せて応募依頼を出します。
ただし、その内容を見て必ずしも開発する側が理解できるとは限らないです。
思っていることが文章に書かれていないケースや、本質的な作業が書かれていないケースなど様々ですが。

そういった場合は、遠慮なく質問をしています。
提案内容だけで理解できなかったのか・・・と失望されるケースは稀ですし、何よりも自分が開発する内容がよくわかっていないまま提案するのは、開発側、顧客双方のためにもなりません。

また、質問をするときは

〇〇は△△という認識であっていますか?

と確認するような形で質問をします。

内容をしっかり確認した上での質問ということが伝わらなければ、
質問せずに提案している人を優先したほうが良いと判断される可能性もあると思いますので。

最後に

いくつか私が実践している方法についてご紹介させていただきましたが、この方法はより多くの人に私の技術を提供し、
満足のいくツール、システム開発を提供したい。
という想いから生まれてきました。

これからも温かみのあるシステム開発、ツール開発を提供していきたいと思います。


システム開発などのお問い合わせはこちら

IE操作メモ⑤ - 別タブで開いたHTML要素を取得する方法

IE操作時の開発メモ

f:id:sirosiro346:20171003235423j:plain

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

リンククリック後に別タブにて画面が開く場合のHTML要素取得方法

    '************************************検索実行************************************
    Dim URL As String
    URL = "http://www.jpx.co.jp/markets/index.html"
    
    '******************IEを開く******************
    Dim objIE As InternetExplorer 'IEオブジェクトを準備
    Dim objIE2 As InternetExplorer 'IEオブジェクトを準備
    Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
    objIE.Visible = False 'True:IEを表示 , False:IEを非表示

    '******************URLを開く******************
    Dim link As IHTMLElementCollection 'liのHTMLエレメントコレクションを準備
    Dim strURLOptionInfo As String 'liのHTMLエレメントコレクションを準備
    Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    
    'ページを開く
    objIE.navigate URL
    
    'ページのデータを取得するために、ページが表示されるまで待つ
    Call SysContentCls.DisplayWait(objIE)

    'objIEで読み込まれているHTMLドキュメントをセット
    Set htmlDoc = objIE.document
    
    '******************対象の子ページを開く******************
    'class : link-window link-blank
    Dim objShell As Object
    Dim htmlDoc2 As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    Dim strHTMLALL As String
    Dim tr As IHTMLElementCollection 'liのHTMLエレメントコレクションを準備
    
    'リンクをクリック
    strURLOptionInfo = htmlDoc.getElementsByClassName("link-window link-blank")(1).href
    htmlDoc.getElementsByClassName("link-window link-blank")(1).Click
    
    '別ウィンドウで開くため、別ウィンドウを特定して取得
    Set objShell = CreateObject("Shell.Application")
    Set objIE2 = objShell.Windows(objShell.Windows.Count - 1) '新しいウィンドウのオブジェクトを取得
    objIE2.Visible = False 'True:IEを表示 , False:IEを非表示
    
    'ページのデータを取得するために、ページが表示されるまで待つ
    Call SysContentCls.DisplayWait(objIE2)

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


上記の「htmlDoc2」を利用し、以下各要素の値取得方法に記載されているようなソースを活用すれば、
別タブで開いてしまった場合でも各要素の取得が可能です。
IE操作メモ② - IEから各要素を取得する方法 - MacroCat@Siro - ExcelVBAまとめ


フリーランスになった理由について

f:id:sirosiro346:20171017230313j:plain

私のことを少し知ってもらうために、フリーランスになるまでの経緯や、
なぜフリーランスになったのか?などご紹介させていただきます。
フリーランスになろうか迷っている方や、フリーランスについて知りたい方などの、
参考情報の一つになれると幸いです。

私の紹介なども含まれているため、長文です。
とにかく技術の記事のみ見たいという方は、以下カテゴリから飛べますので、
そちらに逃げてください。笑

 ・IE操作 カテゴリーの記事一覧 - MacroCat@Siro - ExcelVBA・PHP・フリーランス
 ・開発効率化 カテゴリーの記事一覧 - MacroCat@Siro - ExcelVBA・PHP・フリーランス
 ・VBA カテゴリーの記事一覧 - MacroCat@Siro - ExcelVBA・PHP・フリーランス
 ・Excel操作 カテゴリーの記事一覧 - MacroCat@Siro - ExcelVBA・PHP・フリーランス



siroってどんなひと?

とにかく面白いことが好きで、好奇心旺盛。
面白いものには飛び込む習性があります。

また、人に笑ってもらうことがとにかく好きで、
どうやったらこの人笑うかなーと常に考えて人と接してきました。笑

面白いことって具体的に何してきたの?と思う方もいるかもしれないので、
以下で簡単にご紹介します。

アルバイト①:豆腐の引売り

学生時代色んな人に会って話がしたいという想いから、様々な学生イベントに参加していたのですが、
そこでどうやったらインパクトのある自己紹介ができるか?
を考えた結果、気づいたら「豆腐の引売り」のアルバイトをしてました。

あの、パーフーと音を鳴らして豆腐を売る、アレです。笑


豆腐の引き売りの仕事は主に以下のような作業がありました。

■作業内容

 ① 朝倉庫に行って、前日の残り分を確認する
 ② 注文した商品と、前日分の残りをリアカーに詰める
 ③ 引き売りをする
 ④ 収支の報告を会社に行い、来週分の発注を行う


「自己紹介のインパクト」
だけの理由で始めた豆腐の引き売りでしたが、様々な面白い体験が待っていました。


1. 発注は自分で行い、当日売り切りの商品は売れなかった場合は買い取り

1点目の面白かった点ですが、会社から用意されたものをその日に売るのではなく、
自分で発注した商品 + 先輩が前日に売り残した商品
を売る仕事だったという点です。

また、商品の中には当日売り切り、2日で売り切り、3日で売り切り、、、と様々な商品があり、
2日、3日売り切りで売れ残って当日をむかえた商品を含む当日売り切りの商品は売らないとすべて買い取り
でした。

今思えば、なにやら炎上のにおいがぷんぷん面白い仕組みだったと思います。笑

なので、

・天候の把握
・先輩方へのまめな連絡による在庫状況の把握
・売る地域でのイベントなどの調査

など、色々と戦略を練って引き売りをしていたので、一人で商店をやっているようで
毎週ワクワクしてやっていました。
※売るための戦略も色々考えてやってましたが、長くなるのでそこは割愛

雪の日も休みはなかったので、数十個売り切れなかった場合もありましたが、
そんな日は大学の友人を家に呼んで鍋パーティをして楽しんでやっていました。

2. お客さんはとにかく人と話がしたいおばあちゃんが多い

2点目の面白かった点としては、お客さんの中で話をしたくて豆腐を買ってくれる人が多かった。
ということですね。

「たくさん買うから今日は小一時間話をさせてほしい。」とよく頼まれたりしてました。笑
悩みを聞いたり、孫の話を聞いたり、飼っている猫の話を聞いたり、自分のことを少し話したり。

いつのまにか豆腐を売ることが仕事ではなく、高い豆腐を買ってもらう代わりに満足してもらうことを意識して引き売りをしていたと思います。

なので、辞めるときも手作りのお菓子、ミサンガを作ってくれる方、家で育てているフルーツをくれる方、
記念写真がほしいとカメラを持ち出す方までいました。笑


最終的にはすごく真剣に取り組んでいる自分がいて、
そうしたら自然とお客さんが増えていて不思議な体験だった印象があります。



アルバイト②:SNSでカフェ案内をする仕事

カフェがすごく好きで、良くカフェに行ってはSNSで写真をアップしていました。
そんな時、急にこんなツイートが届きました。

「都内でカフェお探しでしたら、おすすめのカフェお調べいたしますよ!」

急に連絡がきた不思議さと、カフェを案内してくれるという期待感と、なにやら面白そうな匂い
がしたので依頼してみると、ここを紹介されました。
http://www.brooklynparlor.co.jp/shinjuku/www.brooklynparlor.co.jp

すっごくおしゃれで、ごはんもおいしくて大満足だったので、それ以降何度かカフェ案内のお願いをしていると

「もしご興味ありましたら、カフェ案内のお仕事しませんか?」
と素敵なオファーが。


当時、そこまでパソコンが得意ではなかったのですが、こんな面白い話に飛びつかないわけにはいかない使命感が芽生えたのか、
気づいたら新しいパソコンをAmazonで購入していました。

明らかに周りの人がやっていないようなバイトかつ、興味があるカフェについて、
しかもお金をもらってバイトできるなんて・・・と、本当にワクワクが止まらなかったのを覚えています。


カフェ案内の仕事は以下のような作業がありました。

■作業内容

 ・シフト時間にSkype起動 & 残作業の引継ぎ
 ・ユーザに積極的にアプローチしてカフェ案内を行う
 ・ダイレクトメッセージで依頼が来たユーザにカフェを案内する
 ・シフト時間の連絡、その他打ち合わせの参加など


ユーザに積極的にアプローチしてカフェ案内を行う
これに関してどうやればユーザに利用してもらえるか?自分が感動したあの案内をどうやれば体験させられるか?
を常に考えて働いていました。

文字打つのも当時はすごく遅くて、お客さんに待たせてしまうことも多かったですが、
時にはすごく喜んでもらえたりしてとっても楽しかったです。


とまぁ、大学時代から面白いことに飛び込む習性がありました。


なぜIT業界へ?

私は大学時代、機械工学を専攻しておりロボットの研究室にいました。
それまでは、機械設計、材料工学、流体力学、、、と、物理っぽい感じのことを勉強していたのと、
上述した通りバイトや学生イベントに力を入れていたので、プログラミングはほぼ未体験でした。

そのため、研究室で初めてアプリケーション開発に出会います。

研究の内容は割愛しますが、わからないことを調べながらも自分が書いたソースで動いたときの達成感が、
今まで感じたことないほどの衝撃でした。
達成感ってこういうことか!!!!と思ったぐらいです。

そんな衝撃もあり、
絶対にこの先も開発がやりたい!!!!
という強烈な想いから、都内のIT企業に就職しました。

企業では何をやっていたの?

グレーゾーンなので詳細はここには書けないのですが、業務系のアプリケーション開発を行っていました。
業務系と聞くと難しいイメージですが、あえて簡単に言うと、

BtoBの業務を支援するシステムの開発

です。

WEBアプリケーション開発(phpC#ASP.NET ・・・)や、Excelマクロアプリ開発がメインに、
要件定義、基本設計、詳細設計、製造、テスト、運用保守など様々なことをやっていました。

会社を辞めたキッカケ

転職しよう!いや、もう少し成長してからじゃないと・・・
いや、でも今転職しよう!

と、何回か湧き出ては消え、湧き出ては消えを最初繰り返していたのですが、
辞める直前にやっていた業務が、主な理由の一つだと思います。

私はやめる直前に以下のような業務をやっていました。
 ・他社パッケージソフトをグループ会社への導入
 ・他社パッケージソフトのグループ会社からの問い合わせ対応

あれ?開発どこ行った!!!!?

そう、そうなんです。
大好きだった開発が、全然やれていなかったんです。
え、それだけ?と思う方も多いかもしれませんが、私にとっては非常に重要なことでした。


導入においては、グループ会社の業務自体が全くと言っていいほど興味がなく、
かつ開発ではないためダブルパンチで興味がなく、頑張っても頑張っても知識が頭に入ってこない。
そんな生活が続きましたが、
社会人なんだから。
耐えることも仕事の一つ、耐えた先にしか見えないものがあるはず。
自分でやりたいことをするには、実力をつけてからでないと。

最初はそう思っていました。


ただ、業務自体は恐ろしく忙しく、体を壊しかけている自分に気づき、
なんで好きでもない業務に対してこんなに一生懸命になっているんだろう?
ここで時間をかけたことは、本当にこの先意味のあるものなんだろうか?
体を壊しかけるほど、仕事ってやるべきものなの?

と考えていた時、見透かされたように父親から、
「もっと人間らしく生きた方がいいよ。」
と言われ、機械的に仕事をこなすためだけに動いている自分、
まわりに気づかいすることすら難しくなっている自分の存在に気づき、

なんとかせねば!!!!

と、やっと動き出しました。

※それを後押しするかのように、キングコング西野さんのブログと出会い励まされたのですがその話は別の機会に。
西野さんの記事はコチラ↓
キングコング 西野 公式ブログ Powered by LINE

負のループから抜け出す方法

良くない状況から抜け出す方法ですが、私は二つしかないと思っています。
①自分を変える
②環境を変える

①で抜け出せるのがベストだと思いますが、今回の場合は、
やっている業務が2年スパンほどで自分で頑張っても業務自体を変えることがほぼ不可能かつ、
自分にそこまでのエネルギーが出せない状況だったため、
思い切って②環境を変えるを選択しました。

家族の理解があったからこそ選択できたので、本当に感謝しかないです。

環境から抜け出そう! - ①業界を変える

さぁ、環境を変えようと意気込んだものの。どう変えようか最初は悩みました。

業界を変えてみる?ゲーム好きだしゲーム業界とか?

と安易に考え、とりあえず自分の実力でゲーム業界っていけるんだろうか?
ときになったので、エージェントに足を運び相談してみたところ

「正直な話、これだと書類で9割落ちますねー。未経験からの転職だと何か実績とか、頑張りがわかるものを用意して、やっと書類通るかどうかって感じなんですよねー」
と、バッサリ言われてしまいました。笑

まーでも、普通に考えると転職って即戦力を求めているわけで、未経験なりにも戦力になれないと企業はほしくないですよね。笑
当たり前の結果だったのかもしれません。

環境から抜け出そう! - ②自分がやりたいことを自己分析

じゃあどうしようと考えたときに、もっと本質的に自分がやりたいことは何か?を考え直すことにしました。
Mindmapで考えてみたところ、以下が浮き上がってきました。
・開発がやりたい
・自分が研究時代感動したような、体験を色んな人に伝えたい
・やっぱり面白いことがしたい
・困っている人の力になりたい

そして、上記を踏まえて仕事を考えた結果、
これはもうフリーランスしかない!
と結論付け、家族に報告して翌日上司に辞めることを伝え、はれてフリーランスとなったわけです。

フリーランスって具体的に何やっているの?

私は、今までの開発経験の中でも特に感動した自動化関連の技術で、まずは感動を提供したい。
という想いから、「ExcelVBA・マクロを活用した自動化ツール、サービスの提供」
をランサーズ、クラウドワークスの二つのクラウドソーシングサービスを活用して提供しています。

なにやらカタカナばっかり出てきますね。笑

具体的にやっていることは以下の通りです。

1. マクロ、VBAExcelcsv、データなどでヒットした応募案件に対して金額、納期を提案する
2. 提示した内容で合意が取れれば仕事スタート
3. 不明点があった場合は適宜クライアントに確認しながら開発を行う
4. 仮納品
5. 仮納品結果の指摘事項をもとにプログラム修正

6. 最終納品

通常、このような形式で作業しなさいというものはなく、私はこのようなやり方をしているというだけなのですが、
必ず最終納品前に仮納品する形をとっています。

クライアントの目線に立ってみると、
顔も見えない人に作業をお願いするわけなので、当然意図したものが出来上がるのか?が一番心配だと思います。
その部分を少しでも解消できる方法はないか?と考えた結果このような形になりました。

要件を聞き、物を作り、成果物に対して対価をもらう

フローとしてはこの三つなのですが、この言葉の間にどれだけ温かみを持たせられるか?を常に意識してサービス提供をしています。
システム開発とはいえ、人から頼まれたものを人が作るわけですから。

また、いくら要件を先に確認したからと言って、クライアントが要件を文字だけで正確に伝えること、
こちらで確実に把握することはなかなか難しいです。
クライアントの思っていることが文字になっていないケースも多いので、そういった場合にも修正する時間を設けることで、
最終的に満足のいくものを提供しやすくなります。

こういったことを心掛けた結果、以下のようなコメントをいただくまでになりました。
f:id:sirosiro346:20171018221747p:plain

※それ以外で意識していることについては次回以降の記事でまとめていこうと思います。

最後に

長文にもかかわらず、ここまで読んでいただきありがとうございました。
私の個人的内容も含め、あまりまとまっていない記事となってしまったにもかかわらず読んでいただいてうれしいです。
これからはフリーランスについても少しずつ記事アップしていきますので、ご興味ある方はまた遊びに来てください。

また、ランサーズは以下アカウントにてサービス提供しています
開発依頼は コチラ
からお願いします


ありがとうございました。

siro

IE操作メモ④ - Amazon検索結果一覧取得

Amazon検索結果一覧取得

f:id:sirosiro346:20171005220852j:plain

おはようございます。MacroCatのsiroです。
前回の記事にてAmazonの検索結果一覧を取得するサンプルを載せていたかと思いますが、こちらを少し手直しして、
データ抽出の進捗などわかるようにしたサンプル作りましたのでご紹介いたします。

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

Amazon検索結果取得ツール動作イメージ

ツール実行後のイメージ
youtu.be

ソース

メイン処理

'
' 機能    :検索実行ボタン押下時の処理
'
' 引数    :
'               :
' 返り値   :
'
' 備考    :
'
Public Sub SearchBtn_Click()
    Dim startCellName As String
    Dim searchCategory As String
    Dim searchKeyword As String
    Dim searchURL As String            '検索するURL
    Dim startPage As Integer
    Dim endPage As Integer
    Dim strMessageCellName As String: strMessageCellName = "B7"
    
    startCellName = "B9" '検索結果を書き込む起点となるセル
    searchCategory = Range("C2").Value
    searchKeyword = Range("C3").Value
    startPage = Range("C4").Value
    endPage = Range("C5").Value
    
    '***********************カテゴリ入力チェック***********************
    'カテゴリが入っていない場合はメッセージ表示
    If IsNull(searchCategory) Or searchCategory = "" Then
        MsgBox "カテゴリを入力してください", vbCritical
        Range("C2").Select
        Exit Sub
    '検索キーワードが入っていない場合はメッセージ表示
    ElseIf IsNull(searchKeyword) Or searchKeyword = "" Then
        MsgBox "検索キーワードを入力してください", vbCritical
        Range("C3").Select
        Exit Sub
    '開始ページが入っていない場合はメッセージ表示
    ElseIf IsNull(startPage) Or startPage = 0 Then
        MsgBox "開始ページを入力してください", vbCritical
        Range("C4").Select
        Exit Sub
    '終了ページが入っていない場合はメッセージ表示
    ElseIf IsNull(endPage) Or endPage = 0 Then
        MsgBox "終了ページを入力してください", vbCritical
        Range("C5").Select
        Exit Sub
    '開始・終了ページの相関チェック
    ElseIf startPage > endPage Then
        MsgBox "終了ページには、開始ページ以上のページ数を入力してください", vbCritical
        Range("C5").Select
        Exit Sub
    End If
    
    searchURL = getDefaultURL(searchCategory, searchKeyword)
    
    '検索結果をクリアする処理
    Call ExcelCommonCls.selectCtrlAClear(startCellName)
    Range(strMessageCellName).Select
    
    '実行中を表示
    Range(strMessageCellName).Value = "実行中です、しばらくお待ちください (" & CStr(startPage) & "/" & CStr(endPage) & ")"
    
    '開始時刻を表示
    Range("F8").Value = Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)
    '************************************検索実行************************************
    Dim rowNo As Long: rowNo = 7
    Dim URLList() As String
    Dim i As Long
    
    'カテゴリ、キーワードを指定したAmazon検索結果をURLリストに格納
    URLList = getSelectCategoryProductsListALL(searchURL, startPage, endPage)

    '************************************結果出力************************************
    For i = 0 To UBound(URLList)
        Cells((i + 9), 2).Value = i + 1 'No
        Cells((i + 9), 3).Value = searchCategory     'カテゴリ
        Cells((i + 9), 4).Value = searchKeyword      '検索キーワード
        ActiveSheet.Hyperlinks.Add Anchor:=Cells((i + 9), 5), Address:=URLList(i)
    Next i
    
    '総件数を表示
    Range(strMessageCellName).Value = "総件数は【" & CStr(UBound(URLList) + 1) & "】件です"
    
    '終了時刻を表示
    Range("F9").Value = Hour(Time) & ":" & Minute(Time) & ":" & Second(Time)
    
    
    MsgBox "処理が完了しました"
    
End Sub


カテゴリごとのもととなるURLを取得するソース

'
' 機能    :カテゴリ、検索キーワードを指定して元となるURLを取得する
'
' 引数    :strCategoryName: カテゴリ名
'               :strKeyword          :  検索キーワード
' 返り値   :
'
' 備考    :
'
Function getDefaultURL(strCategoryName As String, strKeyword As String) As String
    getDefaultURL = ""
    
    Select Case strCategoryName
        Case "Kindle"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Ddigital-text&field-keywords=" & strKeyword
        Case "Amazonビデオ"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dinstant-video&field-keywords=" & strKeyword
        Case "デジタルミュージック"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Ddigital-music&field-keywords=" & strKeyword
        Case "Androidアプリ"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dmobile-apps&field-keywords=" & strKeyword
        Case "本"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dstripbooks&field-keywords=" & strKeyword
        Case "洋書"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Denglish-books&field-keywords=" & strKeyword
        Case "ミュージック"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%Dpopular&field-keywords=" & strKeyword
        Case "クラシック"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dclassical&field-keywords=" & strKeyword
        Case "DVD"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Ddvd&field-keywords=" & strKeyword
        Case "TVゲーム"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dvideogames&field-keywords=" & strKeyword
        Case "PCソフト"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dsoftware&field-keywords=" & strKeyword
        Case "パソコン・周辺機器"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dcomputers&field-keywords=" & strKeyword
        Case "家電&カメラ"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Delectronics&field-keywords=" & strKeyword
        Case "文房具・オフィス用品"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Doffice-products&field-keywords=" & strKeyword
        Case "ホーム&キッチン"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dkitchen&field-keywords=" & strKeyword
        Case "ペット用品"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dpets&field-keywords=" & strKeyword
        Case "ドラッグストア"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dhpc&field-keywords=" & strKeyword
        Case "ビューティー"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dbeauty&field-keywords=" & strKeyword
        Case "ラグジュアリービューティー"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dluxury-beauty&field-keywords=" & strKeyword
        Case "食品・飲料・お酒"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dfood-beverage&field-keywords=" & strKeyword
        Case "ベビー・マタニティ"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dbaby&field-keywords=" & strKeyword
        Case "ファッション"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dfashion&field-keywords=" & strKeyword
        Case "服・ファッション小物"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dapparel&field-keywords=" & strKeyword
        Case "シューズバック&バック"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dshoes&field-keywords=" & strKeyword
        Case "腕時計"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dwatch&field-keywords=" & strKeyword
        Case "おもちゃ"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dtoys&field-keywords=" & strKeyword
        Case "ホビー"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dhobby&field-keywords=" & strKeyword
        Case "ジュエリー"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Djewelry&field-keywords=" & strKeyword
        Case "楽器"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dmi&field-keywords=" & strKeyword
        Case "スポーツ&アウトドア"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dsporting&field-keywords=" & strKeyword
        Case "カー・バイク用品"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dautomotive&field-keywords=" & strKeyword
        Case "DIY・工具"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Ddiy&field-keywords=" & strKeyword
        Case "大型家電"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dappliances&field-keywords=" & strKeyword
        Case "クレジットカード"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dfinancial&field-keywords=" & strKeyword
        Case "ギフト券"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dgift-cards&field-keywords=" & strKeyword
        Case "産業・研究開発用品"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dindustrial&field-keywords=" & strKeyword
        Case "Amazonパントリー"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dpantry&field-keywords=" & strKeyword
        Case "Amazonアウトレット"
            getDefaultURL = "https://www.amazon.co.jp/s/&url=search-alias%3Dwarehouse-deals&field-keywords=" & strKeyword
        Case Else
            getDefaultURL = ""
    End Select
    
    Debug.Print getDefaultURL

End Function


AmazonからURLを取得し、リストに格納するソース

'
' 機能    :URL、開始ページ、終了ページを引数に、製品のリンク一覧を取得する
'
' 引数    :strURL          : カテゴリごとのもととなるURL
'               :intStartPage  :  開始ページ
'               :intEndPage    : 終了ページ
' 返り値   :
'
' 備考    :1 ~ 400ページ(最大表示ページ数)まで遷移してリストに格納
'
Function getSelectCategoryProductsListALL(strURL As String, intStartPage As Integer, intEndPage As Integer) As String()
On Error GoTo getSelectCategoryProductsListALL_Err
    
    Debug.Print "処理開始:" & Time
    
    '******************IEを開く******************
    Dim objIE As InternetExplorer 'IEオブジェクトを準備
    Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
    objIE.Visible = True 'True:IEを表示 , False:IEを非表示
        
    '******************指定したページ数分(1 ~ 400)が最大URLデータ取得処理をループ******************
    Dim strlURL_1() As String 'URL格納用
    ReDim strlURL_1(0)
    Dim pageNo As Integer
    Dim listNo As Integer: listNo = 0 '配列の要素数更新用
    Dim el As IHTMLElement 'IHTMLエレメントオブジェクトを準備
    Dim URL_el As IHTMLElementCollection 'liのHTMLエレメントコレクションを準備
    Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    
    '開始ページ、終了ページ
    For pageNo = intStartPage To intEndPage
    
        '実行中を表示
        Range("B7").Value = "実行中です、しばらくお待ちください (" & CStr(pageNo) & "/" & CStr(intEndPage) & ")"
    
        '検索キーワードを指定したURLを開く
        objIE.navigate strURL & "&page=" & CStr(pageNo)
    
        'ページのデータを取得するために、ページが表示されるまで待つ
        Call SysContentCls.DisplayWait(objIE)
    
        'objIEで読み込まれているHTMLドキュメントをセット
        Set htmlDoc = objIE.document
        
        '商品のli要素を取得
        Set URL_el = htmlDoc.getElementsByClassName("a-link-normal s-access-detail-page  s-color-twister-title-link a-text-normal")
        
        'liの数分処理実行
        For Each el In URL_el
            
            If listNo = 0 Then
                
                strlURL_1(listNo) = el.href
            
            Else
                '要素数を更新
                ReDim Preserve strlURL_1(listNo) 'Preserveは今まで格納した値を残したままにするために記述
                
                strlURL_1(listNo) = el.href
                
            End If
            
            Debug.Print el.href
            
            '要素数を更新
            listNo = listNo + 1
            
        Next el
    
    Next pageNo
    
    'IEを閉じる
    objIE.Quit
    
    '戻り値にURLリストを入れる
    getSelectCategoryProductsListALL = strlURL_1
    
    Debug.Print "全てのリンク取得OK:" & Time
    Exit Function
    
getSelectCategoryProductsListALL_Err:
    MsgBox "エラー発生"

End Function

※objIE.VisibleがTrueの場合はIEが視覚的に見えるようになり、Falseの場合はバックグラウンド処理となるため、
 IEが開いていないように見えます。



検索結果を最初にクリアする処理

'
' 機能    :選択したセルからCtrl + Shift + ↓ & → のデータをクリアする
'
' 引数    :selectCellName:起点となるセル
'
' 返り値   :
'
' 備考    :
'
Sub selectCtrlAClear(selectCellName As String)
    Range(selectCellName).Select
    Range(Selection, Selection.End(xlDown)).Select
    Range(Selection, Selection.End(xlToRight)).Select
    Selection.ClearContents
End Sub

IE画面描画後にページが表示されるまで待つ処理

'
' 機能    :IEからページが帰ってくるまで待機
'
' 引数    :InternetExplorer
'
' 返り値   :
'
' 備考    :
'
Sub DisplayWait(objIE As InternetExplorer)
    
    Dim timeOut As Date
    
    '完全にページが表示されるまで待機する
    timeOut = Now + TimeSerial(0, 0, 20)
    
    Do While objIE.Busy = True Or objIE.readyState <> 4
      DoEvents
      Sleep 1
      If Now > timeOut Then
        objIE.Refresh
        timeOut = Now + TimeSerial(0, 0, 20)
      End If
    Loop
    
    timeOut = Now + TimeSerial(0, 0, 20)
    
    Do While objIE.document.readyState <> "complete"
      DoEvents
      Sleep 1
      If Now > timeOut Then
        objIE.Refresh
        timeOut = Now + TimeSerial(0, 0, 20)
      End If
     Loop

End Sub

画面が表示される前に、画面の要素を取得しようとするとエラーになってしまいます。
そのため、上記のようなソースが必要です。


エラー処理やら、細かい部分を省いていますが上記ソースを標準モジュール内に入れていただければ動くと思います。
ご参考になればと思います。

siro

Excel使用速度を5倍に引き上げる方法

以前にInstagramにてExcel効率化の需要について聞いてみたんですが、
それなりにいいねがあったのでまとめてみました。



f:id:sirosiro346:20170316003641p:plain


目次

Excelショートカットキー既存編

Excelで簡単に一覧化しました。下記ご確認ください。

マウス操作を無くすほどに操作速度は上がっていくと思います。

※こちらは既存のショートカットのみで覚えた方がいいものをピックアップしています。

f:id:sirosiro346:20170315235420p:plain


Excelショートカットキーカスタマイズ編

ここからが本番です。

ショートカットキーって使いたい機能を覚えようとすると、平気で3つボタンが必要だったりしませんか?

使い続ければそれなりに早くなるかもしれませんが、よく使う機能だったりすると指つりますよね?笑

そんな時は、クイックアクセスツールバーに登録しましょう。ボタン2つで実行ができるようになります。


クイックアクセスツールバーとは?

画面左上に存在するボタンのショートカットキーです。

設定しておくとなんと、『Alt + 数字』で利用できるんです。


クイックアクセスツールバー設定方法①
利用する機能のボタンで右クリックし、『クイックアクセスツールバーに追加する』を選択するだけです。

※例では、セル結合をクイックアクセスツールバーに追加しています。

f:id:sirosiro346:20170316000007p:plain
f:id:sirosiro346:20170315235941p:plain

上記設定すると、『Alt + 1』でセル結合ができるようになります。

クイックアクセスツールバー設定方法②
リボンにない項目は追加できないの?と思われた方もいると思いますが、追加可能です!
クイックアクセスツールバーに追加すると、左上に追加されるのですがそこで右クリックし、
「クイックアクセスツールバーのユーザ設定」
を選択することで、管理用のウィンドウを開くことができます。
f:id:sirosiro346:20171008063320p:plain

そのウィンドウで追加したいものを探して追加することができます。
リボンに載っていないもので便利なものだと、
・行挿入
・行削除
・列挿入
・列削除

ここら辺が便利だと思います。
f:id:sirosiro346:20171008063823p:plain


クイックアクセスツールバーおすすめ設定

私の場合は以下のように設定しています。

基本的にはよく利用する機能をクイックアクセスツールバーに追加し、

使う順に1から設定すればかなり効率化できるかと。

f:id:sirosiro346:20170315235920p:plain
f:id:sirosiro346:20170316000012p:plain

自分以外にあまり使っている人を見たことないので、覚えておくとちょっぴり注目されるかもしれませんね。

さらに効率化したい方

実はこのクイックアクセスツールバーにマクロをボタンにして追加が可能です。

そのため、よく使う機能はマクロ化し、クイックアクセスツールバー化しておくと、

限りなく速度を早められます。

・よく使うテーブル構造をマクロ化しておき、ボタン一つで挿入

・アクティブになっているシートをコピーして新規シート作成

etc...



マクロを利用したクイックアクセスツールバー追加方法については、次回以降の記事でまとめようと思います。
ではではーノシ

siro

ExcelVBAで【ユーザフォーム】を利用したデータ登録サンプルを作ってみた

ExcelVBAで【ユーザフォーム】を利用したデータ登録サンプルを作ってみた

f:id:sirosiro346:20170923203013j:plain

おはようございます。siroです。
ランサーズにてExcelの画面(ユーザフォーム)を利用したツール開発の案件が出ていたので、
サンプルを一旦作ってみました。

出来上がりイメージ

まずは、作ったツールを動画でご紹介します。
youtu.be

・画面で入力されていない項目があった場合は、エラーメッセージ表示
・画面で入力したデータが、新規登録ボタンでExcelに書き込まれる
・既にデータが登録されていた場合は、その一つ下の行にデータ登録する

上記3点を実現しています。

どうやって作る?

以下のような流れで作りました。

① ユーザフォームを新規作成し、部品 (ラベル、テキストボックス、ボタン etc...) を配置
② 新規登録ボタン、閉じるボタン押下時の処理をプログラミング
③ 簡単な動作テスト

ユーザフォーム新規登録方法

① VBEを 「Alt + F11」で開く
② プロジェクトエクスプローラーで右クリックし、挿入から「ユーザフォーム」を選択
f:id:sirosiro346:20171007002559p:plain

ユーザフォームへの部品配置方法

表示タブのツールボックスを表示
f:id:sirosiro346:20171007002547p:plain
② 配置したい部品 (ラベル、テキストボックス、ボタン etc...)を選択し、配置したい場所を選んで配置
f:id:sirosiro346:20171007002733p:plain

部品のプロパティ設定

配置した部品は、デフォルトだと部品の名前が識別しにくいものになっているため、
最低限部品名をプロパティ値を変更して設定
※プロパティではほかにも文字サイズや、色、その他さまざまな設定変更が可能です

① 設定したい部品を選択する (ここではNoのラベルを選択しています)
f:id:sirosiro346:20171007003006p:plain

オブジェクト名を識別可能な値に変更 (ここではNoのラベルなので、「No_ + Lbl」としています。※末尾でラベルであることがわかるようにしています
※個人的には以下のようなコーディングルールを決めておくとよいと思います。
 ・ラベル      :任意の値 + 「 _ 」 + Lbl
 ・テキストボックス :任意の値 + 「 _ 」 + Txt
 ・コンボボックス  :任意の値 + 「 _ 」 + Cmb
 ※任意の値には、内容がわかるものを入れます
 
f:id:sirosiro346:20171007003133p:plain

こうすることで、

   Range("B6").value = No_Lbl.Value

のように、値を取得して利用することができます。
上記を利用し、テキストボックス、ラベル、ボタンを準備します。

ボタンのクリックイベントを書く

ボタンのクリックイベントを書く場合は、VBEにてユーザフォームを開き、
クリックイベントを書きたいボタンをダブルクリックします。
※ダブルクリックすることで、クリック用のメソッドが自動的に作られます。

クリック前
f:id:sirosiro346:20171007003514p:plain

クリック後
f:id:sirosiro346:20171007003539p:plain


この中でクリック時の具体的な処理を書いていきます。
※画像は既にソースが書いてありますが、クリック処理を新規に作る場合は、
 内容が書いていない状態でクリック用のイベント処理だけできます。

実際のソースコード一覧

ソースコード一覧は下記となります。

'閉じるボタンクリック時の処理
Private Sub Close_Btn_Click()
    
    'フォームを閉じる
    Unload NewRegist_Frm

End Sub

'新規登録ボタン押下時の処理
Private Sub regist_Btn_Click()
    Debug.Print "エラーチェック"
    
    'エラーチェック
    If No_Txt.Value = "" Then
        MsgBox "Noを入力してください", vbExclamation
        No_Txt.SetFocus
        Exit Sub
    ElseIf Title_Txt.Value = "" Then
        MsgBox "タイトルを入力してください", vbExclamation
        Title_Txt.SetFocus
        Exit Sub
    ElseIf Address_Cmb.Value = "" Then
        MsgBox "宛先を選択してください", vbExclamation
        Address_Cmb.SetFocus
        Exit Sub
    ElseIf TextBody_Txt.Value = "" Then
        MsgBox "メール本文を入力してください", vbExclamation
        TextBody_Txt.SetFocus
        Exit Sub
    End If
    
    Call excelRegist(No_Txt.Value, Title_Txt.Value, Address_Cmb.Value, TextBody_Txt.Value)
    
    'フォームを閉じる
    Unload NewRegist_Frm

End Sub

'ユーザフォームオープン時の処理
Private Sub UserForm_Initialize()
    'ドロップダウンリストに初期地設定
    Address_Cmb.AddItem "XXXXXXXXXXXXXXX@gmail.com"
    Address_Cmb.AddItem "YYYYYYYYYYYYYYY@gmail.com"
End Sub

'Excelにデータ登録
Sub excelRegist(strNo As String, strTitle As String, strAddress As String, strTextBody As String)
    '最終行の取得
    Dim rowNo As Long
    Range("B1047586").Select '最終行を選択
    Selection.End(xlUp).Select
    rowNo = ActiveCell.Row + 1

    ActiveSheet.Range("B" & CStr(rowNo)).Value = strNo
    ActiveSheet.Range("C" & CStr(rowNo)).Value = strTitle
    ActiveSheet.Range("D" & CStr(rowNo)).Value = strAddress
    ActiveSheet.Range("E" & CStr(rowNo)).Value = strTextBody
End Sub

エラー処理も分けた方が良かった気がしますが、こんなソースで実現できます。
ユーザフォームを作って試してみたいという方、ぜひ試してみてください!!

質問についてはコメントにてご連絡ください。

上記のような画面を使ったシステム開発などを依頼されたい方は、以下ランサーズからご依頼ください。
www.lancers.jp

ではではーノシ

IE操作メモ③ - Amazonから検索結果一覧取得!

IE操作時の開発メモ

f:id:sirosiro346:20171005220852j:plain

コチラの記事は、ブログ管理人の開発メモです。
開発する際や、再度WEBから検索する手間を省くため、ソース + 一言コメントで記事を書いています。

Amazonからのデータ一覧取得方法

'
' 機能    :URL、開始ページ、終了ページを引数に、製品のリンク一覧を取得する
'
' 引数    :strURL          : カテゴリごとのもととなるURL
'               :intStartPage  :  開始ページ
'               :intEndPage    : 終了ページ
' 返り値   :
'
' 備考    :1 ~ 400ページ(最大表示ページ数)まで遷移してリストに格納
'
Function getSelectCategoryProductsListALL(strURL As String, intStartPage As Integer, intEndPage As Integer) As String()
On Error GoTo getSelectCategoryProductsListALL_Err
    
    Debug.Print "処理開始:" & Time
    
    '実行中を表示
    Range("B6").Value = "実行中です、しばらくお待ちください (1/5)"
    
    '******************IEを開く******************
    Dim objIE As InternetExplorer 'IEオブジェクトを準備
    Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
    objIE.Visible = False 'True:IEを表示 , False:IEを非表示
    
    '******************指定したページ数分(1 ~ 400)が最大URLデータ取得処理をループ******************
    Dim strlURL_1() As String 'URL格納用
    ReDim strlURL_1(0)
    Dim pageNo As Integer
    Dim listNo As Integer: listNo = 0 '配列の要素数更新用
    Dim el As IHTMLElement 'IHTMLエレメントオブジェクトを準備
    Dim URL_el As IHTMLElementCollection 'liのHTMLエレメントコレクションを準備
    Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    
    For pageNo = intStartPage To intEndPage
    
        'ページ数をしてURLを開く
        objIE.navigate strURL & "&page=" & CStr(pageNo)
    
        'ページのデータを取得するために、ページが表示されるまで待つ
        Call SysContentCls.DisplayWait(objIE)
    
        'objIEで読み込まれているHTMLドキュメントをセット
        Set htmlDoc = objIE.document
        
        '商品タイトルのリンク要素を取得
        Set URL_el = htmlDoc.getElementsByClassName("a-link-normal s-access-detail-page  s-color-twister-title-link a-text-normal")
        
        'リンクの数分処理実行
        For Each el In URL_el
            
            If listNo = 0 Then
                
                strlURL_1(listNo) = el.href
            
            Else
                '要素数を更新
                ReDim Preserve strlURL_1(listNo) 'Preserveは今まで格納した値を残したままにするために記述
                
                strlURL_1(listNo) = el.href
                
            End If
            
            Debug.Print el.href
            
            '要素数を更新
            listNo = listNo + 1
            
        Next el
    
    Next pageNo
    
    'IEを閉じる
    objIE.Quit
    
    '戻り値にURLリストを入れる
    getSelectCategoryProductsListALL = strlURL_1
    
    Debug.Print "全てのリンク取得OK:" & Time
    Exit Function
    
getSelectCategoryProductsListALL_Err:
    MsgBox "エラー発生"

End Function


ページ数文のloop処理
開くURLに「&page=ページ数」を指定しています

        'ページ数をしてURLを開く
        objIE.navigate strURL & "&page=" & CStr(pageNo)

重要なところはココ!

        '商品タイトルのリンク要素を取得
        Set URL_el = htmlDoc.getElementsByClassName("a-link-normal s-access-detail-page  s-color-twister-title-link a-text-normal")

ソースの美しさはさておき、これで取得できます!

また、このクラス名はGoogleChromeで「Ctrl + Shift + I」を押して
デベロッパーツール」を開き、右上のエレメントを選択してHtmlを見れるボタンを押してから、取得したい項目を左側で選択すれば、
その要素のIDやらclass等が簡単に確認できます!
Excelでやる場合に限らず、WEBスクレイピングやるならこの確認方法は必須!!

エレメントを選択ボタン
f:id:sirosiro346:20171005221619p:plain


商品タイトル選択後のイメージ
f:id:sirosiro346:20171005221630p:plain

idで指定する場合、classで指定する場合、Tagで指定する場合それぞれ取得方法が違うため、
適宜変えていく必要がある!
IEから各要素(id , class , tag)を取得する方法は以下にまとめてます

siroexcelvba.hatenablog.com


ではではーノシ

IE操作メモ② - IEから各要素を取得する方法

IE操作時の開発メモ

f:id:sirosiro346:20171004002040j:plain

コチラの記事は、ブログ管理人の開発メモです。
開発する際や、再度WEBから検索する手間を省くため、ソース + 一言コメントで記事を書いています。

IEから各要素の値取得方法

        Dim objIE As InternetExplorer
        Dim objElCol As IHTMLElementCollection
        Dim htmlDoc As HTMLDocument

        'IEを開く
      Dim objIE As InternetExplorer 'IEオブジェクトを準備
      Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
      objIE.Visible = True 'True:IEを表示 , False:IEを非表示
        
    'URLを開く
        objIE.navigate strURL("http://www.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")

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

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

        '要素取得
        Set objElCol = htmlDoc.getElementsByTagName("a") 'タグ aやliやdivなど
        Set objElCol = htmlDoc.getElementsByClassName("txt-10-bottom") 'class名
        Set objElCol = htmlDoc.getElementById("searchBtn") 'id名

基本はgetElement(s)ByXXXXXXXXで取得だけど、
Idの場合のみ「getElement」でそれ以外が「getElements」に注意が必要
classは複数同じ場合あるけど、Idは基本一意だからElementになるようですね。

ではではーノシ