2011年6月12日日曜日

500時間の行方

8時間。

私が平日仕事に費やしている時間です。
残業はなし、業務改善と題してマクロを使ったツールを作ったり、業務要件をまとめたり、業務マニュアルを作ったりしています。
メインの仕事はマクロの作成になっている今日この頃。
少し前まではそれでもやりがいを感じていたし、実際プログラミングする時に浮上する課題の解決が楽しくもありました。
しかし最近、このメインの仕事がどうにも楽しめなくなってきました。
ストレートに言うとつまんないのです。

同じようなプログラムの流用でだいたいやりたいことができるようになってしまいました。
ずっと同じ部署で仕事をしているので案件も似たり寄ったり。
だからといってその流用しているプログラムをパッケージ化しようとか、クラスにしようとか、そこまでは思えない・・・これは単にやる気の問題なのかもしれませんがね。

そして残念なことに、今の仕事場には今かかえている以上の仕事はありません。
今でも私は時間を持て余しているのであちこちの業務をつついてみては仕事を拾ってくる、そんなやりかたをしています。
つまりやろうと思わなければ何も仕事が無いのです。

今の仕事は契約で行っており、今年9月一杯までがその期間です。
今が6月、つまりあと3ヶ月ちょっとこの仕事を続けることになります。
1日8時間、1ヶ月160時間、3ヶ月ちょっとで500時間ぐらいでしょうか。


仕事があるだけでも幸せな世の中なのかもしれませんが、お金がもらえるってことの前にお金では買えない自分の時間を提供しています。
有限な私の時間ですから、私はもっと有意義な時間の使い方をしたいと思うのです。
さて、どうしたらいいのでしょう。


まだ次のステップはみえていません。
次の扉はどこに?

2011年5月10日火曜日

VBAで図形描画

業務マニュアルを作成していると業務フロー図を描くことがしばしばあります。
フロー図を描くための便利なソフトもありますが、みんなが使えるお手軽ソフトということでExcelを使って描くことが多いです(恐ろしく効率が悪いので私は好きじゃないけどね)。

そこで、どうやったら簡単に図形描画ができるかなと考えるわけです。


ワークシートにあるデータの個数分だけ図形を作成し、セルのデータを図形のテキストとして挿入する


こんな要件で作ることにしました。
使う部品は2つ。

  • 対象となるデータが入力された範囲をループする
  • 取得した内容で図形を作成する

使えるプログラムは書きためておきたいと思っているので部品であることがポイントです。
現段階ではこれから記述する内容になっていますが、もっと賢い書き方があるかもしれないし、部品にすべきポイントが違っているかもしれません。
どうであれ、書かないことには上達しません。

ということで。






○部品1:対象となるデータが入力された範囲をループする

Sub データ範囲の繰り返し処理()

  '処理開始位置行
  Dim i As Integer
  '処理終了位置行
  Dim m As Integer
  '処理対象カウンタ
  Dim cCNT As Integer

  '条件:処理開始位置をセレクトした状態にする

  i = Selection.Row

  Selection.End(xlDown).Select
  m = Selection.Row

  For cCNT = i To m

    'ここに処理を記述
    Debug.Print cCNT

  Next cCNT

End Sub





○部品2:取得した内容で図形を作成する


Sub リストから図形を作成する()

  '作成した図形
  Dim myShape As Shape

  '操作対象ワークシート
  With ActiveSheet

    '作成する図形のタイプ,表示位置TopLeft,サイズ幅高さ
    '四角形:msoShapeRectangle
    Set myShape = .Shapes.AddShape(msoShapeRectangle, 200, cCNT * 25, 100, 25)

    '参照したセルの値を図形に挿入
    myShape.TextFrame.Characters.Text = .Cells(cCNT, 2).Value

    'テキスト表示位置
    myShape.TextFrame.HorizontalAlignment = xlHAlignCenter

  End With

End Sub





○フュージョン!!:要件を実現する(リストデータから図形を作成)

