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分くらい担当者と話してみる、そんなことでもやもやが晴れることも多いです。



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

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

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


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

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

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

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



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