エンジニアが発信する【VB/VBA】の記事を集めました

エンジニアが作る最新ITブログ トップ>エンジニアの発信する【VB/VBA】

2012年01月29日

気負わず

年末から「何人分やねん?」という仕事をしていたため、仕事場に泊まることがたびたび(入浴設備や宿泊設備があるのは有り難いことです)、更に家も寝に帰る程度か、休日は子供の餌食・・、という日々であった。
それに加え、まとまった内容の文書で記事を、と考えていたので全くと言っていいほどブログの更新できなかった・・。

さて、今年のこのブログや研究テーマについて。どこまでやれるかは別として・・。

・VBAと算数/数学のアプローチ
 最近、業務で図形データを扱うことがある。これを行うには数学的知識が結構必要になる。私自身が高校生の頃に「これって何の訳に立つのか?」と全く理解できなかった行列など、バリバリ使うのである。
 そういう数学をグラフなり、図形の表現で理解しやすくできればと思っている。

・VBAとDelphiとの連携関連
 昨今、VB.netとVB6のどちらを入手しようかと(VB2005なら既に持っている)悩んでいる時期があった。例えばDLLを作成する際に、.net Framework に依存したくないが、VB6ではテクノロジが古い。かといってC++はあまり私にとって扱いやすい言語ではない。
 その解決として、Delphiを選択することにした。Windows ネイティブコンパイラであり、テクノロジも新しく、昔それなりに使っていたからだ。
ということで、今年はDelphiで作成したDLLをVBAから呼ぶ、などというものも紹介することになるかと思う。

・クラスモジュールの使い方紹介
 このブログへの到達キーワードからしても、このテーマは外せない。
 利用サイドの方に利用しやすく、かつ理解もしやすいものを成果として残せればと思う。

2011年12月08日

提供する情報

最近のTVコマーシャルで聞いたフレーズ「ぶれんじゃねーぞ」という言葉。

VBAに関して、自分ではこうしよう、ああしよう、というものは持っていたつもりである。しかし、ここ最近は特に、ブログにはその方向とからはぶれた情報をかなりアップしてきていたように思う。だからモチベーションが上がらず、更新頻度も落ちているのではないかと自己分析。

そもそも、自分のメモとして開始し、過去に作業したモノなどを遠隔地で取り出せるようにしようとしたのがこのブログの始まり。確認すると 現存する記事で一番古いのは 2006/3/31。てこ入れなどで触っていたのでそれより少し前からとなる。当時は確かライブドアブログが利用者一位で、二位だったアメブロが猛追していた頃だったと記憶している。利用者も100万人に届くとか、越えたとか言っていた頃だ。仕事ではまさにVBAで基幹システムを構築した後で、そのノウハウを残しておこう、と思っていた頃だったか。

原点回帰を試みてみようと思う。
  • なうで紹介
  • mixiチェック
  • ツイートする

2011年12月06日

LenB

Excel 5 のVBAを使っていた人にとって、次の Excel 95 のVBAで難儀な思いをされた方は多いかもしれない。というのも、内部で扱うコードが変わったからだ。

従来は、例えば あいうえおABCDE といった、全角と半角が混じった文字列の長さを取ると
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 15 (全角が1文字2バイト、半角が1文字1バイト)
という値が返っていた。

ところがバージョンが上がったら
・Len()関数では文字数の 10
・LenB()関数ではバイト数の 20 (2バイトのUniCodeなので文字数の倍の値)
という値が返るようになった。それは今なお同様である。

確かに関数としては正しい動きなのかも知れない。しかし、それなら単に×2をしても求められるではないか。おかげで「全角文字がどれだけ混じっているか」というようなことをLenB関数の結果からLen関数の結果を引けば求められる、というようなことにはならず、いったんStrConvで変換してからとかすることになっている。

ただ、注意点として。StrConvでUniCodeからShiftJis+ASCIIに変換すると、内部的には「バイナリ」である訳で、変換したモノをRightB、LeftB、MidBなどで切り出すのはいいとしても、文字と一致するかを判定するには内部コードと同じUniCodeに戻してやらないといけない。