Sub リストから図形を作成する()

 '処理開始位置行
  Dim i As Integer
  '処理終了位置行
  Dim m As Integer
  '処理対象カウンタ
  Dim cCNT As Integer

  '条件:処理開始位置をセレクトした状態にする

  i = Selection.Row

  Selection.End(xlDown).Select
  m = Selection.Row

  For cCNT = i To m

  '作成した図形
    Dim myShape As Shape

    '操作対象ワークシート
    With ActiveSheet

      '作成する図形のタイプ,表示位置TopLeft,サイズ幅高さ
      '四角形:msoShapeRectangle
      Set myShape = .Shapes.AddShape(msoShapeRectangle, 200, cCNT * 25, 100, 25)

      '参照したセルの値を図形に挿入
      myShape.TextFrame.Characters.Text = .Cells(cCNT, 2).Value

      'テキスト表示位置
      myShape.TextFrame.HorizontalAlignment = xlHAlignCenter

    End With

 Next cCNT

End Sub




依存しまくっている部品ですね 苦笑。

繰り返し処理はDo LoopよりForで処理した方が速いんだとか(大村あつしさんの本で読みました)。
以前はDo Until cells(cCNT,2).value = ""を使ってループ処理を書いていたのですが、最近はForを使って書くようにしています。

VBAは私が楽に仕事をするための道具です。
なのであくまでも"道具"として、磨きをかけていこうかなと思っています。
("手段"が"目的"になりがちな自分へのメッセージを改めて。笑)

2011年5月9日月曜日

ものごとがうまく進まないとき

つい最近まで仕事に行き詰まっていて、毎日もんもんとしていました。
夜眠れないこと、朝目覚ましより先に起きてしまうことまでもストレスで、そうなると日常にあふれることの多くはストレスでしかなくなります。
自分が良くない状態にあることはわかっていますが、「脱却したい、でもそれができない」という状態であることもストレス・・・もうどうしようもないという状態でした。

今回このような状況に陥ったのはおそらく仕事が原因のひとつだと思っています。
また同じ状況に陥ることがないように、また陥ってしまった場合にどうすればよいか、少しでもよい方向に自分を導けるように、ここに記しておこうと思います。


スパイラルの始まり

私は意味のない仕事をするのが嫌いです。
多くの人はそうだと思いますが、実際現場にはその意味がわからない仕事というのが転がっているものです(少なくとも私の派遣先現場には)。
そんな仕事でも要求されればやらなくてはなりません。でもやる気は全く起きません。
そこで私は仕事の意味や目的を自分で創りだしてしまいます。
そうすることでひとまず目の前の仕事を完了させるだけのエネルギーを捻出するのです。


でもこんな仕事のやり方をしていると無理が生じてきます。
だって本当はやりたくない仕事に無理矢理理由をつけているんですもの。
このまま理由を自分に押し付けてやる気を保とうとしていると、おかしな精神状態になります。
無駄に高まった意欲と目の前にある重みのない仕事とのギャップが吸収できなくなるのです。


仕事が進まない、初期の対応

抱えているタスクに疑問があるのなら、それに理由をつけて取り掛かる前にその仕事の意味を明確にすべきです。
業務の担当者に疑問点をぶつけてみる、本当にすべきだと思う仕事内容を提案してみる、そういうプロセスなしに言われたままの仕事を自分なりの解釈で進めていてもきっといいものはできません。
5分くらい担当者と話してみる、そんなことでもやもやが晴れることも多いです。



それでも納得がいかない時は少し先を見る

ひとまず目の前の仕事の目的を確認できた、それでも腑に落ちない何かがある場合。
私はなんのためにこの仕事をしているんだろう、漠然とした不安にかられます。
一応目的は明確化されたものの、それだけを見て仕事をすることに限界を感じてしまいます。
すると今度は漠然とした不安に襲われてまた仕事が進まなくなってしまうのです。
そんな時はその仕事のさらに先にあるものに目を向けてみることが大事だと思います。
(「そんな時」にならなくても常にそうあれることが私の理想ですが。)
目の前のことばかりを見て疲れてしまった眼の筋肉を和らげるように遠くを見てみる。
すると強ばっていた筋肉がほぐれるように楽になります。
いい意味で、仕事がどうでもよくなります。
仕事をすることが私の目的ではなく、仕事の先にある何か、例えば「車を買いたい!」っていう希望だったり、「もう少し大きなチームで仕事をしてみたい!」という野望だったり、そういうものを実現させるためのプロセスのほんの一部でしかないのです。
そのほんの一部のプロセスにも私という資本を費やし、時間を費やしています。
必要なプロセスであることが確かだとしても、そこでもんもんとすることはあまり賢い活動ではないと思うのです。

