配列を引数にすることはできるのか
配列を引数にすることはできるのか
配列を引数にしてみる
プロシージャの引数に配列を指定することはできるのだろうか、と思ってやってみた。
とりあえず、
Public Function argsByArray(ByVal ar() As String) As String
としてみたら、
こんなふうにいきなりコンパイル・エラー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関数が使いたかったので、メッチャ面倒くさいやり方をしている。すなわち、
- Array関数の返り値を一旦Variant型の変数tmpArrayにぶち込む
- できあがった配列tmpArrayのインデックス番号最大値をUBound関数で調べて変数 n にぶち込む。
- 文字列型配列変数strArray()を n でReDimする。
- Forループを使ってtmpArrayの内容をstrArray()に移す
すんません。配列初心者なので、こんな方法しか思いつきませなんだ(←この言い方、横山光輝『三国志』でよく出てくるよね?)。
なんていうか、
strArray(0) = "アホ" strArray(1) = "ボケ" strArray(2) = "カス"
みたいなやり方がイヤだっただけなんですけど。
あとは、(*)の
MsgBox argsByArray(strArray())
で、リスト1のargsByArray関数の返り値をメッセージボックスで表示する。
実行結果
うん。うまく行った。
クエリの「WHERE」の部分の文字列を作るのに使えないかなあ、と思っただけです。ほれ、「OR」とか「AND」でつなぐ条件の数が変化しても、引数が配列だったら対応できるじゃないですか。