会社を卒業したのんちおじさん。

人生は知恵と工夫と思いやり!
優しさほど強いものはなく、本当の強さほど優しいものはない -ラルフ・W・ソックマン-

関数を作る。その2

2007-12-02 11:11:38 | Excelのお話
それで急いで作った美しくないやつは・・、

=IF(LEN(INT(定価*掛け率))<=3,INT(定価*掛け率)*1,IF(LEN(INT(定価*掛け率))=4,LEFT(定価*掛け率,3)*10,IF(LEN(INT(定価*掛け率))=5,LEFT(定価*掛け率,3)*100,IF(LEN(INT(定価*掛け率))=6,LEFT(定価*掛け率,3)*1000,IF...))))

といういつになっても終わらない超ネスト状態のまことに醜い関数。

そしてあまりに醜いので作ったのが次の「ユーザー定義関数」

Function nHNet(tEika, k)
  Dim nH As Long
  nH = Int(tEika * k)

  Application.Volatile

  Select Case Len(nH)
  Case Is <= 3
    nHNet = nH * 1
  Case 4
    nHNet = Left(nH, 3) * 10
  Case 5
    nHNet = Left(nH, 3) * 100
  Case 6
    nHNet = Left(nH, 3) * 1000
  Case 7
    ..
  Case ..
    ..
  Case Else
    nHNet = "高すぎる!"
  End Select

End Function

見た目は=nHNet(定価,掛け率)とすっきりしていますがどんな桁数にも対応できるというものではありません、それにやはり実体は醜いままです。

これじゃあまりにお情けないので昨日「自宅」というまったく違ったゆっくりと没頭できる環境で作ったのがこれです。

=IF(LEN(INT(定価*掛け率))<=2,INT(定価*掛け率),INT(LEFT(INT(定価*掛け率),3)*10^(LEN(INT(定価*掛け率))-3)))

これでもいいのだが見た目がやはりごてごてしているのでそれを「ユーザー定義関数」にしたのがこれです。

Function nHNet(tEika, k)
  Dim nH As Long
  nH = Int(tEika * k)
  Application.Volatile
  If Len(nH) <= 2 Then  '有効数字桁数が「2」以下か
    nHNet = nH     'そのまま出力
  Else
    'べき乗を使うことでどんな桁にも対応
    '10^0=1 10^1=10 になることに着目
    nHNet = Left(nH, 3) * 10 ^ (Len(nH) - 3)
  End If
End Function

どうです?これですっきりしたでしょ。