技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

Excel・VBA:始めてのマクロの作り方(Hello World)

Excelのマクロ(VBA)の作り方の紹介です。
マクロを使える設定にしてから、「Hello World」をポップアップで表示するボタンを作成し、保存する所まで紹介します。
Excelのバージョンは Excel 2013 とします。
 
手順1:マクロを開発可能にする
Excelの任意のファイルを開き、「ファイル」タブを開く。
「ファイル」タブの「オプション」を選択する。
f:id:akira2kun:20191012223752j:plain

オプションが表示されるので、「リボンのユーザー設定」タブを選択し、「開発」のチェックボックスをONにし、「OK」を押下する。
f:id:akira2kun:20191012223803j:plain
 
手順2:マクロ有効ブックとしてファイルを保存する
「ファイル」タブを開き、「名前を付けて保存」を選択する。
保存する際、ファイルの種類を「Excel マクロ有効ブック(*.xlsm)」を選択する。
f:id:akira2kun:20191012224330j:plain

 
手順3:ボタンを作成する
「開発」タブの「挿入」から「ボタン(フォーム コントロール)」を選択する。
f:id:akira2kun:20191012223826j:plain

任意の場所にボタンを作成すると、「マクロの登録」ウインドウが開く。
ここで「新規作成」を選択する。
f:id:akira2kun:20191012223835j:plain

ソースコードの入力画面に遷移するため、下記のように記述する。
(ボタンの名前が「ボタン1」の場合)

Sub ボタン1_Click()
     MsgBox "hello world!"
End Sub
  
手順4:ボタンの稼働確認をする
手順3で作成したボタンをクリックする。
hello world!」と書かれたポップアップが開くことを確認する。
 
---------------------------------------
 
今回の例はごく平易です。
しかし、ここまでできるようになれば、プログラム言語の経験者であれば自分で調べながら実務レベルのマクロを作ることができるようになります。
VBAはプログラム言語の一つですので一般的なプログラム言語に備えられている機能は一通り揃っていますし、それをセル参照・更新の機能と組み合わせれば、色々な作業の自動化が可能になります。

NHK ニュース・防災アプリの勧め

使ってみて便利だったので紹介です。
 
防災情報を集めるために、テレビ・ラジオを使ったりネット・SNSを使ったりすることがあるかと思います。
しかし、前者は自分とは関係のない地域の情報が混ざっているため目的の情報を聞き逃さないようにするのが難しいですし、後者は信憑性が高い最新の情報を入手するのにコツが必要です。
 
そこで、NHK ニュース・防災アプリがお勧めです。
https://www3.nhk.or.jp/news/news_bousai_app/index.html
 
この記事を書いている現在、台風19号が日本列島本州に接近中なのですが、自分の地域に関連する最新の情報をピンポイントで入手することができます。
NHKのアプリなので信憑性も高いです。
 
例えば以下の情報を入手することができます。
 
・警報や注意報
f:id:akira2kun:20191012140135j:plain

・台風進路予想
f:id:akira2kun:20191012140202j:plain

・雨雲レーダー
f:id:akira2kun:20191012140311j:plain

・河川氾濫情報
f:id:akira2kun:20191012140349j:plain

Windowsバッチで「~として認識されていません。」と怒られる→改行コードがLFのせいかも

Windowsバッチにて、明らかに文法が合っているのに、
 'hoge' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と言われて怒られることがあります。
 
この場合、Windowsバッチの改行コードが誤っている可能性があります。
正しくはCRLFなのですが、LFになっているとこのような挙動になることがあります。
 
詳細は既に他の方が書いてくださっているので、そちらをご参照ください。
 
改行コード LF で日本語を含むバッチファイルの動作がおかしい件
https://miau.hatenablog.com/entry/20100929/1285768041
 
---------------------
 
私はこれで15分ぐらいハマりました。。

「コピー新規(修正新規)」とは

