2014年12月4日木曜日

IE+VBAで仕事を効率化 Webページのラジオボタンを操作(チェック)する

 社内システムのWebページからデータを取ってくる際のノウハウです。
 Webページに「番号のリスト」があり、その番号に対する内容を「表示する」といったケース(例えば、伝票番号に対する現在のステータスなどの詳細情報を表示する)で、登場するのが「ラジオボタン」ですね。番号の隣に「二重丸◎の形状で選択すると真ん中が黒くなる」ボタンです。それを選択(クリック)して、そのページのどこかにある「表示」ボタンをクリックして、詳細情報を表示するような感じになります。
 このラジオボタンをVBAで操作する方法を説明します。
ラジオボタンは、INPUTタグで作られますので、まず、このINPUTタグに付けられたnameが何かを探します。 見つけたら、そのオブジェクトに対して、ObjXX.Checked = Trueとすれば、二重丸の黒丸が入り、「選択」(チェック)された状態になります。
  この例では、テーブルのエントリは6個のTDタグで構成され、 最初のエントリにラジオボタンのINPUTタグもあり、 "radio-button-name" という名前を持つとします。テーブルは、複数のエントリで構成されます。(例えば、伝票番号の数だけのエントリがあります。)
mは、テーブルのエントリ(6個のTDタグを持つ)をカウントするために使用します。
mmは、TDタグの最大個数をカウントするために使用します。
nは、TDタグをくるくると回すために使用します。
 GetElementsByTagNameでタグを取ると、すべてのTDタグが取れるので、くるくる回しながら、必要なタグをたぐる必要があるのです。
nnは、ラジオボタンを持つTDタグをカウント(探す)するのに使用します。
 まず、GetElementsByTagNameで現在のページのTDタグの最大数をmmにセットします。
mm = 0
For Each objTD In objIE.document.Frames("bodys").document.GetElementsByTagName("TD")
    mm = mm + 1
Next
 次に、再び、GetElementsByTagNameでTDタグをたぐりながら、テーブルのエントリごとに伝票番号のラジオボタンを選択し、その伝票番号の内容を表示するために「表示」ボタンをクリックし、表示のページに飛んで、情報を抜いて参ります。
m = 1
Do 
  n = 0
' *** turn a radio button on ***
  For Each objTD In objIE.document.Frames("bodys").document.GetElementsByTagName("TD")
     n = n + 1
     nn = 0
    For Each objITEM in objTD.document.getbyTagName'("INPUT")
      If objITEM.Name = "radio-button-name" Then
        nn = nn + 1
        If nn = m then
          objITEM.Checked = True       ' radio button on
          Exit For
        End If
      End If   
      Next
      If n < ( m * 6 ) Then GoTo Continue ’  skip 
      If ( m * 6 ) > mm then GoTo FINISH                      ' the last TD?
      If n Mod 6 = 0 Then Exit For             '  6 * n 
Continue:
    Next
    m = m + 1   
  Next
ここにラジオボタンに黒丸をした後にやりたいこと。例えば、表示ボタンを押し、 表示されたページを捕まえて、テープルから情報を抜いてくる処理を記述します。 例えば、6番目のタグに伝票番号が入っていたとして、それを取り込んで、 EXCELシートの名前にします。 ActiveWorkBook.Sheets.Add.Name = objTD.innertext ここの処理で、伝票番号をキーに伝票番号の詳細情報のページを表示したとき、元の画面が残らずに、詳細ページへジャンプするようなシステムであれば、伝票番号の詳細情報を抜いた後に、最初の伝票番号のリストのページへ復帰する必要があります。 最初の伝票番号のリストのページ名が”伝票システムの番号リスト”であれば、 そのページへ戻るコードは、以下。
For Each objWindow In objShell.Windows
  If TypeName(objWindow.document) = "HTMLDocument" Then
    Set objIE = objWindow
    If objIE.document.title = "伝票システムの番号リスト” then Exit For
  End If
Next

