2009/04/19

この程度の関数もナイって・・・


いやね、Excelとか使う向きって、商品管理や見積りの集計に使うってのは、当然のように大多数だと思うのだよ、
しかし、数量、単価で小計を出せて、入荷や進捗管理も併記できる専用のワークシート関数ってナイんだよ、実際。

まぁ、そういった関数の理想的な動きとしては、
    {商品名} ─未入力→ 関数はNull値を返す。    
 │
何らかの入力アリ

{単価} ┬文字列→ 関数は値0を返す。
│ └未入力→ 値0を返す。

数値入力アリ

{数量} ┬文字列→ 関数は値0を返す。
│ └未入力→ 単価を返す。(数量1として扱う)
│ (1個しか要らないのに、イチイチ数値入力してられるかっての)

数値入力アリ

単価/数量の積を返す。
ってトコだろうか。
コレなら、在庫があるモノだった場合、数量セルに "在庫"、作業完了対象なら "済" とでも入力しておけば、
単価を入力していても小計には出ない。

そりゃあ、セルに延々式を書き込めば、ウゴくって云やぁウゴくケド、
入力値の種類識別などの条件を処理させるには、式の長さと煩雑さがハンパなくなって、
対象数が多い場合、計算終わるまで結構な時間掛かってしまう場合もあったり・・・

前に就いていた職で、支店から集められたデータを一気に集計させるべく、
150以上のワークシート跨いだ複雑な条件式を大量に実行させたら、
計算終わる前にDELL機(Pen4 2.2GHz 512MB WinXPSP2)が再三オチたモノだ・・・
オチずにウゴいても、結果が出るまで1時間以上掛かってた記憶が・・・


んで今日、日曜大工な向きで、久々に品物管理の必要に迫られ、
単なるリストではなく、集計を必要とするワークブックを作成、


画像クリックで原寸大表示▼



それに使う為、ExcelVBA向けとして、あると便利そうな機能を盛り込んだ汎用性の高い関数を描いてみた。
アドイン(.xla)のモジュールに書き込んで、ワークシート関数として使う為のスクリプト。


    '------------------------------------     
'sTotal
'- Created by LazwardFox -
'下記条件に従い、小計を表示する。
'商品名セル[Article]に入力がある場合のみ有効とする。
'数量[Quantity]/単価[Unit]への入力が文字列だった場合は、無効として扱われる。
'数量セル[Quantity]未入力の場合 は 1(個) として扱われる。
'単価セル[Unit]未入力の場合 は 0(円) として扱われる。
'
' Update -------- ----
' Release 20090419 1707
Public Function sTotal(Optional ByVal Article As Variant = "", _
Optional ByVal Quantity As Variant = 1, _
Optional ByVal Unit As Variant = 0) As Variant

Application.Volatile
If Article = "" Then
sTotal = ""
ElseIf VarType(Quantity) = 8 Or VarType(Unit) = 8 Then
sTotal = 0
ElseIf Unit = 0 Then
sTotal = 0
ElseIf Quantity = 0 Then
sTotal = Unit
Else
sTotal = Unit * Quantity
End If
End Function


まぁ、えれぇ簡単に見えるが、コレをワークシート上、1セルの式記述だけで実現するには、
やたら長ったらしい式の入力を要求されるワケよ。
不正入力への対応とかも含め、ラクしたいなら、VBAでワークシート関数ツクるに限るねぇ。

って、使うワークシートのモジュールに書き込んで、ローカル関数として使うだけでも別段支障は無いが、
どうせなら、アドイン作るのも覚えてみると、結構便利デスよ。
・・・とか云いつつ、その件については放置、触れる気すら無い外道さ加減が おきつねさまクオリティw
ま、別段質問された訳でもナイし、だいたい、ググりゃ判るし、
アドインの組み込み方も知らないでExcel使ってる向きには興味ないしΨ(`∀´)Ψ

つか、云う程難しいこっちゃナイってのがホントのトコ。
どのくらい簡単かって? ソレさえも判らないなら、アタマのデキがシれてるってぇくらいw
Excel操作してるだけで なんとなく判るってホド簡単。

でも、リクエストがあるなら、
初心者向けに、非常に簡単な方法を、図解入りで、極めて判りやすく解説せんでもないが、
まぁ、ナイだろう(自己完結)


あと、敢えてエラー処理は記述しなかった、そのほうが入力ミスに気付き易いと云う判断からだ。
入力を人の手に頼る場合、過度なエラー回避処理は諸刃の剣でしかない。
こういったスクリプトを組む場合は、そのヘンも一考して開発/配布したほうがイイ。

トクに会社などでの利用の場合、実際のトコが どうなのかは別として、
"自分と同じだけの高度なスキルを持った人間など まず居ない"と思って掛からないと、
確実に、たいした原因でもないトラブルに巻き込まれて痛い目を見るよ。

最近の(大手)企業の社員の質は、考えられない程 低いからねぇ・・・
トクに、能力カスのクセに、向上心は出世にだけ向いてて、永いコトそこに居るだけ的な連中はねぇ・・・

自分に出来ない事を人に聴けるようになったら、オトナ(ふしぎの海のナディア より) ってコトらしいが、
現実は、歳ばかりとってるか、"自分は立派な大人"とか勘違いしてて、オツムの中身ガキなの多くて、
ソレすらムリとか・・・

でもまぁ、そう云う、ヘンなプライドだけが先に立って、歳下の社員に質問できないで居る、
貝になったタッチおじさんな向きの質問でも、丁寧に答える用意はあるのだが・・・

MSUpdateも考えモノ・・・


IMEが更新された場合、毎回、ユーザー辞書と学習が全て逝ってしまう・・・
先週の更新では、文節すらマトモに識別しなくなった(´ヘ`;)

自社製品の管理システムすら満足に組めないとは、
終わっていると云うより、殺人事件の死体より役に立たんなMS・・・