ちなみにこの考え方を教えてくれたのは松田公太さんの本でした。
もんもんとする私を見て知り合いの方が紹介してくれた本です。


目標はある、だけど何をしたらいいんだろう

先にある目標に向かって進もうとしても一体何をすればいいのかわからない、そんな状況に陥りました。
考えても考えても具体的な行動が思いつきません。
やりたい!というエネルギーはあるのにそれを行動に移せないことがまたストレスになってしまいます。

やりたいことがわからないとき、それはアウトプットをするためのインプット量が足りていないのだと思います。
一生懸命考えてもどうにもならないのは、自分の中にある知識や経験からでは出力できない次元のことをアウトプットしようとしているのだと思うのです。
具体的には新しい知識であったり、アウトプットの手法であったり様々だと思いますがいずれにせよ今いる自分のキャパには存在しない要素を取り込むことで「何か」を形にできると思います。

人に会って話を聞いてもらいアドバイスをいただく、先人の知恵や経験に学ぶ(本を読む)などいろんなやり方があると思います。
私はよく「技術力がないから解決できないんだ」と技術書を読んでいましたが、それは単に目の前のタスクを完了させるために必要なものであり、長期的な課題に取り組むために必要な要素ではないと思います。
実際、そんな状況で技術書を読んでも集中できないし、身にならないのが事実です 苦笑



仕事を発端に何も解決できない自分としばらく時間を共にしましたが、それも無駄ではなかったと思います。
こうして直面した課題に対しどう向き合うかを考えるきっかけになりました。
そしてきっと今度は今よりもう少し直面する課題が大きくなっているだろうと、そう思っています。

2011年4月21日木曜日

VBAエキスパート、合格はしたけれど。

このところの私はもっぱらVBAでのプログラミングがお仕事。
そこでその実力やいかに、と先日VBAエキスパートという試験を受けてきました。
決意表明の記事もエントリしてましたね。

ExcelVBAベーシック 資格試験


資格はオデッセイコミュニケーションズという会社が発行しています。

「VBAエキスパート公式サイト」

実際に試験が行われるのは委託されている各地の試験会場で、資格取得講座を開いている学校である場合がほとんどのようです。
私は実施日数の多さと交通の便から新宿のテストセンターで受験することにしました。
この試験会場は都内では多分一番VBAエキスパート試験の実施をしている会場だと思います。
土曜日も受験ができたのがありがたかったです。

「新宿駅西口テストセンター」

試験は選択式で、PC画面から入力して解答する方式でした。
途中、私も含め数名の方のパソコンでアプリケーションがフリーズしており、試験よりも試験を実施しているアプリがどうなってるのか気になったりもしました 笑
試験の読み込みの遅さや画面遷移の遅さ、フリーズなど気になる現象がいくつかあったのですがあれはいったいどんな構造になっているのでしょうね・・・

脱線しましたが、試験は時間を持て余してしまうくらい簡単でした。

感覚では。

というのも、試験終了後にすぐに試験結果がわかるのですが、その結果が予想を遥かに下回っていたのです。


手応えだとほぼ満点に近いだろうなという感覚でしたが実際は満点1000点中825点。
しかも分野によっては50%を切る正答率なのです。
自分が理解していることにムラがあることがよくわかりました。
独学でもそれなりに体系的に習得してきたつもりでしたが、そうではなかったようです。
内容をみてみると、高得点を出せている分野は仕事でよく使うものだったりします。
つまり使わないと覚えないってことですね、当たり前ですが。

逆に言うと覚えたいんだったら使いまくれ!ってことです。
今回の試験は正答率80%ちょい、という期待はずれな結果でしたがまた次に試験を受けるときはそれ以上の正答率を目指したいです。



もちろん、この次はExcelVBAStandard を受験します(今回受けたのはExcelVBABasic)。
Excel周りのお仕事はささっと終わらせちゃう、しかも綺麗!そんな仕事の仕方が好きです。

2011年4月7日木曜日

VBAでJavaScriptが埋め込まれたリンクをクリックする