なお、objShellは、IEの初期化で
URL01 = "http://www.伝票システムのURL"
URL02 = "http://www.伝票システムのURL/login.jsp"
Set objIE = CreateObject("InternetExplorer.Application)
objIE.Visible = True
objIE.Navigate URL01
Application.Wait (Now + TimeValue(0:00:03"))
Set objIE = Nothing
Set objShell = CreateObject("Shell.Application")
Set objIE = ObjShell.windows.Item(objShell.windows.Count -1 )
objIE,Navigate URL02
Application.Wait (Now + TimeValue(0:00:03"))
Do While objIE,Readystate <> 1
Do While objIE,busy = True
Loop
Loop
という感じで設定されております。  実は、今回のノウハウのキーとなるIEでのラジオボタン操作は、ネットで探して、コピペして、作りました。TDタグを全部取って、クルクルしなくてもできると思うのですが、できればいいんですよね。特に、TDタグの最大数を取ってくるところは、もっとスマートな方法があるとは思いますが、できればいいンですねー。 クルクルしながら、ラジオボランを順に回すところは、ブレークポイントを駆使して、ちゃんと動いているか確認。とても泥臭いプログラミング、デバッグ手法でした。  ここでちょっと一息のコーナーです。  いのうえ ひさしの言葉から(これを目指してます。出来ていないけど)。   難しいことをやさしく   やさしいことを深く   深いことを愉快に   愉快なことをまじめに書くこと。

2014年11月20日木曜日

仕事で覚えたEXCEL小技 番外編〜必ず、名前と版数を付けて、こまめにセーブする

 仕事でEXCELでいろいろ作ったときは、必ず、名前と版数を付けてセーブしておく。
    途中結果でもバリエーションができそうなら、「こまめ」に版数を付けてセーブする。「神経質なくらいにセーブ。」これが、ワタシの全く泥臭いですが、EXCELで仕事するときの基本のキホン。いわば、鉄則です。
 とは言いながら、ときどき、忘れてしまうこともあり、運悪く、一度もセーブせずに、数時間の作業に及んだ大作がおじゃんになることもありますが・・・。大作のときに限って、不幸なことになりがち。

 ここでひといきのコーナー。

 SCIENTIFIC AMERICAのfebruary 2001で紹介されたセールストークのコツ。
 ホテルの予約係がお客に「変更があったら、電話を入れてください」といっていたのを、「変更があったら、電話を入れていただけますか?」で、お客に返事してもらうようにしたところ、無断キャンセルが減ったという話が載っていました。
 パブリックコミットメントという手法とのこと。人は自ら言ったことは守りたいと思うようです。
 なるほど、やっぱり、相手に返事してもらう。意思表示をしてもらうことはとても効果があることなんですね。




   
 


2014年11月9日日曜日

仕事で覚えたEXCEL ピボット(PIVOT)でクロス集計する

 ピボットって何よ?というレベルで仕事でEXCEL を覚えたワタシですが、なかなか使いこなせてるとまでは言えない。
 一言でいえば、クロス集計ですが、どういう便利さがあるのかな ぁ?

 例えば、EXCELで家計簿を作成したとします。
 といっても、買った品物ごとに入れるのも大変なので、店ごとというか、レシートごとに日付、店名(品名)、金額が1行で入れてあるものとします。このとき、費目として、食費、教養・娯楽、光熱・水道、教養・娯楽、その他などを入れておくと、費目ごとの集計がピボットでできるようになります。

  まず、家計簿の行を選択して、「ツール」タブからピボットの作成ウィザードを起動します。

 こんな感じですね。

ピボットにする範囲を選択します。




必要な項目を選んで、例えば、費目ごとの月の出費がわかるようには、以下のようなピボットを作ります、

 
















 ここでちょっとひといきのコーナーです。

 先日、山梨に出かけたとき、道の駅「富士吉田」で富士山のおいしい水を汲んできました。富士山からの水の水汲み場があり、多くの方が自前の大きな容器を持参され、混雑しておりました。ワタシも売店で100円で1.5リットルのペットボトルを購入して、富士山のおいしい水を持ち帰りました。翌朝、その水でコーヒーを入れたのですが、これがまた、とても旨かった。




2014年10月29日水曜日

るんるんモノマネEXCEL VBA 本〜仕事で覚えたEXCEL&VBA小技 BOOK〜 キモの関数、そしてIEを自在に操るVBA。初めはモノマネが一番いい!

highschoolgirl
 自分のレベルにあった市販のEXCEL本。出会ったらいいね。でもそんな本はなかなか見つかりません。ワタシも幾つか買いましたが、仕事の効率化に役立つ、これぞという本に巡り会うことはできませんでした。それは、求めれば求めるほど離れていく恋人のようなものかもしれません。もっといいj本があるはずだ。明日こそ、見つかるかも。いや、こうなったら、自分で作るしかないなと。
 てなわけで、EXCELの必須関数や日常業務の自動化を実現するための「EXCEL VBA の始めかた」を書いてみました。
 最初の1歩の踏み出し方さえわかれば、あとは自転車と同じで、スイスイと、いや「どうにかこうにか」できるようになります。
 「買うより始めろ。習うより慣れろ。」
 仕事で苦しみもがき、何度も心が折れそうにながらも、必死で覚えた「10年間のノウハウ」をすべて詰め込みました。
 仕事で覚えたEXCEL、渾身のEXCELノウハウ集(作品)です。
  特に、「IEブラウザを自在に操るVBAテクニック」をマネしてください。動けばよいのです。動いたら、「勝ち」です。
 すべて、るんるんでモノマネに始まり、モノマネで終わってもいい。

はじめに イチローのように・・・
第1章 キモの関数
1.1 SUMとSUBTOTALを使い分ける
1.2 ピボット(PIVOT)でクロス集計する
1.3 ブイルックアップ(VLOOKUP)する
1.4 VLOOKUPでは$(ダラ)が必須だら 
1.5 SUMIFSとCOUNTIFSで集計する(プログラムレス)

第2章 IEを自在に操るVBA
2.0 VBAのはじめかた
2.1 VBAでIEを自在に操る
2.1.1 Webシステムへログインする
2.1.2 行きたいページへジャンプする
2.1.3 欲しい情報をゲットする
2.1.4 ラジオボタンを操作する
2.2 家計簿をつくる
2.2.1  モノまねVBAで家計簿〜まずは、キホン設計!
2.2.  モノまねVBAで家計簿を作る〜その2 ユーザフォームでデータ入力する 
2.2.  ものマネVBAで家計簿~その3 ピボットで収支管理 これでバッチグー!

第3章 文字列を自在に加工する
3.1 複数のセルで特定の長さの文字列を生成する 

3.2 YYYYMMという文字列からQを抽出
3.3 文字列除去 
3.4 フィルタで〜以上が使えないときには

第4章 とても重宝する「小技(コワザ)」
4.1 見えてるセル(可視セル)のみへコピペする

4.2 いっぱい行をdeleteしたらexcelがコケたならば並べ替えて消せ
4.3 フィルター繰り返しつつ、特定の作業を行う( autofilter とcurrentReagion )

第5章 トラブルシューテング
5.1 視点を変えてみる
5.2 デバッグ  
5.3 トラブル原因は社内のセキュリティ強化ではないかも
5.4   そして、まずは、Windowsパッチを疑え   

付録1 VBAの出力メッセージをコピペする 
付録2 最終月曜日を求める
付録3 金額がプラスなら青字にマイナスなら赤字に(正規表現でちゃちゃと)

番外編 習得のコツは隣の師匠

 ここでちょっとひといきのコーナー。

 年を取り、引退(定年退職)すると、「教育」と「教養」が必要なのだそうです。そう聞くと、すごくハードルが高そうですが、
つまり、
・きょういく(今日、行く)ところがある。
・きょうよう(今日、用)がある。
というのが、よろしいようです。











2014年10月18日土曜日

仕事で覚えたEXCEL+VBA〜金額がプラスなら青字に、マイナスなら赤字に設定する

 EXCELで「プラス金額なら青字で、マイナス金額なら赤字で」わかりやく、色を付けたいことがある。
 そこで、EXCELで「選択」しているセル(複数かつ、点在していてもOK)について、
+5百万であれば、青字で+5百万円、−5百万円ならば、赤字で5百万円表示するVBAマクロは、以下のような感じ。
excergirl

Sub minusakaandplusaoHK()
Dim strPat As String
Dim strTest As String
'  -digits red
For Each r In Selection
  strTest =r.Value
  Set RE =CreateObject("VBScript:RegExp")
  Set Matches = RE.Execute (strTest)
  strPat = "(¥-|−)([0-9]|[0−9])+(.|.)? ([0-9]|[0−9]) *百万円"   --- pattern for search
  With RE
    .Pattern = StrPat
    .IgnoreCase =False
    .Global = True
  End With
  Set Matches = RE.Exceutes(strTest)
  If Matches.Count <> 0 then
    For Each Match In Matches
      r.Characters(Start:=Match.FirstIndex + 1,Length:=Match.Length).Font.ColorINdex = 3
  Next
  Endif
 Next r
'+digits blue
For Each r In Selection
  strTest =r.Value
  Set RE =CreateObject("VBScript:RegExp")
  Set Matches = RE.Execute (strTest)
  strPat = "(¥+|+)[0-9]|[0−9])+(.|.)? ([0-9]|[0−9]) *百万円"   --- pattern for search
  With RE
    .Pattern = StrPat
    .IgnoreCase =False
    .Global = True
  End With
  Set Matches = RE.Exceutes(strTest)
  If Matches.Count <> 0 then
    For Each Match In Matches
      r.Characters(Start:=Match.FirstIndex + 1,Length:=Match.Length).Font.ColorINdex = 5
  Next
  Endif
 Next r
End Sub
ポイントとしては、「選択」しているセルを取り出すFor Each r In Selectionと「+n百万円」を正規表現RegExpで見つけているところ。

ちょっと一息のコーナー。
 トマス ・H・クックの「鹿の死んだ夜」(染田屋茂 訳、文春文庫)は、月曜日に「自宅の窓ごしに眺めると、リアダンには街が、でたらめな音と方向性のない動きの巨大なパッチワークに見えた。」という描写で静かに始まる。
 もう、随分前にこの本と出会い、思い浮かべるたびにその哀しい余韻が印象に残っている。原書のタイトルは、ブラッド・イノセント(blood innocent)。何年も絶版になった原書を探していたところ、電子書籍の時代となり、kindle本を購入することができた。
 原書では、MONDAY Watching it from his window, Reardon saw the city only as an immense patchwork of random sound and direction-less movement. で始まる。
 immenseは、巨大ななんだー。kindle本は単語の意味がでるので、便利ですね。
 タイトルが「ブラッド・イノセント」ではなく、「鹿の死んだ夜」になっていることのも「いいね」ですが、原書を読み返すたびに、染田屋訳の凄さ、絶妙さを感じています。トマス・クックもこれが処女作というのも凄い。

2014年10月13日月曜日

日々の仕事スタートでは、まず、技(道具)磨く~イチローのように・・・

  日々の仕事は、本当に地味で、辛気臭い作業が多い。だからの、少しでも楽するために様々な道具(EXCEL+VBA,ACCESS,IE+VBA,rubyやperlなど)を駆使して可能な限り、効率化したい。
ストレスなく、毎日、楽しく仕事できる(と思える)ようにするため、仕事のスタートでは「道具を磨く」かのように「スキルを磨く」。「ルーティン」として体に覚えさせていく。スポーツ選手が準備運動でいつもの定型メニューをこなしながら、体をつくるように、効率化のネタを探し、スキルを身につける。「昨日よりも、今日。今日よりも明日の進化」を目指して。
 イチローが試合前にまずは、決まったメニューで体を作るように・・・。昼は炊きたてご飯にカレーというように・・・・。

2014年10月7日火曜日

仕事で覚えたEXCELVBAの初めかた~まずは、マクロの記録で始めたよ

 いきなり、EXCEL VBAをコーディングするのは、大変ですね。
ワタシは、まず、EXCELの「ツール」タブにあるマクロの記録で、EXCELの操作をVBAへ記録し、それを編集するという形で、始めました。
 最初は、モノまねから入ることをお勧めします。難しく考えずにやってみることが大切ですね!?


「ツール」タブのマクロの記録の画面は、こんな感じです。

 例えば、家計簿の費目ごとの合計を出すピボットテーブルを更新するVBAをマクロの記録で作成します。










そして、ピボットテーブルを更新する操作を「マクロ」として記録します。



記録したVBAコードは、ピボットテーブルを作り、集計するというコードで、こんな感じ。


 Sub Macro1()

' Macro1 Macro
' マクロ記録日 : 2010/3/15  ユーザー名 : Jaga Taro
'
     Worksheets("ピボット").PivotTables("ピボットテーブル").RefreshTable
 End Sub

これに対して、コードを多少手直しする。

手直しのポイントは、以下の3つ。
・シートの選択
・最終行の算出
・ピボットテーブルの範囲(Sourcedata)の設定


こんな感じで、行が増えても、ピボットテーブルを更新できるように変更します。マクロ名もわかり易い名前、例えば、Updatae_Pivot_area()にしておきます。


Sub Update_Pivot_area()

'
' Macro1 Macro
' マクロ記録日 : 2010/3/15  ユーザー名 : Jaga Taro
'
    Sheets("家計簿").Select

    最終行 = Range("A3").End(xlDown).Row


    Worksheets("ピボット").PivotTables("ピボットテーブル").SourceData = "家計簿!R2C1:R" & 最終行 & "C7"


    Worksheets("ピボット").PivotTables("ピボットテーブル").RefreshTable


End Sub



 このコードを、ピボットテーブル更新という「ボタン(長方形)」に割り当て、このボタンをクリックすると、ピボットテーブルが更新されるようになります。


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

 静岡の登呂遺跡の隣に芹沢けい介美術館があります。先日、ミニ仮面作り体験(教えて頂いたお姉さん、ありがとうございました)につられて、出かけました。 芹沢けい介は、日本の染色の草分け、独自の文様感覚が光っており、ググーッと引き込まれました。芹沢先生は。世界の工芸品コレクター でもあり、石ノ森章太郎の「がんばれ!ロボコン」みたいな木彫りの人形、アフリカの仮面(マスク)、これまた、丁寧で、しっかりとした手作りの暖かさがある、魅力的な世界に浸ることができました。

 ついでに美術館の隣にある、登呂遺跡で弥生時代にタイムトリップすることもできました。

 There's Serizawa Keisuke museum next to TORO park in Shizuoka,Japan. Serizawa Keisuke had been a artist in dyeing with pattern and also collected all sorts of artifacts. His abilities to design and colletions of handwork were so splendid that I felt like being in another world. It was pretty amazing.

I have experienced making a mini-mask thanks to a staff of the museum. 
 Go to there if you visited to Shizuoka city.

それじゃ。Bye Bye








2014年10月4日土曜日

EXCEL+VBA+IE+Webで仕事を効率化

 日々の仕事で、会社の業務システムへログインし、仕事に必要なデータを取ってくることが 度々あります。
 I have to login onto a company system and then get data many times everyday.  
 
 まずは、ブラウザでログイン画面を出し、ユーザIDを入れて、パスワード。そして、メニュー画面が出てくるのを待つ。

 メニュー画面が出たら、必要な画面を求めて、幾つかのボタンをクリック、数画面を経て、目指したページへやっと辿り着く。

 それから、特定のキー(例えば、オーダ番号)となる情報を入れて、必要なデータ(例えば、オーダ番号に対する内容ー商品名、注文個数など)をようやく得ることができる。
 オーダ番号が幾つかあれば、その分、番号を入れて、必要な情報を得る。そういうことで、日々の仕事をこなしていく。

 というような日々の操作を、イチイチ、手でやるでもイイじゃないかーーーッと思ってやっていたのですが、EXCEL+VBA+IE(= マイクロソフトのInternet Explorer、日本の会社は何故かIE好きだから、イヤ、マイクロソフト好きか・・・)+Webで、自動操作できるようにしてみた。



fatman's coming
EXCELのVBAコードにより、IEで会社のWebシステムへ自動でログインし、あらかじめ指定しておいた通りにページ移動し、あらかじめ指定したオーダ番号一覧を舐めて、それぞれに対応したオーダ情報を別シートにコピーして、これまた、自動的に終了する。
 EXCELVBA Codes can make some irritating manual operations pretty easy.

 すると、 あることに気が付いた。

  I noticed one thing.

 物凄く、当たり前なのですが、「あっという間にできている。実際に手で動かしているときよりも少し早い、いや、だいぶ、早い。画面のコピペも手でやるよりも早いし、なにより間違った画面をコピーすることがなく、正確にできちゃうよー」ということに。ホントですよー。ノーミスで。

  Pretty fast. Really fast!

 ここで一息のコーナーです。


 ニュージーランド北島のギズボン(Gisborn)にあるワールドワインセンター(World Wine Centre)は、ポバティベイ(Poverty Bay、貧乏な湾)の小さな港にあります。

 「フライト(Flight)」というシャレた名前で、5銘柄ワインのテイスティングを2コースから楽しむことができます。チーズとパンのプレートもあるので、それをつまみながら、港を眺めつつ、ワインを優雅に楽しむことができます。イケメンのお兄さんが案内してくれますよ。上のリンクで、動画に登場されております。
 ちなみに、この貧乏な湾、ポバティベイの由来ですが、かの探検家キャプテン・クックが旅の途中で食料調達に立ち寄ったものの、何もなかったので、貧乏な湾と名づけたようです。失礼な話ですね。

 Let's take a break:


  World wine centre is located in a small port at Poverty Bay, Gisborn in North New zealand. There  are two tastings called "flight" in which you can taste five wines. There's also platter of cheese and bread. Enjoy wine and the platter and talk to a nice guy! 


  The name of Poverty Bay comes from a tale that Captain Cook couldn't get food there. How rude isn't it!

2014年9月28日日曜日

IE+VBAで仕事を効率化[Webシステムを操作]~IEの開発者向けツールF12を活用する

 IE(Windows)で社内システムを開いているとき、IEの開発者ツールF12開発者ツール( F12 キーを押すか、[ツール] メニューの [開発者ツール] をクリックします。インストールは不要)で、ページのソールコードをスクリプトレベルで解析できます。


 これを使えば、社内システムを自動操作するときに、どのアドレスに飛んだらいいか、簡単にわかります。

 検索の窓があるので、キーワードで検索できます。
 非常に便利









2014年9月23日火曜日

EXCELのフィルタでは出来ないけど、rubyで出来る複数列フィルタ

 EXCEL文書で、1行が特定の対象(行)に関わる複数の情報(列)で構成されるのであれば、複数の列で検索したくなることがある。
 このようなケースで、EXCELの「フィルタ機能」を使うことになるが、残念なことに複数の列にフィルタをかけると、すべての列に特定文字があるケースしか抽出できない。すなわち、AND条件で絞られることになってしまう。
 どこかの列に探したい文字列が散在するケースを抽出できない(OR条件)。EXCELシートをSQLで検索すれば、可能だが、SQLの知識が必要となり、ハードルが高い。
 そこで、登場するのが、ruby1行(ワンライン)プログラム 。プログラムといっても、1行なので、それほどハードルは高くない!!!

やり方は、以下。

1)EXCELをCSVへ変換する。
 セル内改行やセル内カンマを上手に除去する必要あり。詳しくは、これ。
 EXCELで困ったときの小技 うまくCSV化できないなら、Rubyを使え
 2)ルビー1行プログラムで複数列フィルタをかける。詳しくは、ここ。
 ルビーワンライナー ルビー1行プログラミングで仕事を効率化


1行ルビーは、こんな感じ。

ruby -ne 'puts $_ if $_include ?("くるみ")' a.csv >o.csv
前提として。1)で作成した、a.CSVにはEXCELをCSV化したデータがある

ここで一息のコーナーです。

私のrubyバイブルは、Cuzicさんの
・Ruby on Windows ~rubyで丸投げルーチンワーク 
 マイコミ(毎日コミュニケーションズ)
WindowsのEXCELやInternet ExplorerでのRubyの活用方法が満載です。




2014年9月21日日曜日

仕事で覚えたEXCEL小技 1年分の休日リストを作り、VLOOKUPで処理する

1年分の休日リストを作り、VLOOKUPで処理します。

休日リストは、こんな感じ。この休日リスト(holidays)を日々のセル(K2)に、

  • =IF(ISNA(VLOOKUP(K2,holidays,2,FALSE())),"",VLOOKUP(K2,holidays,2,FALSE()))
という関数を入れて、休日名を出します。ISNA関数で、先に休日かどうかを判定しております。


falling ninja


Date Holidays
2009-03-20 Vernal Equinox
2009-04-29 Showa Day
2009-05-01 May Day
2009-05-03 Constitution Memorial Day
2009-05-04 Greenery Day
2009-05-05 Children's Day
2009-05-06 Substitute Holiday
2009-07-20 Sea Memorial Day
2009-08-14 Summer Vacation
2009-09-21 Respect for the Aged Day
2009-09-22 People's Day
2009-09-23 Autumnal Equinox
2009-10-12 Sports Day
2009-11-03 Culture Day
2009-11-23 Labor Day
2009-12-23 Emperor's Birthday
2009-12-29 Winter Vacation
2009-12-30 Winter Vacation
2009-12-31 Winter Vacation
2010-01-01 New Year's Day
2010-01-11 Coming-of-Age Day
2010-02-11 National Foundation Day
2010-03-22 Vernal Equinox

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

 ニュージーランドをレンタカーで旅する場合、どうしてもガソリンスタンドで給油しなくてはいけない。どうするかいなぁと最初は、不安。ま、店のおじさんとかに聞くしかない訳ですが、3~4年前にいった頃は、自分でどのガスか(種類)のノズルを選んで、入れて、レジで後払いする方式でした。勿論、クレジットカードもOK。また、払わずにトンズラする輩もいるようで、犯罪だというステッカーが目立つところに貼られておりました。


2014年9月7日日曜日

EXCEL+VBAで仕事を効率化~プラス青字&マイナス赤字

EXCEL+VBAで仕事を効率化。金額の数字をわかりやすくするため、
・ー(マイナス)付きの数字を赤字
・+(プラス)付きの数字を青字

にするVBAの作り方をご紹介します。

  • この minusakaandplusaoは、複数セルを選択した状態で、マクロを実行する形で使用します。
  • +数値や-数値の検出に正規表現を利用しています。

Sub minusakaandplusao()


Dim strPat As String

Dim strTest As String

'  -digits -> red 

For Each r In Selection
  strTest =r.Value
  Set RE =CreateObject("VBScript:RegExp")
  Set Matches = RE.Execute (strTest)
  strPat = "(-|ー)\d+\.?\d"   --- pattern for search
  With RE
    .Pattern = StrPat
    .IgnoreCase =False
    .Global = True
  End With
  SEt Matches = RE.Exceutes(strTest)
  If Matches.Count <> 0 then
    For Each Match In Matches
      r.Characters(Start:=Match.FirstIndex + 1,Length:=Match.Length).Font.ColorINdex = 3
  Next
  Endif
 Next r

'+digits => blue

For Each r In Selection
  strTest =r.Value
  Set RE =CreateObject("VBScript:RegExp")
  Set Matches = RE.Execute (strTest)
  strPat = "(\+|+)\d+\.?\d"   --- pattern for search
  With RE
    .Pattern = StrPat
    .IgnoreCase =False
    .Global = True
  End With
  SEt Matches = RE.Exceutes(strTest)
  If Matches.Count <> 0 then
    For Each Match In Matches
      r.Characters(Start:=Match.FirstIndex + 1,Length:=Match.Length).Font.ColorINdex = 5
  Next
  Endif
 Next r

End Sub








2014年9月5日金曜日

石の上に3年、泥縄なACESS習得方法 (2)

 仕事で前任者のACCESSのファイル(作品)を少しずつ、変えながら、OJT(On the Job Trainning)というか、実務で覚えたというか、覚えざるをえなかった、「ACCESS」ですが、私のバイブルは

・北湯口ゆかりさんの「Access 95クエリー早わかり」(SOFTBANK BOOK)


 その頃、既に2000年を過ぎており、Windows 95ベースの本でよいのかと疑問を持もたれる方もあるかもしれませんが、クエリーやテーブルの作り方やSQLの知識は、2014年の今でも通用する内容です。この本も前任者が残してくれた宝物です。今でもこの頃から覚えたノウハウが通用します。







でも、宝になるためには、書いてあることを読み通すというか、忍耐というか、わかるまであきらめないことが大切だと思います。頑張ってやれば、きっとできるようになります。そんなに簡単ではないですが、続けていればできるようになると思います。


 ここで、ちょっと、ひと息。

 ニュージーランドをレンタカーで旅するのであれば、「モーターロッジ」に泊まると楽しい。私はトリップアドバイザーで探しました。宿に着くと受付で、「ミルクはどっちにする?ブルー?or イエロー?」と聞かれます。「ブルー」は普通のミルクで、「イエロー」は、ローファット&カルシウム入り。ニュージーランドで売られているミルクのパッケージの色がその色になっているようです。
 さすがにトンガリロ国立公園のロッジでは飛行機ででる小さいミルクでした。

2014年8月30日土曜日

EXCEL 仕事で覚えた小技 フィルタするなら、まずフィルタクリア

 EXCELでフィルタで行を絞る際、しばしば、陥る落とし穴は、既にどこかの列がフィルタで絞られていることに気がつかない、あるいは、忘れていることです。
 そのまま、フィルタをかけても、誤った結果しか、得られない、どうも変だ、出てくるはずの行がでていない、などいった罠にハマってしまうことが、多々あります。
  • 最初のフィルタ前にフィルタ全クリアが鉄則
また、これが一番、ハマルのですが
  • こまめにセーブは基本中の基本
せっかく、何時間もかけて作成した作品、編集した結果がちょっとした「気の迷い」、操作ミスで、セーブせずにEXCELを終了してしまうことがあります。「こまめにセーブ」はEXCELに限らず、いろんなシーンで言えることでもあります。
 また、これと似ているのですが、
  • 修正のたびに別文書へ
これもかなり、重要。救いの神です。修正したら、こまめに別文書でセーブ。私は、文書名の一部に日付や時刻、改版理由などを付けて、版数を管理しています。






A lifesaver's coming


2014年8月28日木曜日

仕事で覚えたEXCEL小技 条件付き書式でセルに色を付ける

 条件付き書式でセルに色を付けるには、条件付き書式タブで、例えば、条件として
  • NOT(ISNA(VLOOKUP($Sheet1.$K$2,holidays,2,FALSE())))
として、色を設定しておきます。これにより、holidaysという名前を付けた祝日リスト(日付、祝日名)のテーブルを参照して、該当すれば、色がつくことになります。

これと、以前、ご紹介した小技
 excelで前月の最終月曜日を計算する EXCEL fuction calendar
と組み合わせると、イカしたカレンダーができます。



2014年8月26日火曜日

仕事で覚えたEXCEL小技 SUMとSUBTOTAL

複数のセルの合計を計算するときに使う関数としては、普通なら、
  • SUM関数で、=SUM(A1:A10)
みたいに使いますが、
  • SUBTOTAL関数を使い、=SUBTOTAL(9,A1:A10) 
とすれば、
  • 途中のセルをフィルターで除外したら、その部分はカウントされない
という便利な効果が出てきます。

逆に言えば、SUM関数にすれば、フィルターをかけても、合計値に影響を与えることはありません。


私は合計をとるときは、SUBTOTAL関数を使うことが多いです。


ちなみに、SUBTOTALの次の9は、合計値を求めるときに指定します。3を指定すると、対象となった数値の個数(セル数)が入りますので、平均値をとるのに使えます。

  • 平均値 =SUBTOTAL(9,A1:A10)/SUBTAL(3,A1:A10)
複数の列に同じ式を使えるというのがポイント(ミソ)です。

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


 ニュージーランドでの車の運転ノウハウ。レンタカーの旅は、楽しいですよー。

 ニュージーランドの道路の交差点は、信号がなく、「ラウンド・アバウト」という、道の交差が角ではなく、サークル(円型) になっているところがあります。さすがに大都会のオークランドでは信号がある交差点が多いですが、田舎では殆ど、この信号なしのラウンドアバウトばかり。信号機を付けなくてもよいし、信号を待たなくてもよいという利点があると思います。
 このランドアバウトでは、車はサークルに入る前に一旦、停止し、右から車に気をつけながら、サークルへ進入します。そして、サークルをまわりつつ、自分の行きたい道へと入ればよいわけです。サークルへ入るタイミングをつかむのが難しそうですが、そんなに車が多くないので、意外と大丈夫ですよ。
 サークルの中が2つ、3つ車線がある大きなサークルでは、回っているうちに車同士がぶつかりそうで、ちょっと怖い感じがありますが・・・。




2014年8月24日日曜日

IE + VBAで仕事を効率化 Webシステムを自在に操る

 これまでに、以下の3ページで、もの凄く、簡単に、Webシステムの操り方をご紹介しましたが、この2ページは、途中で挫折しかけつつも、3ケ月もかかり、「まわり道」したおかげでのスキルの「つながり」があり、なんとか、やりたいことができたのでした。
 インターネットでいろいろ、ご指南して頂いたおかげもありますが、うまくいかない時、「まわり道」になっているなぁと思うときこそ、頑張って、精進することが大切なのだなぁと最近、つくづく思うのでした。

 人生に無駄なことなど一つもない。そして、最後まで諦めないこと。(と思う、思いたい・・・、てっ) 

   The following 2 web pages introduce how to get info from web systems automatically by IE + EXCEL VBA.
   It took 3 months for many tries and errors. I almost set back.  

 Nothing is useless in your life. Never give up! I think, want to believe.

 最後に、デバッグ方法なのですが、VBAの「ブレークポイント」と「Debug.Print」でできましたよ。My debug methods are use of "Breakpoints" and "Debug.Print".
  • Debug.Print "これじゃ”& objIE.documet.URL
みたいな感じで、内容を出力する変数(パラメタ)を指定したり、特定のメッセージを出すことでプログラムが思ったとおりに動いているのか、確認します。簡単です。Very simple.





 

2014年8月21日木曜日

仕事で覚えたEXCEL小技 $(ダラ)って便利だら

仕事でEXCELを最短で習得するには、近くにいる達人に聞くこと。

VLOOKUPの第2˚パラメタで、範囲を指定する際、$A$1:$E$10と通常の範囲指定の頭に$(ダラ)を指定しておく。
すると、VLOOKUP を入れたセルをコピーして、他のセルに展開するときに、
EXCELが勝手には範囲をシフトすることを封じる(防ぐ)ことができる。

EXCELの自動変換は、便利なこともあるが、邪魔になることもある。
それを封じるのが、$(ダラ)だね。便利だらー。















 ここで、ちょっとひと息。ニュージーランドのレンタカーのお話。
 2012年、北島のオークランドでレンタカーを借りた。大手が安全なので、ハーツ(Hertz)をネット予約。
 空港にあるハーツのカウンターでレンタカーのチェックインをテキトーな英語でどうにか済ませると、キーとカーナビ(オプションで付けた)を渡され、車の置いてある番号(例えば84と)が告げられる。
 これだけだけだ。That's It. ハーツは空港ビルのすぐ隣に駐車場があるので、とても便利。車を返すときもこの同じ番号の場所に駐車し、キーとカーナビを空港内のカウンターへ返せばよい。凄くシンプルなシステム。

2014年8月16日土曜日

IE+VBAで仕事を効率化 Webページの表(TABLE)をセルに取り込む

IE+VBAでWebシステムを自動操作するときのノウハウ~Webページの表が
タグで作られているなら、以下のコードで表の内容をセルへゲットできるよ。
'  j : row counter   i : line counter 
j=0
  For Each objTBL In objTBL.document.Frames("bodys").document.all.tags("TABLE")
    For Each objTableItem in objTBL.all
       Select Case objTableItem.tagName
       Case "TR","TD","TH"
         Select Case objTableItem.tagName
           Case "TR"
             j = J+1
             I = 0
           Case "TD","TH"
             i = i + 1
             WorkSheet(your-sheet-name).Cells(j,I).Value = objTableItem.innertext
         End Select
       End Select
     Next
   Next
やればできる。時間はかかるけど、でも次に繋がる。そのときは、楽できるはず。それを信じて・・・。 
私のVBAバイブルは、大村あつしさんの本。とりわけ、Windows APIを活用する本は秀逸。図書館で何回借りたことか。先日、図書館に行ったら、古い本のためか、本棚から姿を消していた。残念、いい本は内容が古くなっても、そのエッセンスは不滅で、いつの時代でも通用するのに・・・。 でも新しいヴァージョンが出ていました。コレですよ、コレ。最新化されたんですね。凄い!

2014年8月15日金曜日

debian wheezy+avastでdatabase updateできない そして 引数エラー(argument error)

linuxウィルス対策ソフトにavastとclamavを入れてみた。
avastはGUIだと、databese updateが失敗したけど、以下で解決。

debian wheezy+avastでdatabase updateできない のであれば
  • ターミナルでavast-update
そのあと、debian wheezy+avastで引数エラー(argument error) であれば、
  • sudo sysctl -w kernel.shmmax=200000000
でもこれは、一時的なので、スクリプトでやるように変更。

clamavの方は、ノートラブル。凄いね。
  • スキャン開始 clamscan -r
      • slackwareの場合、Slackbuild(sbopkg)でdownload+build+installし、freshclam その後 clamscan -r
      •   /etc/rc.d/rc.clamav start でデーモン起動で終わり。
linuxのウィルスソフトは、なぜ少ないのかなぁ・・・



2014年8月13日水曜日

excel 仕事で使える小技 Qを抽出

A1セルにYYYYMMの形式でデータが入っている時に四半期のどれか(1Q、2Q、3Q、4Q)を抽出するには
  • =IF(QUOTIENT(RIGHT(A1,2)-1,3)=0,"4Q",QUOTIENT(RIGHT(A1,2)-1,3)&"Q"
ただし、日本式の4月始まりの年度でのQですよ。
頭にYYYYをつけて、YYYYnQ (ex 20141Q)にするには
  • =IF(QUOTIENT(RIGHT(A1,2)-1,3)=0,(LEFT(A1,4)-1)&"4Q",LEFT(A1,4)&QUOTIENT(RIGHT(A1,2)-1,3)&"Q")
地味ですね、本当に。もっと、サクッとできる方法があるといいんだけど・・・

Which quarters is the value of A1 cell in which data is stored like YYYYMM format?
ちなみに、1月始まりの年度の場合は、以下の式です。

  • =IF(QUOTIENT(RIGHT(A1,2)-1,3)=0,"1Q",QUOTIENT(RIGHT(A1,2)-1,3)+1&"Q")
  • =IF(QUOTIENT(RIGHT(A1,2)-1,3)=0,(LEFT(A1,4)-)&"1Q",LEFT(A1,4)&QUOTIENT(RIGHT(A1,2)-1,3)+1&"Q")



wolfgiurl
wolfgiril








ところでアマゾン(Amazon)のギフト券ですが、千円単位なので、余るときには、安いkindle本とかできっちり、千円単位にしてしまった方がよいですね。私はやられてしまった。余った金額をしぼりとられた。あちゃー。





2014年8月7日木曜日

EXCELで困ったときの小技 うまくCSV化できないなら、Rubyを使え

EXCELのシートをCSV化したい場合、EXCEL標準機能でファイル保存でCSV形式にするとセル内改行やカンマが邪魔して、思い通りのCSVファイルにならないことがある。
そんなときには、EXCELの機能を利用することは諦めて、rubyスクリプトを使おう!

rubyがインストールされていれば、以下の3つのステップで簡単にできるよ。
1)ADODBでEXCELファイルをオープン
2)SQLのSELECT文で1行ずつ、読み込む。
3)読み込んだ1行に大して、セル内改行とセル内カンマを除去する