意外とこういうところではまることがあるので注意したい。
  • なうで紹介
  • mixiチェック
  • ツイートする

2011年11月08日

VBAでのImplements その1

Implementsというのはオブジェクト指向の言語をそこそこ使っている人ならよくご存じだろう。VBAでもImplementsという定義がある。

オブジェクト指向言語におけるImplements は Intarfaceと対で利用される。しかし、VBAにはIntardaceはなく、Implementsしかない。なぜそうなっているかとか、ImplementsとIntarfaceの説明などをするのもいいのかもしれないが、それよりは試してみたところ、Implementsを使うとこういう事ができます、というような事を紹介したいと思う。

実のところ、それほど有用な例を見つけるには至っていない。しかし、人柱としてやってみた結果くらいは残しておこうと思う。

ということで、11月中目処にあと2回程度、VBAでのImplementsと題して書いてみようと思う。




  • なうで紹介
  • mixiチェック
  • ツイートする

2011年11月02日

アプリ設定ファイル(XML)作成ツールをVBAで

簡単なフォーマット変換プログラムを作成しようとしている。
全体をAccessやExcelで作成してもいいのだが、バッチ処理をさせにくいとか、AccessやExcelがインストールされていることが前提になってしまうので、C#かVBあたりでの作成を考えている。

処理自体は簡単なのだが、汎用的に使えるよう、入力フォーマット、出力フォーマット、入力項目と出力項目の対応、を設定ファイルで定義できるように設計した。
しかし、その設定ファイルを更新するのが面倒くさい。ファイルのフォーマットなんてExcelで作られることが多いので、それをそのまま利用できるようにした方が使い勝手もよいだろう、ということでExcel VBAにて作成することとした。運用上、その方が修正も確認も簡単になる。

プログラム自体は簡単である。
これを
・保守性を高くする(修正が簡単に効く など)
・可読性を高くする(処理の流れを追いやすい など)
とするように作成している。

ごく簡単な事例なので、近いうちに紹介できれば、と思っている。



  • なうで紹介
  • mixiチェック
  • ツイートする

2011年09月18日

なぜか日本初になりそうな仕事

今携わっている仕事で、「え?そんなのまだシステム化されていなかったの?」という案件がある。
確かに技術的に面倒な問題もあるが、すでに解決策もある。
全国どこにでもあるような仕事なのに、どこも手をつけていないのはなぜか?いくつか要因はあるだろうけれど、こういう仕事を頼める会社が減っているからだろう。

世の中のシステム開発を名乗るところの多くがWeb技術に傾倒している。Webの技術の進展は確かにめざましいモノがあるが、用途はプル型の広告かBtoCのもの。企業内でのデータ処理や企業間での一括のデータ授受
などのBtoBは脚光を浴びていない。今回のものはその脚光を浴びていない部分で、単純なデータ処理やデータ変換と企業間のデータ連係である。ネットワークで直接はつなげない事情があるのでメディアは手渡しであるが・・。

こちらでの作業も今の仕様だけなら1ヶ月で販売促進用でもツールや全国どこでも使えるようなカスタマイズキットを含めて作成できる。
しかし、お客様は来年度、そのシステム部分だけで数百万の予算を確保するらしい。その額でも十分に今の人件費からすれば桁違いに安く上がるらしい。


現在、ただでさえ案件が集中しており(自分でコントロールできるなら時期をずらすのだが、外的要因であるがために)大変だが、非常にやりがいのあるものである。

ちなみに、上記に書いた販売促進用はExcelVBAで作成する予定である。これはだいたい3日間を予定している。

  • なうで紹介
  • mixiチェック
  • ツイートする

2011年07月25日

VBA関連 規約を小分けに考えてみる

現在、VBA関連で規約のようなものを作りかけている。
・クラスモジュールに関するもの
・一般的な開発標準に関するもの
・Accessの開発の留意点
の3つになるか。