【背景】
金融系SIerでは「コピー新規」という言葉を聞くことがあります。
(「修正新規」と呼ばれることもあります)
特定の現場だけではなく複数の現場で聞いたことがあるので、一種の業界用語だと思います。
しかし、コピー新規という言葉でWeb検索をかけてもヒットしないので、この記事を書くこととしました。
 
【言葉の説明】
「コピー新規」とは、「既存のソースファイル(プログラム)を丸ごとコピーし、コピーしたソースファイルに対して必要な個所だけ改修することで、新たなソースファイルを作成すること」を指します。
 
【コピー新規を行う理由】
コピー新規は、金融系の巨大なレガシーシステム(数百万~数億STEP)を改修する際に、高品質と工数圧縮を両立する現実的な最適解として行われます。
具体的には、以下の2つの理由で行われます。
 
理由1:システムの既存部分への影響を防ぐ
既存のソースファイルを修正して複数の要件に対応できるようにする場合、システムの既存部分への影響が懸念されます。
しかし、コピーして新たなソースファイルを作成すれば、システムの既存部分への影響を防ぐことができます。
 
理由2:既存部分を流用することでテスト工数を削減する
本番運用で動いている既存のソースファイルは、品質が保証されたものです。
そのソースファイルの中から使える部分は流用することで、その部分に対するテスト工数を削減することができます。
 
【コピー新規の欠点】
コピー新規を行うことで、以下の2つの欠点があります。
 
欠点1:改修した箇所が流用した箇所に影響を与えてバグになるリスクがある
コピーしたソースファイルについて、改修した箇所と流用した箇所は適切にスコープ分割やクラス分割されているわけではないので、改修した箇所が流用した箇所に影響を与える可能性があります。
流用した箇所はテストを省略している(理由2より)ので、影響を与えていてもそれに早い段階で気付くことが難しく、リリース直前やリリース後にバグとして顕在化する可能性が高まります。
 
欠点2:将来の改修が困難になる
ソースファイルの流用箇所については丸ごとコピーされるため、将来その流用箇所に修正が発生した場合、流用箇所を全て洗い出した上で同じ修正を複数のソースファイルに対して行う必要があります。
このことにより、将来の改修コストが増大します。
 
【欠点への対策】
コピー新規の欠点に対して、以下のような対策が行われることが多いです。
(これらの対策はコピー新規に限った話ではないですが)
 
対策1:コーディング規約をガチガチに固める
人によって癖があるソースコードの記述方法について、コーディング規約がガチガチに固められていることが多いです。
例えば、「それぞれのメソッドに番号を割り振り、メソッド内でのみ使われる変数名の先頭にその番号をつける」という規約を設ければ、当該の変数が当該のメソッド外に影響を与えることを防ぐことができます。
また、「『商品』は全て『Shohin』と記述する」というルールを設ければ、『Syohin』『Shouhinn』『Commodity』といった似たような単語を使われるのを防ぐことができ、影響分析が容易になります(単語検索漏れを防ぎやすくなります)。
 
対策2:影響調査ツールを導入する
巨大レガシーシステム向けに、影響調査ツールを提供するベンダーが複数存在します。
例えばNTTデータ社の「TERASOLUNA DS」の機能として「トレーサビリティー機能」が提供されていたり、NCS&A社が「REVERSE PLANET」というツールを提供していたりします。
これらのツールを用いることで、最新の資産状況が明らかになり、その最新の資産状況で単語検索や構成図確認を行うことができるようになります。
 