ただし、最初の1行目をフィールド名として使う場合、そのステップが必要となる。














1)ADODBでEXCELファイルをオープン
require ''win32ole'
# Float() ends in no error or error
def Float_String?(str)
  Float(str)
  true
rescue ArgumentError
  false
end
cn = WIN32OLE.new("ADODB.connection")
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Dtata Source=" +  ARGV[0] + ";Extended   Properties=Excel 8.0;"
cn.CursorLocation = 3
cn.Open
2)SQLのSELECT文で1行ずつ、読み込む
sql =  "SELECT + FROM  [" ARGV[1] + "$]"
rs.Open sql
# to get field  name
rec = []
rs.Fields.each do |col|
  text = col.Name
  rec,push(text)
end
puts rec. join(",")
3)読み込んだ1行に大して、セル内改行とセル内カンマを除去する
while !rs.EOF
  rec = []
  rs.Fields.each do |col|
    text = col.Value
    if text != nil and !(float_string?(text))
      text.gsub!(/(¥r¥n|¥r|¥n|,|)/,"")
    end
    rec.push(text)
  end
puts rec. join(",")
rs.MoveNext
end
rs.Close
cn.Close
10年くらい前にrubyを、5年くらい前にはSQLをほんの少しだけ、かじっていたんけど、いろんな「ひとかじり」がつながっていくことは嬉しい。実に、地味だけど。
そして、上記のコードの殆どは、インターネットでゲットできるんだけど、ポイントは、gsubによる「セル内改行とセル内カンマ」の除去。