このうち、Accessの開発の留意点は最近のブログで書き始めたもの。しかし、これを書くには基礎知識である、一般的な開発標準に関するものをきちんと整っていないと結構説明が面倒くさいことが分かってきた。そこで一般的な開発標準に関するものも早めに整備してみようと見たら、ああ、これはちょっと完成させるのに時間が掛かりすぎる。
そこでテーマごとにもう少し小分けにしていこうと考えている。

これで集中的に作成していければと思うが、どこまで考えたとおりにできるだろうか・・。



  • なうで紹介
  • mixiチェック
  • ツイートする

2011年06月22日

Accessを上手に使おう 挨拶

まだ20世紀だった頃。ある会社の社長と飲んだとき「Accessってのは敷居は低く見えてそうでもないし、かといってたいしたことが出来るわけでもない」と結構ひどい評価を下していた。

その後、本格的にAccessの案件に関わることがあったが、作りがひどい。誰かが作っていたのを別の人がメンテしていて「無理」と放り投げたのを私がキャッチした。Excel VBAの案件という触れ込みで参画したはずなのに・・・。しかし、若干クセはあったものの、それほど困ることはなくAccessの世界にも足を踏み入れることとなった訳だ。当時はExcelの他、WordやOfficeのVBAには携わってたが、AccessはJetが嫌いで避けていたのだった。

余談の長いのが年寄りの悪いところだ。さて、今回からときどき「Accessを上手に使おう」というのを記事にする。
目的は「Accesssでは限界を感じているもの」をなんとかしよう、というもの。なんともならない原因はAccess固有の方言ではないだろうか、と思っている。それを解消すれば移行も夢ではないのだ。

ということでなるだけこの記事の頻度は多くなると思うが、よろしくお願いいたします。



  • なうで紹介
  • mixiチェック
  • ツイートする

2011年06月08日

プログラム言語と自然言語

プログラム言語にせよ、自然言語にせよ、言語の目的は「伝える」ことであろう。ただ言葉を投げるだけではなく、受け取り手が居て、それを受容/共感/無視/拒絶を経て関係が始まる。
この辺の社会学的?なところは余談。

日本語は細やかな表現ができる一方、論理性に欠けるといわれる。一方、英語などは論理的な表現に向くといわれる。これは日本語は句読点はあるものの文字を切れ目なく綴ることに対し、英語は単語単位で連ねていくため、切れ目が分かりやすいということもあるのだろう。IT関連では英語の文献にあたることもときどきあるが、論理的であるがためにずいぶんとラクに解釈させてもらっている気がする。
これも余談。

さて。
昨今、日本語が乱れていると指摘されている。確かに外国人からすれば「?」と思える表現は至る所に見受けられる。ただ、気になっているのは「日本語の表現の細やかさが失われつつある」ように思える。
例えば、「やばい」という言葉。仕事場の若い子が食事の際に使っていたが意味が分からなかった。「産地偽装されている食材では」という疑いなのか、「放射性物質大丈夫か?」という懸念なのか、「皿が欠けてて危ない」という意味なのか。結局は「おいしい」という意味だったらしいが、まったく通じない。言葉でのコミュニケーションではなく、その場の雰囲気、いわゆる「場の空気」がなければ伝わらないレベルの言葉になってしまっている。

コンピュータ言語も「コンピュータに指示する」ための言語であるが、最近のプログラマのプログラムが読みにくいケースが多い。トラブル時にチェックすることがあるのだが、理解に苦しむケースが多い。
論理表現も多いので数学的センスもある程度は必要ではあるが、その基礎すらできていないために冗長表現になっているケース。業務上の知識が不足しているがために陥っている奇妙なロジックがあるケース。それ以前に、後々読みやすくしておこうという工夫が一切されていないケースが結構ある。
例えばVBAの場合でも、Cell("A1") という表現と Cell(1,1) という表現を混在させるケースや、セルの場所を取得するのに絶対位置と相対位置を使っていても、絶対位置用の変数と相対位置用の変数とでどちらがどちら用の変数かわかりにくいケースがあり、その変数の取り回しによってバグを潜在していているケースもあった。

プログラムの記述も
・わかりやすく
・シンプルに
・読みやすく
というような基本的なところが意外と実践されていない。VBAではこれは致命的なのではないかと考えている。

