2011年1月30日日曜日

VBAをつかったツールのインターフェース

仕事で使うツールの開発。
使う言語は最近話題の(私の中だけでねw)VBA。
うちのシステムにあるDBに特定の条件で検索しに行って、結果を拾ってくるっていう仕組みなんだけど、いいインターフェースが思いつきません。
入力データはたぶん100件~1000件くらいで、ユーザはパソコンが使えます、っていうレベルのアルバイトさん。
その人達にストレスなく、性格にデータを入れてもらって、検索をしてもらえるか、そしてその結果を性格に読み取ってもらうにはどうしたらいいか、色々と満たしたい要求があるのです。

しかもそのツールを汎用的なものにしたい。
今回の案件に限らず、ずっと使えるような仕組みにしたいのです。

うーん…。
Excelさんの画面を眺めながらまた考えてみることにします。

2011年1月24日月曜日

IE6の起動時画面サイズ設定

InternetExplorer ServicePack2(IE6 SP2)において、IE起動時の画面サイズを設定する方法。

職場ではIE6を使用していますが、起動時の画面サイズが設定されるされるタイミングがどうもわからず、おかしなサイズのまま設定された画面を毎回最大化して使っていました。
しかしそのままではIEに負けてしまった感があるので(笑)画面サイズの設定について調べてみたところ、解決方法がみつかりました。
このエントリーではIE6の起動時画面サイズの設定について、その詳細をまとめます。

------------------------------------------------------------
1.IE6のウィンドウを1つだけ開く
何の画面でも良いのでリンクがあるアドレスをIEで開きます。
※他に開いているIEの画面があると設定の変更が保存されません。
開いた画面から何かリンクをクリックしてページを移動します。
※お気に入りに登録しているリンクでページ移動すると設定が保存されないため、画面中のリンクをクリックします。


2.設定をリセットする
IE6の画面と他のアプリケーションの画面を1つ以上画面に表示させた状態で、タスクバーを右クリックし、「上下に並べて表示」または「左右に並べて表示」をクリックします。
すると開いている画面が指定したレイアウトにサイズ変更されます。


3.設定したい画面サイズに合わせる
並んで表示されたIE6の画面の四隅いずれかにマウスポインタを当てて、サイズの調整を行います。
この時点で表示したい画面サイズにします。
最大化されたサイズにしたい場合は最大化するのではなく、最大化した場合と同じサイズまでウィンドウサイズを広げます。

4.画面サイズの設定を保存する
設定したい画面サイズが定まったら、Ctrlキーを押しながらIE6の画面を閉じます。

以上で画面サイズの設定が更新され、次回起動時には設定した画面サイズで画面が立ち上がります。
※設定手順は私が収集した情報と検証を元に記載していますが、うまくいかない場合があるかもしれません。
-----------------------------------------------------------------


IEももうバージョン9になろうかという時代ですが、仕事場では業務アプリケーションの都合があったりして未だにIE6を使っています。
JavaScriptの実行速度の遅さや、もはや見捨てられてしまったWebサイトの激しいレイアウト崩れなど、色々使い勝手が悪いのですが、そう簡単にバージョンアップというわけにもいかないでしょうね。
Javaのアプリがこのブラウザで動いていますが、IEのバージョン上げるとどんな影響がでるんだろう。
…ここはまだまだ勉強が足りないところです。

2011年1月20日木曜日

Amazonで大型商品を購入する際の注意(自戒)

Amazonを使って、冷蔵庫を購入しました。
「大型」と言われる商品の購入について、すっきりしない買い物になってしまったため反省の意味も含め、ここに購入までの経緯を記載しておこうと思います。

これから大型商品を購入しようとされている方、そして未来の自分へ、気持ちのいい買い物をしてもらうために。

------------------------------------------------
まず、購入する商品のページをチェックし、性能などは事前に店舗で確認していたのでカートへ入れるボタンをクリックしました。
買う気満々ですw
でもちょっと待って。
これは大型商品
どんなふうに配送してくれるのか、確認すべきです。
配送方法は商品を取り扱っている店によって異なるので、その店舗のページを確認します。
上の画像で店舗名が出ているエリアにカーソルを移動すると、吹き出しでお店の評価が表示されます。
そこに張ってあるリンクをクリックするとお店のページへ遷移します。
…私はこのリンクをみつけるのに少し時間がかかりました。
リンクが張られているのが店舗名ではなく「評価」なので、そのリンクをクリックしてもお店のページへは行けないような感じがして、店舗のページへリンクする文字をしばらく探したのです。
結果どこにもそんなリンクはなかったので、とりあえずクリックしてみた評価のリンクが結果的にはお店のリンクでした。