2014年8月4日月曜日

EXCEL 仕事でつかえる小技 VBAで複数セル(文字列)の連結 EXCEL Tips at work-- VBA concatenating two cells

 覚えたいくつかの事柄の断片(スキル)が、ふとした瞬間につながることがある。
 EXCELでのセルの選択状態をVBAで読むFor Each in Selectionとコピペできるメッセージを出力できるInputBox
 小さな積み重ねだけど、できると案外、嬉しくなる。
One day, some pieces got at work connect each other and then become a tips.
"For Each in Selection" picks selected cells with the selected order and "InputBox" enables to copy and paste the message output by Inputbox.
Very tiny things but it make me happy when it come up as new idea.
 EXCELで選択している複数セル(文字列)を連結するVBA(マクロ)は、これ。
Here is the VBA which concatenates cells with the selected order.

Sub concatenate()
  For Each  r In Selection
    streach = r.Value
    If strselect = "" Then
      strselect = streach
    Else
      strselect = strselect & " " & streach
    EndIf
  Next
  InputBox Prompt:="Please Copy and Paste", Default:= strselect
End Sub
EXCELのSelectionを使うので、セルを選択した順番をキープして、連結が行われます。
規則性がない、離れたセルも連結できますよ。

Selection of EXCEL enables to pick up cells with the selected order for any cells. without any rules and even distant cells.

