Array 関数で無作為に選んだ文字を出力します

 予め決めておいた複数の文字の中から無作為に1つを選んで表示させるファンクションマクロ(ユーザー定義関数)を作ります。この関数を単独で使うことはあまりないと思いますけど、様々な目的に応用が効きますので、モジュールの中に入れておいて損はないです。こばとの文章作成ソフト "KOBATO's BOOK" にもこの技術が多用されていますよ。
 

A, B, C から無作為に選びます

 とりあえず、もっとも応用範囲の広そうなマクロを作ってみます。セルに

=ALPHABET()

と入力すると、 A, B, C という 3 つの文字からランダムに1つを選んで出力します。これは INDIRECT 関数などでセル番地を無作為に指定するときなどに応用できます。

 'ランダムアルファベット
 Function ALPHABET() As Variant
  Randomize
  Dim n As Variant
  Dim k As Integer
  k = Int(RND * 3)
  n = Array("A", "B", "C")
  ALPHABET = n(k)
 End Function

 

ALPHABET 関数の概要

 Int(RND*3) で 0 から 2 の乱数を得て k に入れておきます。
 「 A, B, C 」という 3 つの要素を持った Array 関数を作成し、インデックス番号「 k 」( 0 ~ 2 の値)のデータを関数の値として出力しています。
 

Array 関数

 Array 関数は Variant 型の配列変数を作成する関数です。配列変数を横並びで見やすい形に入れておくことができるのが特徴です。今回の例では予め Variant 型で定義した変数 n を用いて

n = Array("A", "B", "C")

として A, B, C を配列変数として定め、

n(0) = "A"
n(1) = "B"
n(2) = "C"

という形でデータが格納しています。 Array 関数で指定するインデックス番号は左から 0, 1, 2 となることに注意してください。「そんなの、ちょーややこしいから、インデックス番号の下限値を 1 に変更したいよ!」という場合は次のように Option Base ステートメントで設定しておきます。

 Option Base 1

 'ランダムアルファベット
 Function ALPHABET() As Variant
  Randomize
  Dim n As Variant
  Dim k As Integer
   k = Int(RND * 3) + 1  'ここに注意!
  n = Array("A", "B", "C")
  ALPHABET = n(k)
 End Function

 配列変数を扱う場合はこのように Option Base ステートメントで下限値を 1 に設定しておくことが多いのですが、今回のケースでは

k = Int(RND * 3) + 1

というように乱数 k も + 1 だけ動かしておかなくてはなりません。冒頭で紹介したマクロは RND にかかる係数 3 と要素数が一致して見やすいので、あえて下限値を 0 のままにしておいたのです。でも、このあたりは人によって好みが分かれるところですから、使いやすいほうを選んでくださいな。
 

列を増やしたいと思ったら

 もっと列のたくさんある大きな表でこの関数を使用する場合(行数はいくらあっても構いません)、必要に応じて配列要素を "D", "E", ...... と増やしておきます。ただ、そのたびに RND の係数となっている配列要素数も書き換えなくてはなりません。それが面倒だと思ったら、次のように改良してみるのも手です。

 'ランダムアルファベット
 Function ALPHABET() As String
  Randomize
  Dim n As Variant
  Dim k As Integer, m As Integer
  n = Array("A", "B", "C", "D", "E")
  m = UBound(n) - LBound(n) + 1
  k = Int(m * RND)
  ALPHABET = n(k)
 End Function

 新しい変数 m が宣言されて、

m = UBound(n) - LBound(n) + 1

という記述が増えています。この見慣れない関数の意味をマニュアル的に説明すると ......

UBound 関数は配列のインデックス番号の上限値を返します
LBound 関数は配列のインデックス番号の下限値を返します

 いきなりこんな説明を聞いても「???」となるかもしれませんが、それほど難しいことではありません。Array 関数で作成した配列 "A", "B", "C" には 0, 1, 2 というインデックス番号が振られているのですが、その番号の最大値 2 を得るのが UBound 関数で、最小値 0 を得るのが LBound 関数なのです。そして

上限値 - 下限値 + 1 = 2 - 0 + 1 = 3

が要素の数を表しています。つまり Array 関数の引数を増やしても自動的に RND にかかる要素数 m を計算するような仕組みなっています。 UBound, LBound は主に配列要素数が確定しない動的配列を扱うマクロで活躍する関数です。今後もこの 2 つの関数は頻繁に登場しますので、少しずつ慣れるようにしてください。

スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)