対策3:人海戦術に頼る
コーディング規約や影響調査ツールだけで改修コストの増大に対応するには限界があるので、最後には人海戦術に頼ることになります。
(金融機関に開発資金があるからこそできる対策です)
単純に協力会社やオフショアから開発者を集めるだけでなく、集めた開発者にシステム開発に参加してもらう仕組みを作ることが肝になります。
新たに参画する開発者は少なくとも個社システム独自のことは知らないですし、レベルが低い開発者が混ざることも少なくありません。そのような開発者が品質の低いプログラムを開発して後に問題になることは少なくないですし、多数の開発者から一人の有識者に一気に質問が集中することで有識者の本来の業務に支障をきたすこともあります。オフショアの場合は、言語や文化の違いからコミュニケーションが困難になる場合もあります。
そのため、「開発手順の整備」「コミュニケーションの改善(例:窓口役を設ける、英語教育をする)」「独自フレームワークの構築(レベルの低い開発者が混ざっても一定の品質の開発ができるようにする、プログラミングせずにシステム開発できる例も)」といった仕組み作りで対応する必要があります。
 
リファクタリングしない理由】
現在のプログラミングの潮流は、「適切にクラス分割して、重複した記述はなるべく排除する」というものです。
記述が重複しそうな場合は、クラス分割をやり直して記述の重複を極力防ぐ(リファクタリングする)のが筋です。
「記述の重複を許容し、その代わりコーディング規約や影響調査ツールや人海戦術で悪影響を防ぐ」というのは、その潮流に逆行しているように見えます。
 
しかし、金融系のレガシーシステムは、その多くがCOBOLの時代に書かれたものです。
COBOLにはオブジェクトの考え方どころか、メソッドやスコープの概念すらありません。
(言語としての機能の問題だけでなく、COBOLが使われていた当時はオブジェクト指向の概念も広まっていなかったはずです)
当然、テストコードなんてものも存在しません。
仮にjavaでリプレースされていたとしても、そのjavaソースコードCOBOLソースコードを自動変換したもので、中身はCOBOLっぽい構造になっているはずです(1クラスが数千~数万STEPある、変数が全てクラス変数になっている、等)。
その時代に書かれたソースコードが数百万~数億STEPも存在しているので、システム全体をリファクタリングするには非現実的なコストがかかります。
 
現在ではFintechベンチャーが活躍していますが、ベンチャー企業が手を出しているのは仮想通貨やロボアド等の、金融系から見れば傍流のシステムであり、銀行や証券等の基幹システムに手を出すという話はまだ出ていません。
基幹システムは新規参入の企業が容易に手が出せる規模のシステムではなく、これらのレガシーシステムソースコードが今風のソースコードに淘汰されるというのも現在では考えにくいことです。
 
海外ではパッケージソフトで大型リプレースをかけるということも行われているようですが、日本の独自の商取引ルールが詰め込まれた基幹システムをパッケージソフトで代替するというのも困難で、レガシーシステムソースコードは残り続けると思っています。
(比較的歴史の浅いシステムでは事例がないわけではないです。例えば、大阪証券取引所(現日本取引所)の証券デリバティブ取引システム「J-GATE」をNASDAQ OMX社製のパッケージソフトでリプレースした例はあります。)
 
そのため、既にリファクタリングが手遅れになってしまったソースコードを受け入れ、そのようなソースコードとの付き合い方を考えることが現実的な解だと思っています。
「コピー新規」は、そのための手段の一つと言えます。

新人研修での目標

未経験の新人がSIerプログラマーとして働く際、事前に新人研修が行われるはずです。
その新人研修では、下記の3つのことができるようになって欲しいと個人的に思っています。
(プログラム言語はjavaを想定します)
 
1.変数、配列、if、ループといった基本的な制御を使いこなせる
 これらの制御は手続き型言語でも用います。
 また、業務プログラムのビジネスロジックは、
 これらの制御の組み合わせで成り立っていることが多いです。
 実務ではどのような言語を使うかわかりませんが、
 これらの制御を使いこなせればどのような言語でも最低限のことはできますし、
 コントロールブレイクやマッチング処理等のロジックも理解できます。
 