仕事場で使用されている業務システムがInternetExplorer6クライアントで動いており、私はこのIE上に表示されるコンテンツをVBAで取得するという仕組みを作っています。



tableタグやinputタグ内のコンテンツは難なく取得できたのですが、リンク先の画面からデータを取得するというところで行き詰まってしまいました。

だってリンクがクリックできないんだもん 笑
(URLを直接指定するのではなくリンクからでないと遷移できない画面なのです)

inputタグのsubmitボタンは簡単にクリックできるのですが、aタグに埋め込まれたリンクがクリックできませんでした。

そこでいつものあのサイトにたどり着くだろうなと思いつつググったわけです。
やはり行き着いたのはこのサイトでした。

「AB型の変わり者 三流プログラマー Ken3のHP」

私がVBAでIEを操作できるようになったのはこのサイトのおかげです。

もともと知人の方がVBAでWebページを操作するという仕事をしていらっしゃるという話を聞いたことがあり、VBAでWebページが操作できることは知っていました。

それを身につけるに至ったのは、仕事場の業務システムリリースにあたって大量のデータをクリーニングのためにチェックしていた際、この作業はVBAで処理できるんじゃないか、と思い立ったからでした。

そこから私のVBAとIEの物語が始まりました。

IEで動く業務システムを支配下に置く(?)ことに快感を覚え、またこのプログラムによっていろんな業務処理が効率化できそうだということで、VBAのツール作成依頼があちこちから湧いてきました。

今回のツール作成もその一つです。

さて、以下プログラムの紹介です。

VBAからIEブラウザ上のJavaScriptのリンクをクリックします。

-----------------------------------------------------------------------------------

1.リンク先アドレスの確認
まずはリンク先のURLがプログラム上でどう読み込まれるのかを把握します。
対象のWebページのHTMLソースを参照すればリンク先のアドレスを知ることはできますが、プログラム上で処理する場合のアドレスと異なっている場合があります。
確実に操作するためには先にリンク先のアドレスを調べた方がよさそうです。


Option Explicit

'-----変数-----

'IEオブジェクト
Dim objIE As Object

'処理対象のリンクカウンタ
Dim i As Integer
'--------------


'----------------------------------------
'アドレスの確認
'----------------------------------------
'リンク先アドレスを文字列で取得し、イミディエイトウィンドウに表示する

Sub CheckAddress()

'InternetExplorerオブジェクトを生成するサブルーチン呼び出し
Call CreateIE

'生成したIEオブジェクト上で処理対象のURLを指定し、遷移
objIE.navigate "http://oirnao.blogspot.com/"

'ページ読込待機のサブルーチン呼び出し
Call WaitIE

'IEオブジェクト内の全リンクをチェックし、イミディエイトウィンドウにリンク先アドレスを表示
For i = 0 To objIE.document.Links.Length - 1
      
        'イミディエイトウィンドウに表示
        Debug.Print objIE.document.Links(i).href
      
    Next i
  
    '生成したIEオブジェクトを閉じる
    objIE.Quit

End Sub
'----------------------------------------
'End Of アドレスの確認
'----------------------------------------


処理結果をイミディエイトウィンドウで確認するとクリックしたいアドレスが表示されているはずです。



HTMLソースを参照すると大文字で入力されている内容が実は小文字だったりします。
HTMLソースだと"JavaScript"~となっているところが"javascript"~というように。
この大文字小文字の違いで意図したように処理されないという事象が発生するので先にアドレスを確認します。

2.指定したリンクのクリック
1.リンク先アドレスの確認で取得したリンク先アドレスをプログラムに埋め込みます。
ここでは仮にリンク「javascript:openwinA('5');」をクリックするものとします。


'----------------------------------------
'リンクのクリック
'----------------------------------------
'指定したリンクをクリックする
Sub ClickLink

'InternetExplorerオブジェクトを生成するサブルーチン呼び出し
Call CreateIE

'生成したIEオブジェクト上で処理対象のURLを指定し、遷移
objIE.navigate "http://oirnao.blogspot.com/"

'ページ読込待機のサブルーチン呼び出し
Call WaitIE