お店の評価ページを開くと、ページの一番下に小さなリンク集があり、その中に今回チェックしたかった「大型商品のお届けについて」というリンクがありました。
やっと冷蔵庫が手に入る~♪と勢いに乗っていた私は、こんな小さなリンクにたどり着くことはなく、ぽちっとやっちゃったんですがね。
レジに直行すべからずw

さて、そのリンクを開くと簡単にですが配送について説明がありました。
ここまできて、記載の配送方法が気にくわなければ引き返すべきなのでしょう。
ほかの店がどうなのか、比較するポイントにもなるでしょう。
今回私はこんなところ見ていなかったので、注文確認のメールが来たとき、ちょっとびっくりしたのです。

--以下、商品注文確認のメール本文--
お世話になります。ぎおん電気でございます。
この度は御注文いただきまして誠にありがとうございます。

ご注文商品の配送時の注意事項が何点かございますのでご案内差し上げます。

大型商品につきましては路線便による発送になります。
基本的に1名での配達の為、商品をトラックから降ろすところから
どなたかお手伝いを頂く可能性がございます。
また、基本的に軒先渡しでございます。
建物によってエレベーター等が無い場合は階段下までのお届けとなります。
運送会社からの配送人員を2名でご希望の場合は別途料金が掛かります。
商品代金と合わせて、当店にお支払い頂くこととなりますので、
あらかじめご連絡頂きますようよろしくお願い致します。
配送人数を増員されますと、一般的に一人につき1~2万円は必要になるようです)


Web上でのご注文ですので、商品は事前にサイズ・重量等のご確認を頂いた上で
お客様のご判断でご注文を頂戴しているものと判断させて頂きます
「商品が搬入できない」「サイズが合わない」等の理由でのキャンセル・返品等は
お受けできませんのでご注意ください。


発送時、当店より運送会社へ配送希望日はお伝え致しますが、時間指定を希望される方は、
お客様において、直接運送業者と連絡を取って調整していただくことになります。


以上を再度ご確認いただきまして、ご連絡頂戴出来ますでしょうか
お手数とは存じますが、何卒宜しくお願い申し上げます。

------------- メッセージはここまで -------------
※本文中の下線と太字は加筆しました。

確かに軒先までと書いてはあったけど、階段だった場合の対応が階段下までのお届けって、、
このメールで私はやらかしたんじゃないかという気持ちになってきたのです。
購入したものが自宅まで届かない恐怖、これに震え上がりました。
届けて欲しくば身代金をよこせ、的なニュアンスに聞こえてくるのです。

あとどうでもいいことですがこういうちゃんとした文章で疑問符(?)を使うのが大嫌いですw

こんなメールをもらって、私の頭の中はいろんなことでいっぱいになり、結果勢いで強行突破です。
日曜日に届く予定ですが配達人員1名、あと私っていう状況をつくりました。
注文キャンセルしてもよかったのではないかと、Twitterのお友達からの助言を得て思いましたが、時すでに遅し。
じゃ、よろーって返信しちゃいました。