2014年8月3日日曜日

石の上に3年、泥縄なACCESS習得方法

  知識がゼロの状態から、仕事のために自力でACCESSを使いこなす(新たなテーブルを作り、リンク関係を定義できる)までの泥縄なノウハウ習得のストーリ。
◆入門編〜マ、やるしかないっスよ!
まず、前任者が作成したACCESSをそのまま引き継いだ。幸運なことに、ちゃんとした引継の期間とトレーニングがあり、1から10まで聞けた。最初は、専門用語や操作の仕方などわからないことばかり。でもみよう見真似でマネすれば、元データからACCESSのDBを作成し、クエリーを出して、データを検索し、加工&集計(これはEXECLを駆使)するまで、3ケ月ぐらいでできるようになった。コツは、教えてもらったことを 、とにかくマネして、使うこと。マネしてマネしてマネる。これに尽きる。失敗が多かったのですが、なんとかなるものです。

ところで、日本にはオープンサーバという不思議な英語があるって、ご存じですか?



英語ではオープンサーバ(open server)とは言わないようだ。UNIX server,Windows server, Linux serverとか、個々のサーバで表現するようだ。
日本語のオープンサーバとは、メインフレームに代表される
独自ハードかつ独自OSというプロプライアタリな技術で構成されるサーバに対し、
UNIXやLinuxなどオープンな技術で構成されるサーバのことを指す。ややこしいのは、多くの場合、Windowsもオープンサーバに分類されることだ。Windowsはマイクロソフトのプロプライアタリなサーバなので、クローズサーバ(Close)またはクローズドサーバ(Closed Server) でよいのではないか?
ちなみに、オープンサーバを英訳するとすれば、open technology based serverはどうだろうか?しかし、英語圏で通じるためには、やはり、個々のサーバでいうのがいいのかなぁ。