'IEオブジェクト内のリンクをチェックし、クリックしたいリンクを探す
For i = 0 To objIE.document.Links.Length - 1
      
        '取得したリンク先アドレスを文字列単位で比較
        If objIE.document.Links(i).href = "javascript:openwinA('5');" Then
        
          'クリック対象だったらクリックする
            objIE.document.Links(i).Click
          
            'ループを抜ける
            Exit For
          
        End If

    Next i

End Sub
'----------------------------------------
'End Of リンクのクリック
'----------------------------------------


0.補足
上記で使用しているサブルーチンです。


'----------------------------------------
'IEオブジェクト生成
'----------------------------------------
'Internet Explorerのオブジェクトを生成する
Sub CreateIE()
  
    'IEオブジェクトを生成
    Set objIE = CreateObject("InternetExplorer.Application")
  
    'IEオブジェクトを可視化する
    objIE.Visible = True
  
    'IEオブジェクト画面の表示位置(左上の座標)とサイズ(高さ・幅)を調整
        '左上 上位置
        '左上 左位置
    objIE.Top = 0
  
    objIE.Left = 0
  
End Sub
'----------------------------------------
'End Of IEオブジェクト生成
'----------------------------------------


'----------------------------------------
'ページ読込待機
'----------------------------------------
Sub WaitIE()
'指定したページの読み込みが完了するまで待機する
    Do Until objIE.Busy = False
        DoEvents
      
    Loop

End Sub
'----------------------------------------
'End Of ページ読込待機
'----------------------------------------


-----------------------------------------------------------------------------------

以上、私がリンクをクリックするまでに行った処理です。
クリックができて画面遷移した瞬間に、嬉しすぎて仕事場でにやついたのは秘密です。
できることが増えるって楽しいですね。

2011年4月4日月曜日

初めてのソースコードレビュー

私は「プログラマ」というポジションで仕事をしたことがなく、ソースコードレビューというのも受けたことがありません。
そもそもプログラミングするのかっていう話もありますが、一応業務で使っている仕組みをVBAで組むくらいのことはしています。
そんな話を愚痴まじりにTwitterでつぶやいていたところ、VBAでツールを作ってくれないかというお話をいただきました。
こんななんとかのたまごもいいところな私に、です。
ありがたいお話ですね。

要件を聞いてみたところ、私にも作れそうだったので引き受けさせてもらいました。

こんな形で成果物を要求されるというのもそういえば初めての話です。
業務担当者に向けてツールを作っている私が成果物として求められているのはその仕組みからアウトプットされたものであって、仕組みそのものではなかったりします。

”自分以外の誰かに向けてモノを作る”
ということに、最初の最初から疑問がわいてきました。
変数名はどうしようとか 笑
コメントはどれくらい入れたらいいんだろうとか、そのコメントも誰にでも理解できる内容になっているのだろうかとか。
プロシージャはどの機能単位にしたらいいのかというのも疑問でした。
どこまで細分化するのか、結構悩みました。

テスト段階までは1プロシージャ15~20行くらいで4つのプロシージャでしたが、動作確認の後全部まとめて1つのプロシージャにしました。
小さなプログラムだったのでここまで分割する必要はないのかな?という疑問符付きの状態で納品しました。


さて、今日納品物のレビュー結果が返ってきました。
指摘されたのは「仕様変更に対応できない」という点でした。
なぜか。
ひとつのプログラムに全部の機能を記述しているから。
仕様変更できるけれど、その度に全部のソースを解析する必要があり、無駄な時間を使ってしまう。

・・・おおぉ、、私は何をしているんだろう。
頭ではわかっていたことが実際には全くできていませんでした。
プログラミングの本を読めば必ず書いてあるようなことが、プログラミングの本を読んできた私にできていなかったのです。
と同時に疑問に思っていたことがすっきり返ってきました。
どんな小さなツールであっても、プログラミングをする上で考えてあげなくちゃいけないことは同じ。
可読性だったり保守性だったり、ソフトウェアとして持っておくべき品質は規模に関わらず同じなのですね。


教科書に書いてあることと自分がやったこと、現場で求められているもの、その3つが同じフィールドに並んだ瞬間でした。
自分だけで完結していては見えなかったものが見え、また自分がやるべきことが明確に現れてきました。
自分のたまごレベルもよくわかりますね。


