2015年7月13日月曜日

仕事で覚えたEXCEL小技〜VLOOKUP関数で、過不足(差分)チェック

  2つのファイルのある列に並ぶ文字列を比較する場合、VLOOKUPを使うと簡単だ。

  例えば、毎日、売上を集計するケースでは、オーダ番号がA列にあれば、昨日の売上オーダ番号と本日の売上オーダ番号をVLOOKUPで比較して、ISNA+IF関数で見つからなければ×、見つかったら、○をセットする。
'・昨日の売上ファイルY(行数50)に本日のオーダ番号(A列)があるか'
= IF(ISNA(VLOOKUP(A2,T!$A$2:$A100,1,FALSE) ), "×”," ○”
'・本日の売上ファイルT(行数100)に昨日のオーダ番号(A列)があるか'
=IF(ISNA(VLOOKUP(A2,Y!$A$2:$A50,1,FALSE) ), "×”," ○”)

 そして、ワタシはISNA+IF関数を書くのが面倒くさいので、VLOOKUPだけで済ませる。NAがでたら、「ない」のだから・・・。

これは、あるファイルを更新して、新旧ファイルを別々にしていれば、ユニークなキーがあれば、そのキーで新旧ファイルの差分を取り、何が増えて、何が減ったかを確認できる。VLOOKUP関数は、EXCELで仕事をする場合、ホントに便利な関数だ。





2015年7月9日木曜日

仕事で覚えたEXCEL小技〜見えてるセル(可視セル)へのコピペ

  EXCELである列にフィルタをかけたときに、現在、絞られているセルだけにに特定の値や式をコピペしたい場合、「ホーム」タブの

Excel のリボンの画像
「編集」で「検索と置換」をクリックし、「ジャンプ」をクリック。そして、「可視セル」を選択した上で、コピペ。
すると、今、見えているセルだけにコピペできる。
これを忘れると、フィルタで隠れているセルにもコピーされ、具合がわるくなる。


indian gir
ここでちょっと一息のコーナーです。

 天才数学者アラン・チューリングは、生き物の文様がたった2つのルール(数式)で作られることを発見。「チューリング・パターン」と呼ばれている。
 所さんの目がテンでは、オセロの石を使った実験で、2つのルールを
周りが4つ以上異なる色に囲まれたら、中心の石をひっくり返す。
・同じ色の石が周囲2周集まると、中心の石をひっくり返す
と定義し、見事に「蛇」の文様を浮かび上がらせていた。




2015年7月6日月曜日

仕事で覚えた泥縄なACCESS習得〜既存フィールドから新規フィールドを作る

greeneyesboy






  仕事でやむをえず、ACCESSを使うことになり、月度のフィルドはあるが、年度のフィールドを持たないデータから、年度をキーに集計したくなったときに編み出した技。






 
 年月のフィールドYYYYMMから年度フィールドYYYYを作る。月度、年度ともにテキストとする。ポイントは、日本の年度の切れ目が4月なので、1月から3月の場合、YYYYの部分をマイナス1するところだ。









 年度:IIf(RIGHT([月度],2)> "03",LEFT([月度],4), LEFT([月度),4)-1)


 勿論、この技は、年度の切れ目が4月の国、日本でしか通用しない技だ。

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

 第2次世界大戦で、ナチスの暗号エグニマの解読に成功し、戦争の早期終結に貢献した、イギリスの数学者アラン・チューリングを描いた、映画「イミテーション・ゲーム」を観た。
 その成し遂げた功績に反し、不遇の人生を送ったチューリング。気の毒というか、国(イギリス)というか、世間の対応が非常に残念だった。
 人手による暗号解読は時間がかかり過ぎるので、機械(マシン)にやってもらうというアイデアは、物凄い発想の転換だったに違いない。映画で再現されたマシンは実にそれらしく、カッコ良かった。配線をつなぐプログラミングで、円盤が回り、「ガシャン・ガシャン」という音を立てるところは、まさに、リレーコンピュータそのもの、であった。

2015年6月28日日曜日

EXCEL+VBAで仕事を効率化〜既に開いているIEページをつかまえる。InStr関数で確実に!

VBAでWebベースの社内システム(IEで開いたページ)からデータをEXCELのシートに取り込む場合、
・IEをイチから起動して、ページを巡回するか
・既に開いているIEページをつかむか
の2つの方法がある。
 前者の場合、社内システムへのログインからVBAコードを作ることになる。
 後者は、ログインとか、途中のページ遷移(メニュー画面)をスキップして、単純に必要なIEページのみ取り込む部分さえ、書けばよいので、手抜きコードのワタシにはピッタリである。
 とりあえず、開いているウィンドウを捕まえて、それがHTMLなら、IEで開いたページだ。
 さて、ここで、大切なのは、どうやって、必要なページと判断するか、である。
 例えば、ページのタイトルとか、ページに含まれる、特定の文字列を利用するといった具合にユニーク(唯一)なキーワードを選ぶのが、よい。そこで、便利なのがInStr関数だ。
 そこで、OKワード(これがあれば抽出)を指定するようにしてみた。
 そのコードは、こんな感じ。Instr 関数で、
Instr(objIE.document.innertext,"OK-word-1")> 0
とコーディングし、OKワードがあるかを判定する。
全体は、こんな感じだ。
Dim objIE as Object
Dim objShell as Object
Dim objWindow as Object
Set objIE = Nothing
Set objShell = CreateObject("Shell.Application")
For Each objWindow in objShell.Windows
  If TypeName(objWindow.document) = "HTMLDocument" Then
    Set objIE = objWindow
    Debug.Print objIE.Doucument.Title 
    If objIE.document.Title = "your-web-page-title-1"  Then Exit For
    If Instr(objIE.document.innertext,"OK-word-1")> 0 Then Exit For
  End If
Next 
 ここで一息のコーナー。
 日本の小さなワイナリーには、繊細で、素晴らしいワインがある。中にはそれほど高額ではないのに、独特な感じを持つ質の高いワインがある。ワタシが好きなのは、甲府、勝沼のハラモワインの「甲斐ノワール」。かすかに、ごぼうのような、土の匂いを感じる。しかし、とても人気があり、あまり手に入らなくなってきた。寂しい限りだ。そして、最近、見つけたのは、栃木のココ・ファームワイナリーの「農民ロッソ」。土の香りを感じるのは、ワタシだけかなぁ。


 




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が選んだところなのだなぁと納得した。







2015年4月25日土曜日

IE+VBAで仕事を効率化〜IEツールタブの「F12表示」はとても便利

driving girl2
  タダで使えるIE+VBAで社内Webシステムのデータをいちいち、画面移動しながら、コピペしていると非常に疲れ、嫌気がさすので、IE+VBAで自動採取している。そのVBAコードを作るときに、重宝しているのが、これもタダで使えるIEのツールタブにある、「F12表示(ツール)」だ。
  表示されているページのHTMLのソースコードがどのように書かれているかをみることができる。凄いのは、ソースコートを調べたい部分へマウスを持っていくとハイライト(ブルー色で)してくれるところだ。
  使い方は、慣れしかない、実に恐ろしいほど使いにくく、「なんじゃこれ」と思うが、いろいろ、試行錯誤すれば、使いこなせるようになる。

  ここで一息のコーナー。gimp2のパス(ツール)も凄い。つい、ハマッて、書いてみた。ラフ(下絵)をなぞりながら、修正できる。パスをブラシなどの一定の太さの線であっというまに描画してくれる。これに、最近マスターした、マスクレイヤーを駆使してみた。







drivinggirl