裏を返せばVBAでも他の言語でも、ちゃんとした情報がないのではないか?そういえばJavaはそのあたりしっかりしていたように思う。が、他のオブジェクト指向言語ではダメダメなのか?と考えていたが、要は「Javaで学んでからその言語に移行したわけではないから」だろうと思う。VBAならなおさらだ。こちらで整備が必要な部分かもしれない。
  • なうで紹介
  • mixiチェック
  • ツイートする

2011年04月26日

[ 備忘録 ] コマンドラインから Virtual Box の仮想マシンを停止する方法

VirtualBox で仮想マシン実行中に、ホストをシャットダウンしようとすると警告が表示されます。 もちろん、警告を無視して VirtualBox を強制終了させればホストをシャットダウンできますが、 この場合は VirtualBox の設定が壊れたり仮想マシンが壊れてしまうことがあります。

震災の影響で電力供給が不安定ないまだと、UPS ( 無停電電源装置 ) のシャットダウンシグナルをトリガーとしてマシンを停止させたい(*1)といったこともあるでしょう。UPS からシャットダウンシグナルが送られてくる場合はその地域に停電が発生している可能性もあり、マシンにリモート接続してシャットダウンといった方法は取れないことも考えられます。安全に仮想マシンを停止するにはどうすればいいのでしょうか?

結論からいってしまうと、VirtualBox には VBoxManage という仮想マシンの設定や状態を管理するコマンドが用意されているので、これを利用します。VBoxManage コマンドですべての仮想マシンを終了するスクリプトを作成しておき、シャットダウンシグナル受信時にそのスクリプトが実行されるようにしておきます。

VBoxManage コマンドで仮想マシンを停止するには次の 2 つのステップで操作します。

  1. 起動している仮想マシンを確認する
  2. 起動している仮想マシンを停止する

1. 起動している仮想マシンを確認する
VBoxManage コマンドに "list runningvms" オプションをつけて実行します。

> VirtualBox list runningvms
"ubuntu10_04" {57e88170-bb7e-4728-ba05-4724cdfe6cdb}
"squeeze_x64" {0d584575-84f6-4800-b74c-ef6b22cfbe9a}

ダブルクォートで囲まれている部分、上記の例では "ubuntu10_04" と "squeeze_x64" が、GUI の仮想マシン名にあたるものです。 その横の波かっこ {} で囲まれている部分、上記の例では {57e88170-bb7e-4728-ba05-4724cdfe6cdb} と {0d584575-84f6-4800-b74c-ef6b22cfbe9a} が UUID と呼ばれるもので、VirtualBox がそれぞれの仮想マシンの管理に使用している固有の識別子です。

2. 起動している仮想マシンを停止する
VBoxManage コマンドに "cntrolvm savestate" オプションをつけて実行します(*2)。
の部分は、先ほど確認した仮想マシン名または UUID を使用します。

たとえば、先ほど確認した中にある squeeze_x64 を停止する場合は次のようになります。
100% と表示されてプロンプトに復帰すれば停止処理は完了しています。

> VBoxManage controlvm {0d584575-84f6-4800-b74c-ef6b22cfbe9a} savestate
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

起動中の仮想マシンすべてを停止するスクリプトを作成し、シャットダウン時に実行するようにしておきましょう(*3)。

(*1) シャットダウンシグナルを送ってくれるかどうかは UPS 次第です。安物だと何もしてくれないことも・・・

(*2) "cntrolvm poweroff" というオプションもありますが、こちらは「いきなり電源ケーブルを引っこ抜く」ことに相当します。つまり、こちらを実行するとデータは保存されませんし、仮想マシンが壊れる可能性もあります。

(*3) Windows の場合はグループポリシーで設定します。XP/Vista/7 では通常は設定用画面は見えませんが、MMC というツールを使用することで設定できます (下位エディション除く )。

Reference
VirtualBox Manual Chapter8. VBoxManage

エンジニアが作る最新ITブログ トップ>エンジニアの発信する【VB/VBA】

メンバー紹介

タグパネル

ランキング

エンジニアが作る最新ITブログ DODA