2015年5月31日日曜日

EXCEL+VBAで仕事を効率化〜ユーザー定義の書式でセルに入った値を***にする

  自分用の仕事効率ツールは、極力、手抜きコードがキホンになる。

  Handmade tools for daily work tend to be basically corner-cutting programs.

  社内Webシステムへログインするところも自動化する場合、自分で使うだけなら、USER-IDとパスワードはコードに書いてしまえば良いけど、チームのメンバが使えるようにするためには、USER-IDとパスワードをどこかのセルに設定しておくと簡単だ。
  そのとき、セルの書式をユーザー定義で、;;;(セミコロン3つ)にすると、セル上ではその値が見えなくなる。でも、メニューバーの値プロパティには表示されるんだけどね、チャンチャン。

 Imagine auto-pilot VBA scripts started from login onto internal web site.
 Even password is hidden by a fake method, user-divined-data-format ;;;(three semi-colon).

  このユーザー定義の書式を更に進化させて、;;;”*******”とすれば、*******と表示されて、パスワーソが見えない感じを演出できる。これをパスワードのところに使うと、フェイクな感じで、パスワードを目立たなくできる。でも、該当セルを選択(カーソルで)されているときには、左上の窓の「値プロパティ」で丸見えでござる。

ここで、ちょっと一息のコーナー。

 過日のおせっかいなオヤジがいる、栃木のビジネスホテルは、12回泊まると1回無料の宿泊券が貰えるという特典があった。いったい、どんな人がその特典をゲットできるのであろうか?月1回は栃木に用事があるビジネスマン、ビジネスウーマンは、何をされているのだろうか?そういえば、ワタシが宿泊したとき、無料の朝食がついていたのだが、ワタシのとは違う、おかずの朝食を食べる、常連らしい方々が何人かおられた。

2015年5月18日月曜日

IE+VBAで仕事を効率化〜WebシステムからテーブルをEXCELシートへGETする。表のゾンビ(怪奇現象)を取り除きつつ。

  IE+VBAで社内Webシステムからのデータ取得を自動化。といっても、例えば、ある番号(伝票番号)に対応する情報(現在の処理状況など)の表(テーブル)からEXCELのシートへデータをガサッと一気にGETするというスクリプトで、200ステップ(行)ぐらいで出来ている。ポイントとしては、htmiページのすべてのTABLEオブジェクトのタグを読み込んで、TH、TR、TDタグの内容をEXCELのセルへ単純に取り込んでいる(コピペ)だけ。

  I wrote an auto-pilot VBA scripts which generates an IE object then  gets data from the internal web system. The point is just to read all TABLE tag from the target html and extract TD tag then copy and paste into an EXCEL sheet.

bluegirl
 ところが、同じデータが何回も取れるというゾンビ(怪奇現象)に悩まされた。ホントに、綺麗に同じデータが何回(今回のページでは4回)取れてしまう!ページの作り方、つまり、htmlの書き方(ページ構造)に依存していると思われる。ページのhtmlソースを表示してみるとjavaで書かれており、多重(4重)に取れる原因は、皆目わからない。わからないときは、暫く、放置するのがよい。風を通す。たけど、諦めてはいけない。頭を切り替える。

At first I annoyed by zombis who generate the same tables quadruply.

  粘って考える。飯を食い、風呂に入る。寝る。起きる。食べる。また、少し、考える。

 Why? I think persistently. I ear and take a hot bath and sleep well. I eat again and think a bit.

   htmlを単純に頭から舐めて、出力しているだけなのに、データが4重に出るのは、元々のデータが4重になっているからじゃねーの?

 I reached the conclusion that original data is quadruple since what I did was just output all the tables in HTML from the beginning.

  インターネット検索を活用し、まず、辿り着いたのは、「TABLE の中にTABLEがある」せいじゃないのー。
  そこで、TABLE のタグの.innerhtmlにTABLEがないときだけ、出力するようにしてみた。具体的にはInStr関数を使用する。

TABLE in TABLE is the reason.

For Each objTBL in objIE.document.frames("fyour-page-frame").document,all.tags("TABLE")
   For Each objTableItem In objTBL.all
     If InStr(objTBL.innerhtml, "TABLE") = 0 then
     --- table output ----
     End if
 Next
 Next
 (説明)
  1. TABLEというタグを1つずつ、取り出す。
  2. TABLEのタグを1つずつ、取り出す。
  3. TABLEの中にTABLEがないときだけ、中身を取り出す。
   そしたら、綺麗に2回ずつになった。惜しい。2回もいらないのに。でも、もう一息じゃ。また、粘って考える。飯を食う。風呂に入る。歯を磨き、寝る。起きる。暫く、間を置いて、再び、考えてみる。諦めずに。

  謎の2重出力トラブルを抱え、2週間が過ぎた頃、改めて、伝家の宝刀「IEツールタブのF12表示」でhtmlソースをチェックしてみて、2重の原因は、TABLE タグとTBODYタグの両方があるせいかなぁと推測。そのどちらか一方のみ出力するようにしたところ、ピタっと2重に出ることはなくなった。チャンチャン。

If InStr(objTBL.innerhtml, "TABLE") = 0 And (objTableITEM.innerhtml, "TABLE") = 0 then  
 やったね。何事も石の上に3年。諦めたら、終わりだね。

   いつものちょっと一息のコーナーでござる。

  車のぶらり旅で、千葉から栃木、長野へと旅した。千葉と栃木では、泊まる宿やホテルでへチェックインすると、水のボトルをくれた。関東では、恒例なのかなぁ。それで、ニュージーランドをレンタカーで旅したときにモーターロッジに泊まるとミルクをくれたことを思い出した。「ブルーorイエロー」ときかれる。知らないとどっちも要らない感じだけど、実はノーマルなミルクか、低脂肪&カルシウム入りのミルクかということだった。
  たまたま、宿泊した栃木のビジネスホテルは、おせっかいなホテルであった。居酒屋での夕食を終え、早く風呂に入るべく、部屋のキーを受け取ろうとした時、フロントの白髪のオヤジさんが「もう、見ましたか?」と怪しげに割引チラシを手渡してきた。CNNが選んだ「世界の絶景」に日本で唯一選ばれた「足利フラワーパークの藤の花ライトアップ」を見ずに寝るのかというのである。「是非、行った方がいいよ」と勧められ、夜のピクニックへ出掛ける羽目になったのだった。
 というのも、ホテルのある足利市からフラワパークまでは、電車でひと駅だが、駅から徒歩12分もかかる。既に陽は落ち、ライトアップされた藤の花に出会うまでの田舎の街灯が少ない暗い夜道は、「夜のピクニック」と呼ぶのにふさわしい。暗闇の中、光に照らされた、巨大な藤の花は、見事としか言いようがなかった。確かに、1回は見た方がいい。おせっかいな白髪オヤジさん、ありがとう。とびきりの非日常を楽しむことができた。
  駅からの道すがら様々な言語、主にアジア圏の言葉が飛び交うのを聞き、さすがCNNが選んだところなのだなぁと納得した。