2.オブジェクト指向で書かれたプログラムを読める(使いこなせなくても良い)
 基幹システムのような大きなシステムがjavaで書かれている場合は、
 保守性確保のために必ずオブジェクト指向が用いられているはずです。
 新人の段階では、
 オブジェクト指向に則った設計ができるようになる必要はありませんが、
 ソースを改修する時に既存のソースを追えなくなるようであれば困ります。
 どのような時に用いると嬉しいのかは置いといて、
 継承・カプセル化ポリモーフィズムといった概念や、
 これらの概念に則って書かれたソースコードを読めるようにする必要はあります。
 
3.(何かの真似で良いので)簡単なツールを作れる
 参考書をコピーしてちょっと改変するぐらいで良いので、
 ちょっとしたツールやアプリケーションを組み上げたという経験は欲しいです。
 例えば、予約管理のシステムとか、掲示板とかです。
 何かを実現できれば、見た目や機能はしょぼくて良いです。
 実務でも、ちょっとしたプログラムの新規作成やツール作成等であれば、
 研修で作るようなツール・アプリケーションと規模的には大差ないので、
 そのような仕事をこなせるようになります。
 
---------------------
 
これら3つのことができるようになれば、定型化された単純作業だけでなく、簡単なプログラムの調査や改修、簡単なツールの作成といった、プログラマーらしい仕事を任せられるようになります。
新人にとっても、実務でプログラムに触れられるようになるので、配属後の実力の付き方が変わってくると思います。

Excel:VLOOKUP関数と代替関数の使い方まとめ

表題の通り、VLOOKUP関数とその代替関数の使い方のまとめました。
 
通常は、VLOOKUP関数(第四引数FALSE)で事足ります。
記述量も少なく関数の内容もわかりやすいので、とりあえず検索したい時はVLOOKUP関数(第四引数FALSE)で良いと思います。
 
しかし、高速化する必要がある場合や左側の項目を検索する場合、行と列を同時に検索する場合は、他の方法で検索する必要があります。
一番汎用性が高いのはINDEX関数とMATCH関数の合わせ技です。これも合わせて使えるようにしておくと良いでしょう。
 
関数の詳しい仕様についてはこの記事では触れませんので、気になる方は各自Web検索等して調べてみて下さい。
 
---------------------------
 
f:id:akira2kun:20191001221405j:plain
 
---------------------------
 
以下、コピペ用です。
セル指定は適宜変更して下さい。
 
・キー項目が昇順・降順ではない場合の検索
VLOOKUP(B13,$B$3:$D$7,3,FALSE)
INDEX($D$3:$D$7,MATCH(B18,$B$3:$B$7,0))
 
・キー項目が昇順の場合の高速検索
IF(VLOOKUP(B19,$C$3:$C$7,1,TRUE)=B19,VLOOKUP(B19,$C$3:$D$7,2,TRUE),NA())
IF(LOOKUP(B25,$C$3:$C$7)=B25,LOOKUP(B25,$C$3:$C$7,$D$3:$D$7),NA())
INDEX($D$3:$D$7,MATCH(B28,$C$3:$C$7,1))
 
・キー項目が右側に存在する場合の検索
IF(LOOKUP(B35,$C$3:$C$7)=B35,LOOKUP(B35,$C$3:$C$7,$B$3:$B$7),NA())
INDEX($B$3:$B$7,MATCH(B38,$C$3:$C$7,1))
 
・列検索と行検索を同時に行う場合の検索
INDEX($B$2:$D$7,MATCH(C47,$B$2:$B$7,0),MATCH(B47,$B$2:$D$2,0))

 

会社の同僚のライブに行ってきました!

同僚が大事なライブをやるということで誘いを受けたので、行ってきました。
ちなみに、バンド名はFORです。
 
ライブに行くのは初めてでしたが、かっこよかったです!
何より、音で会場全体が震える感覚がすごかったです。
この感覚は実際に会場に行かないと伝わらないと思います。
 
一緒に仕事をしている同僚の別の一面が見れて良かったです。
仕事は仕事で一人前にこなし、趣味の音楽もここまで真剣に取り組めるというのは本当に凄いことだと思います。
 
f:id:akira2kun:20190922005204j:plain