日曜日、どうなるのかわかりませんが、2階にある私の部屋まで階段を使って運んでもらうつもりです。
もちろん私も協力します。必要だったらミニスカートはきます(違
約束と違うのでできません、なんて言われたらどうするんでしょうね、日曜日の私は。

------------------------------------------------------
さてさて、検証。
連日の食あたりで弱っていた私は、冷蔵庫を買うべきだという意志に追われていました。
したがって購入までに入手すべき情報を入手しないまま購入手続きを完了させてしまいました。
店舗での購入と違い、店員さんと会話することのないネット上での買い物では、自分から店員さん代わりに情報を発しているところへ行き、情報を得ないといけません。
Webサイトの特性上、1つのページに必要な情報がそろっていないことも多いです。

しかし能動的な情報収集では購入までに必要な情報がすべて確認できたかどうかわかりません。
今回の例で言えば大型商品の発送について、ページで確認できましたが「階段だった場合」については記載されていませんでした(もしかしたらどこか奥深くに書いてあるのかも知れませんが 苦笑)。
そこで「階段だった場合はどうなのか」と疑問をもって問い合わせをする方もいらっしゃるかもしれませんが、玄関先まで運んでくれるのが当たり前だろうと思っている方は問い合わせをしないと思います。
私は後者です。

もし何か少しでも疑問に思うことがあったら、迷わず問い合わせるべきですね。
急いでいたとしても、注文してから思っていたことと違っていた場合、キャンセル完了してからまた別のお店を探すことになるので手間も時間も余計にかかりそうです。
私みたいにせっかちだと失敗しやすいのかも 苦笑


ネットショッピングはとても便利だし、仕事をしていてなかなかお店に行く時間がなくてもわずかな時間でいろんなものを手に入れることができます。
しかしいろんな手続きを画面の中で完結させてしまうので、考慮すべきことについては自ら答えを求めていかなければなりません。
ヨドバシの店員さんみたいに、商品のことや設置のこと(その他雑学的なことも含めw)をしゃべってくれたりはしないのです。

「満足のいく買い物をする」場としては、店舗で買うよりもハードルが高い場所のような気もします。
が、これも便利な社会を生きて行くには必要なスキルとなっていくのでしょうね。

2011年1月18日火曜日

VBAのお勉強

要求仕様書の書き方とか、データベース概論、Access・・・と、あっちゃこっちゃに手を広げて勉強していたのですが、それもなんだか身が入らず 苦笑
最近仕事でよく使っているVBAの勉強に注力することにしました。

4年くらい前に買って読んで勉強した本をまた取り出してきて、通勤中に読んでます。
「かんたんプログラミングExcelVBA」っていう本です。

改めて読んでみるととってもわかりやすくてよくツボを押さえてあるなと思います。
忘れていることがたくさんあったので、付箋だらけになっちゃいました。

今更感もあるんですがどうして今、基本的なことの振り返りに戻ったか。
いくらかの知識はあって、仕事でもがんがんプログラミングしてました。
しかし困った困った。


デバッグ。


やりたいことの記述はできるんだけど、それがエラーでかえってきたときに何がいけないのかがわからないんです。
リファレンス本やWebサイトで調べたソースであれこれやってたんですが、デバッグ作業に行き詰まることが多くなって、それで改めて基礎を押さえようと思ったのです。
SelectionとActivateの使い分けとか、どういうときにSelectできるのか、Withの宣言は?
…などなど、構文的には間違いなくても、その構文が使える前提条件がどうあるべきか、そこをしっかりおさえておかないとデバッグの無限ループにはまっちゃいますね。
だって構文間違ってないんだもんw

リファレンスは「ExcelVBA逆引き大全600の極意」を使っていて、便利なのでいつも机に出してます。
自分でかき集めたソースも追加しつつ使ってるので、手放せない一冊になってます。


ついでと言ってはなんだけど、こうやって勉強したことが身になってるのかどうか、ExcelVBAベーシックの資格試験を受けようかなと思ってます。
2月末までに一通り勉強して、3月上旬くらいで受験できたらいいかなぁ、なんて。
※VBAエキスパート
参考:http://vbae.odyssey-com.co.jp/about/outline.html

自分の実力を測るいい機会にしたいです。





2011年1月17日月曜日

VBAでIE操作~IE起動とロード待機のプロシージャ~

VBAでIEを操作するマクロの開発。
IEの起動とURLアクセス後のページ読み込み待機処理はマクロ中でよく使う部品なのでサブルーチン化しました。
きれいなソースを目指してあれこれ調べては改造を繰り返していますが、とりあえずこれで使えるものになったかなぁ・・・ということでエントリーです。

以下ソース


'【要件】
'IEの起動
'指定URLの表示


'【要件詳細】
'空白のIEページを表示する
'表示したIEページ上で指定したURLのページを表示する
'指定したページの読み込みが完了するまで待機する


'【処理フロー】
'空白IEWindow起動
'  ↓
'指定URLへリンク
'  ↓
'ページ読み込み待機


'【プログラム上の制約】
'サブプロシージャとして機能できるよう、パブリック変数を使用する


'【構成】
'-Option Explicit
'--パブリック変数
'-BootIE
'--IEの起動
'-WaitIE
'--ページ読込待機


'【詳細設計】
'------------------------------< start of source >------------------------------
Option Explicit
Public objIE As Object      'IEオブジェクトをセットする

'--------------------< start of SubRoutine >--------------------
Sub BootIE()
'空白のIEページを表示する
  
    'IEObjectをセット
    Set objIE = CreateObject("InternetExplorer.application")
  
    'セットしたObjectをActivate
    objIE.Visible = True
  
    'Objectの表示位置調整
    objIE.Top = 0
    objIE.Left = 0
  
End Sub
'----------< end of SubRoutine >----------


'--------------------< start of SubRoutine >----------
Sub WaitIE()
'指定したページの読み込みが完了するまで待機する
    Do Until objIE.busy = False
        DoEvents
    Loop
  
End Sub
'----------< end of SubRoutine >----------
'------------------------------<  end of source  >------------------------------

VBAでIE操作~起動中の画面タイトルを取得~

IEで起動している画面のタイトル一覧を作成するというVBAのプロシージャを作りました。
元々はある掲示板にあったソースで、それを自分の作業用に改変しました。
参考:http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200508/05080025.txt

今回こんなプロシージャを作ったのは、IEにおいて、起動しようとしている画面が既に開かれていないかをチェックするためです。
同一画面を2つ以上立ち上げていると予期せぬ不具合が発生しうるというシステムに対する回避策です。
今後のソース改造と勉強のためにひとまずエントリーしておきます。


以下ソース

Sub GetIETitle()
'IE test 用プロシージャ
'開いているIEWindowのタイトルを取得する

Dim objShell As Object
Dim intIEcnt As Integer
Dim i As Integer
Dim objIE(64) As Object
Dim objWindow As Object



'IE検索
'シェルのオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
      
'IEウィンドウ数初期化
intIEcnt = 0
      
'ウインドウの数だけまわす
For Each objWindow In objShell.Windows
  
    'MsgBox TypeName(objShell.windows)
    'Debug.Print "タイプは:" & TypeName(objWindow.document)
            
    'HTMLDocumentだったら
    If TypeName(objWindow.document) = "HTMLDocument" Then
        'オブジェクトを代入する
        Set objIE(intIEcnt) = objWindow
        intIEcnt = intIEcnt + 1
    End If
Next
Set objShell = Nothing

'IE TITLE取得
'発見したウインドウの数だけまわす
For i = 0 To (intIEcnt - 1)
    objIE(i).Visible = True
    Worksheets("test").Cells(i + 1, 1).Value = objIE(i).document.Title
  
Next i
End Sub

2011年1月4日火曜日

VBEでのデバッグ:ブレークポイント

VBEでのデバッグについて。

最近仕事でVBAを使ったツールの開発をする機会がちらほらあります。
ツールと言っても社内業務で使うレベルの小さいプロジェクトですが、ほかにVBAができる人がいないため要件定義から設計・開発・テスト・保守を一手に引き受けている状態です。
プロジェクト運営の演習みたいな感覚で取り組んでいます。


もともとVBAは好きで、まぁ好きレベルで勉強していたのですがツールを作るようになってまた私のVBA知識がちょっとずつバージョンアップできています。

今回はデバッグツールについて。
開発をしているとテストとデバッグは必須作業ですが、私は作ってばっかりで今までデバッグの効率的な方法はあまり知りませんでした。
今もまだまだ勉強中ですが、追記を前提にここにVBEでのデバッグについて書き留めておこうと思います。

------------------------------
■ブレークポイント
プロシージャの行頭から指定した位置までを実行する。
実行時にローカルウィンドウを表示させておくと、実行停止時点での変数の値を確認することができる。
停止させたい行の左側のバーをクリックすると丸いポインタがつき、ブレークポイントが設定される。
もう一度同じ場所をクリックすると丸いポインタが消え、ブレークポイントが解除される。
この状態でプログラムの実行をすると指定したブレークポイントの直前までのプログラムが実行される。
下のサンプルプログラムを例にすると、この状態でプログラムを実行した場合、変数aには「aaa」が代入された状態となる。

--サンプル--
Sub test()
    Dim a As String
    
    a = "aaa"
    
    a = "bbb"       'ここにブレークポイントを設定
    
    a = "ccc"
End Sub

--サンプルここまで--
ちなみにローカルウィンドウはVBEメニューバーから
[表示]→[ローカルウィンドウ]
を選択して表示させることができる。
------------------------------

この機能を使うようになってから、プログラムをとりあえず全部実行してテストするということはなくなりました 笑
実行しなくていいプログラムを実行するのは時間の無駄ですし、せっかく整えたテスト環境やテスト用のデータがおかしなことになっちゃったりもします。
何より、バグが出ている原因を探るのに時間がかかりすぎますね。



プログラマさんだったら当たり前にこういう部分的なプログラムの実行をしているのかもしれませんが、独学プログラマな私はこういうデバッグ方法にいちいち感動していたりします。
自分がやりたいことを自分で探して身につける、ちょっとずつしか進めませんがこうして学んできていることは確実に自分を大きくしてくれていると信じています。