勉強だけしていても実際にはわかったつもりのことが多いのかもしれません。
こうして実践して指摘をいただいて、何が失敗だったかを理解すること、そこからまた次の成果を出すこと、この過程こそが本当の勉強なのかもしれないですね。
机上で教科書を読むのなんて、予習くらいにしかならないのかもしれません。

2011年3月30日水曜日

ツールバーの活用~Excel~

仕事で最もよく使うソフトであるMicrosoftOfficeやエディタ系のソフトなどは必ずツールバーのカスタマイズを行って使っています。
自分に必要なツールバーを作っておくことで仕事を効率的に行うためです。

私の場合、規定で設定されているツールバーにある機能は使わないものだったり、ショートカットキーで操作する内容のものが多いので、カスタマイズすることによって得られる効果は大きいです。

今回はExcelで使用しているツールバーについて紹介します。
ちなみにここで紹介しているExcelのバージョンはExcel2003です。

----------------------------------------------------------------------------------

●「標準」ツールバー
成果物として作成するExcelファイルは印刷して出力できるような形にすることが多いので、ページ設定に関連するツールバーを配置しています。



メニューバーのファイルにある機能と重複する部分なのでメニューバーのすぐ下に配置して使っています。
ファイル作成の最初の段階で基本的な設定を行い、最終段階でシート上のデータに合わせた最終調整を行います。
図形描画のツールバーを表示・非表示にするアイコンも配置しています。
これは作業スペースを広くするためで、図形を使用しないドキュメントでは図形描画ツールバーを非表示にしています。
(仕事場で使用しているパソコンは画面サイズが小さいのでこういう小さな機能も役立ちます 笑)

●「書式設定」ツールバー
セルの操作に関する機能を集めいています。



ショートカットキーの [Ctrl + 1] で開いて使う書式設定画面からの設定でよく使うものを主に配置しています。
書式設定画面はよく開きますが、書式設定画面自体タブで複数のページに分かれており、選択項目も多くて都度開いて設定するのは手間なので、使用頻度が高いものはツールバーに配置します。
ウィンドウ枠の固定や行・列のグループ化を行うアイコンも配置していますが、これはシートの編集を効率的に行うためです。
列や行の選択はショートカットキーの [Ctrl + Space] と [Shift + Space] を使って行い、ツールバーから必要な機能を選択します。
(このショートカットキーはMS_IMEの場合かな入力モードにしていると無効です。ATOKではかな入力モードでも有効です。)

●「コントロールツールボックス」ツールバー
私はマクロが使えるシートを作成することが多いので、コントロールツールボックスはいつでも使えるようにツールバーを表示させています。



これについては規定のまま使用しています。

●「チェック/コメント」ツールバー
ドキュメントの作成途中にメモとしてコメントを挿入することがあり、その編集作業を簡単に行うために配置しています。



コメントの操作はショートカットメニューからの操作で行うこともありますが、それほど使用頻度が高くはないのでメニューに割り当てられたキーを覚えていません。
なのでツールバーを使っていつでも簡単にコメントが挿入・削除できるようにしています。

●「図形描画」ツールバー
図形の作成時に使うツールバーです。
前述の表示・非表示切替でこのツールバーは必要な時にだけ表示させています。



Excelでの図形操作はあまり好きではありませんが、仕事をしていれば使わずにいることもできないので、こうしてツールバーを活用することで少しでも使いやすくなればと工夫しています。
ちなみに図形描画には主にVisioを使ってます。内容によってはCacooも。
----------------------------------------------------------------------------------

ツールバーのカスタマイズはユーザ独自のツールバーを作成することでもっと効率性を上げられると思います。
よく使う一連の機能をマクロにしてみたり、ちょっとこだわりのアイコンを使ってみたり。
(気分的な作業効率の向上も大切だと思っています。)
今回はExcelに標準的に使われているツールバーのカスタマイズについて紹介しましたが、これなら3分から5分もあれば自分好みのツールバーが作れると思います。
とりあえずやってみる、効果を感じてみる、という意味でもお勧めです。
実際に使っていくうちに使わないものは削除すればいいですし、よく使う機能があれば追加すればいいですね。

私ももう少し使い込んでオリジナルツールバーに磨きをかけていきたいです。