へんな英語を作り出す、不思議の国、日本ですわ。

How wonder Japan is !





2014年8月2日土曜日

仕事で使えるEXCEL小技 番外編 ブイルックアップVLOOKUP + ピボットPIVOT

 EXCELとの出会いは、会社の仕事でブイルックアップVLOOKUP。こんな便利なものがあったんだ!知らんかった。てっと。
 例えば、ある列の値(例ではA列)をすべての行について、判別し、特定の文字列(例では”くるみ”か”りんご”)であれば、○をつける。
=VLOOKUP(An,"○をつけるための表”,2,FALSE)
<○をつけるための表>・・・どこにあってもOK
AB
 1 くるみ ○ 
 2 りんご ○ 
これが使えようになったのは、職場にEXCELの師匠がいたおかげだ。本で勉強するよりも、最初は教えてもらった方が断然、習得速度が早い。

 仕事のEXCELの必須アイテム、次は、ピボット(PIVOT)だね。
このPIVOTこそ、職場にいるEXCELの師匠に聞いた方がよい。
PIVOTって何、どういう時に便利か。ひとことで言えば、横串集。いわゆる、クロス集計。





2014年7月30日水曜日

EXCELで困ったときの小技 CSV取り込みで文字列が指数(E+nn)になるを回避 unexpected exponetial E+NN in your TEXT field

EXCELの痒いところに、手が届いていないところの技をひとつ。

EXCELでCSVを取り込むとき、
  • CSVをいきなり、EXCELで開くとか
  • CSVを外部データの取り込みでインポートする
 と、思うように文字列が正しく、取り込まれず、E+NNみたいな指数チックになることがある。
これを回避するには、CSVの外部データ取り込みで、該当フィールドを"G(標準)"ではなく、"文字列"を指定して、取り込めば、OK(テキストになる)。

When Importing CSV data to EXCEL by
  • Open CSV file with EXCEL
  • Import CSV file from EXCEL function tab
specific characters may be unexpected E+NN like exponential.

A solution is to specify the field type "Characters(TEXT)" instead of "G(standard or default )" while you import CSV file from EXCEL function tab.
 


 

2014年7月28日月曜日

IE + VBAで仕事を効率化 Webシステムでページ移動、そのページを捕まえる。How to Move Web pages and Catch them

IEの右クリックで、VBAで操りたいWebシステムのページソースを見てくれ。
JavaScriptでページ移動しているなら、以下のコードをトライ。

On how to navigate pages. Check your web page's source code(html).
If your web system made by JavaScript, try this code. 
  • objIE.document.Scriript.setTimeout "JapaScript: your-systems-javascript",200

ページ移動で新しいウィンドウが開かれる場合、そのウィンドウのIE(例えば your-web-page-title-1というタイトルを持つページ)を捕まえないと
制御できない。そのIEを捕まえるコードが、以下。

The following codes enable you to get the control of the new IE window while a new window like "your-web-page-title-1" is open by JavaScript.  
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
  End If
Next 
    ページへ移動した後に、表示ボタンをクリックしたい場合、こんな感じ。

    If you want to click for details after you jumped the page, try this. 

    • objIE.socument.Frames("your-frame-name").document.forms("your-form-name").elements("your-bottun-name").Click