配列を引数にすることはできるのか

配列を引数にすることはできるのか

配列を引数にしてみる

プロシージャの引数に配列を指定することはできるのだろうか、と思ってやってみた。

とりあえず、

Public Function argsByArray(ByVal ar() As String) As String

としてみたら、

f:id:akashi_keirin:20171110203501j:plain

こんなふうにいきなりコンパイル・エラーw

配列を引数にするにはByRefにしないといけないらしい。ということはできるんだね。

とりあえず、次のようなFunctionを作ってみた。

リスト1 標準モジュール
Public Function argsByArray(ByRef ar() As String) As String
  Dim n As Integer
  n = UBound(ar)    '……(1)'
  Dim i As Integer
  Dim tmp As String
  For i = 0 To n    '……(2)'
    tmp = tmp & ar(i) & "! "
  Next
  argsByArray = Left(tmp, Len(tmp) - 1)    '……(3)'
End Function

簡単なコードなので、説明するまでもないかも知れないけれど、一応。

(1)の

n = UBound(ar)

で、引数として受け取ったString型の配列 ar() のインデックス番号最大値を変数 n にぶち込む。

(2)からの3行

For i = 0 To n
  tmp = tmp & ar(i) & "! "
Next

で、配列 ar() の各要素を、後ろに「! 」(全角感嘆符と全角スペース)を付けて連結し、変数 tmp にぶち込んで行く。

あとは、(3)の

argsByArray = Left(tmp, Len(tmp) - 1)

でLeft関数によって右端の全角スペースを削ってできた文字列を返り値にしておしまい。

実行

次のコードで実行してみる。

スト2 標準モジュール
Public Sub testArgsByArray()
  Dim strArray() As String
  Dim tmpArray As Variant
  tmpArray = Array("アホ", "ボケ", "カス")    '……1.'
  Dim i As Integer
  Dim n As Integer
  n = UBound(tmpArray)    '……2.'
  ReDim strArray(0 To n)    '……3.'
  For i = 0 To n    '……4'
    strArray(i) = tmpArray(i)
  Next
  MsgBox argsByArray(strArray())    '……(*)'
End Sub

文字列型の配列を作るのにArray関数が使いたかったので、メッチャ面倒くさいやり方をしている。すなわち、

  1. Array関数の返り値を一旦Variant型の変数tmpArrayにぶち込む
  2. できあがった配列tmpArrayのインデックス番号最大値をUBound関数で調べて変数 n にぶち込む。
  3. 文字列型配列変数strArray()を n でReDimする。
  4. Forループを使ってtmpArrayの内容をstrArray()に移す

すんません。配列初心者なので、こんな方法しか思いつきませなんだ(←この言い方、横山光輝三国志』でよく出てくるよね?)。

なんていうか、

strArray(0) = "アホ"
strArray(1) = "ボケ"
strArray(2) = "カス"

みたいなやり方がイヤだっただけなんですけど。

あとは、(*)の

MsgBox argsByArray(strArray())

で、リスト1のargsByArray関数の返り値をメッセージボックスで表示する。

実行結果

f:id:akashi_keirin:20171110203510j:plain

うん。うまく行った。

クエリの「WHERE」の部分の文字列を作るのに使えないかなあ、と思っただけです。ほれ、「OR」とか「AND」でつなぐ条件の数が変化しても、引数が配列だったら対応できるじゃないですか。