• ベストアンサー

ExcelVBA ユーザ定義関数と定数配列

2010以降のExcelVBAです ユーザー定義関数として使うfunction 此の引数として 幾つかの項に配列数式、又は定数配列を与えたいのです が、 此の際の 引数の受け方と処理の仕方 此が判りません 例を交え お教え願えないでしょうか? 宜しくお願い致します。

  • Nouble
  • お礼率91% (1698/1856)

質問者が選んだベストアンサー

  • ベストアンサー
  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは Sub test() Dim a As Variant Dim d As Variant a = Array(1, 2, 3, 4, 5) d = test_func(a) Debug.Print d End Sub Function test_func(v As Variant) As Variant Dim i As Long For i = LBound(v) To UBound(v) test_func = test_func + v(i) Next End Function とか、ParamArray 使うとかかと思いますけど、配列数式を与えるという 配列数式とはどのようなものですか?

Nouble
質問者

お礼

有り難うございます。 配列数式ですが、 一例です =mid("有り難うございます。",row(indirect("a1:a"&len("有り難うございます。")))) 結果は["有","り","難","う","ご","ざ","い","ま","す","。"] 詳しくは此方が解り易いかと http://pc.nikkeibp.co.jp/pc21/special/hr/

Nouble
質問者

補足

求めるものは 例として MultiMatch({検査値|定数配列又は配列数式又はレンジ},{捜索対象|定数配列又は配列数式又はレンジ}) 動作:捜索対象中の複数の検査値を探し    どの検査値が何番目に該当するか    全て返す 戻り値 単一の値又は2次元定数配列 追伸 お礼コメント中記載の 先の式を訂正致します 正  式   =MID("有り難うございます。",ROW(INDIRECT("a1:a"&LEN("有り難うございます。"))),1)  結果   {"有";"り";"難";"う";"ご";"ざ";"い";"ま";"す";"。"} 誤  式   =mid("有り難うございます。",row(indirect("a1:a"&len("有り難うございます。"))))  結果   ["有","り","難","う","ご","ざ","い","ま","す","。"] 謝罪の上謹んで訂正致します 申し訳ありません

その他の回答 (2)

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.3

こんにちは 難しすぎてついて行けないのですが、 Function MultiMatch(検査値() As Variant, 捜査対象() As Variant) As Variant Dim i As Long Dim j As Long Dim v As Long Dim s As Long Dim e As Long s = LBound(検査値) e = UBound(検査値) ReDim d(1 To e, 1 To 1) For i = 1 To e d(i, 1) = 検査値(i) Next For i = s To e j = 2 For v = 1 To UBound(捜査対象) If 捜査対象(v) = 検査値(i) Then If UBound(d, 2) < j Then ReDim Preserve d(1 To e, 1 To j) End If d(i, j) = v j = j + 1 End If Next Next MultiMatch = d End Function として、セルA1:C5を選択して、数式バーに =MultiMatch({1,2,3,4,5},{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1}) と入力して、Ctrl+Shift+Enter とすると 1 1 17 2 2 0 3 3 0 4 4 0 5 5 0 となります。 行列が逆ですけど、結果を配列で返す事は出来ていると思いますけど、 参考になりますか?

Nouble
質問者

お礼

有り難うございます。 まずは謝罪させてください 先のお礼欄に また誤記がありました、 済みません。 正 が、 型か一致しない と、 誤 が、 方か一致しない と、 謹んで訂正致します。 さて、 要点としては ()付きのvaliant型で引数を受ける と、いう点ですね

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.2

こんばんは 済みません、まだどのような処理が希望なのか分かりません。 引数に配列ではなくて配列数式をセットするのですか? 何か全然的外れな気もしますが、配列かセル範囲を引数として、 Sub test() Dim v As Variant Call 準備 v = MultiMatch(Array("Dummy3", "Dummy8"), Range("A1:A10")) v = MultiMatch(Array("Dummy3", "Dummy8"), Range("A1:J1")) End Sub Sub 準備() Dim i As Long For i = 1 To 10 Cells(i, 1) = "Dummy" & i Cells(1, i) = "Dummy" & i Next End Sub Function MultiMatch(検査値 As Variant, 捜査対象 As Variant) As Variant Dim i As Long Dim s As Long Dim e As Long s = LBound(検査値) e = UBound(検査値) ReDim d(e, s + 1) For i = s To e d(i, s) = 検査値(i) d(i, s + 1) = Application.Match(検査値(i), 捜査対象, 0) Next MultiMatch = d End Function みたいな感じでしょうか?

Nouble
質問者

お礼

有り難うございます。 >引数に配列ではなくて配列数式をセットす… そうです 用法の一例としては、 =iferoor(   offset(    $a$1    ,hlookup(     3    ,MultiMatch(     row(      $a$1:$a$5     )     ,row(      $a$1:$a$90     )    )    ,column(     a1    )    ,0    )-1   ,0   ,1   ,1  )  ,"" ) 求めた割には 使い方か 直ぐには思い浮かばず チープなものしか 書けませんでした 済みません 流れとしては MultiMatchにより 1から90の内、 1,2,3,4,5, 此等と一致するものを 見出し付きで 一覧データにし、 {1,2,3,4,5;1,2,3,4,5} 其の値を参照テーブルとして hlookupにより 参照テーブル中の 見出しの値3 此に当たる列を columnで指定して 上から順に読み出し キチンと読めたら A1からの相対参照で1セル読み出す 何らかのエラーがあった場合は ””にする と、言うものになります 此方でもよく質問に上がる データ検索を配列数式で行う際の いいツールに 此はなり得ます よね? 因みに 普通Matchは 検索キー1つに対し 1つ該当を見つければ 其の検索を止めます が、 MultiMatchは 全ての検索キーに対し 各々においてヒットする全てを返す です。 こういう事は申し難いのですが 複数の検索値に対し 最初の1つのみを返すのは 現行Matchと変わらないかも です。 で、話は変わりますが 前回ご回答を受け 練習してみました が、 方か一致しない と、エディッターに怒られます。 function Large(配列 As valiant,フラグ As long) As valiant  Large= Evaluato("Large(" & 配列 & "," & フラグ & ")") Endfunction function main(θ1 As valiant,θ2 As valiant) As valiant  main=Large(Arrey(θ1,θ2),2) End function 何故でしょう? 追伸 MultiMatchの 検査対象に 何らかの式を微分したもの 此に (ROW(A1:A1000001)-1)/1000 等で、値を与えて 配列数式に仕立てたもの 検査値に 0 で、 近似的極大極小を見つける 何て事も 出来るかも知れません。 まあ、厳密に言えば0にはならない ので 何らかの工夫が必要になりますが ね

関連するQ&A

  • ユーザ定義関数の引数にクラスのインスタンスを渡すことは可能?

    いつもお世話になっております。 (PHP5.2.5) 質問: ユーザ定義関数の引数に、 「クラスのインスタンス」を渡すことは可能ですか? 例: <?php  //クラスをインスタンス化する。(例:PDOクラス)  $conn = new PDO($dsn,$user,$pass);  //ユーザ定義関数に上記のクラスのインスタンスを与えている  user_func($conn);  //ユーザ定義関数の定義部  function user_func($conn){   $sql = '~SQL文~';   $stmt = $conn->prepare($sql);   :   :処理   :  } ?> 関数に渡すことのできる引数の型について、 なかなか見つけられず、初歩的な質問をしてしまっているかもしれませんが、 どうぞ宜しくお願い致します。        

    • ベストアンサー
    • PHP
  • ユーザー定義関数について

    ここで良いのかわかりませんが質問します。 現在、ExcelVBAをすこしかじりました。 ユーザー定義関数を作りましたが、第三者に簡単にわかるようにしたいと思います。fxボタンを押せばなんとなく第三者でもわかりそうですが、ボタンの存在を知らない人はわからないと思いました。 ワークシート上では直接関数を打てば、直下にコメントのようなスタイルでどの数値を入れればよいか出てくると思います。 =round( と打てば =round( (数値,桁数) というように出てくるのですが、ユーザー定義関数でこのようなことはできるのでしょうか? これが出来る出来ないでは第三者への進め方が大きく違ってきます。 教えてgooはもちろんいろいろ調べましたがわかりません。 何卒ご指導お願いします。

  • 関数の引数に配列を初期化なしで。

    関数の引数に配列を初期化して渡しているプログラムを目にします。 関数の引数に配列を初期化なしで渡す場合とどう違うのでしょうか? 例 <?php echo tesutoFunc(array('reservation' => 'a','user' => 'b')); function tesutoFunc($arrays=array()){ //ここをなぜtesutoFunc($arrays)と書かないのか? print_r($arrays); } ?>

    • ベストアンサー
    • PHP
  • Excelユーザー定義関数が書き込まれているセルアドレス

    Excelのユーザー定義関数で、自分自身が書き込まれているセルのアドレスって取得出来るのでしょうか? 例えば、 Function test(MyString As String) As String test = "入力された文字は、「" & MyString & "」です" End Function とユーザー定義関数を作り A1のセルに =test("てすと") と書くと 入力された文字は、「てすと」ですと出てきます。 そこで、ユーザー定義関数のなかで、ユーザー定義関数を呼び出した式が入力されている(上記の例ですと、「A1」)アドレスを取得する方法ってありますか? どなたか、詳しい方いらっしゃいましたら教えてください。

  • usort のユーザー定義比較関数の説明について

    PHPマニュアルにあるusortの説明がうまく理解できなくて悩んでいます。 そこでは、パラメータとなる比較関数について次のように書かれています。 「比較関数は、最初の引数と二番目の引数の比較結果を返します。最初の引数のほうが二番目の引数より大きい場合は正の数を、二番目の引数と等しい場合はゼロを、そして二番目の引数より小さい場合は負の数を返す必要があります。」 http://php.net/manual/ja/function.usort.php 「usort() の例」として提示されているのは以下です。 function cmp($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } $a = array(3, 2, 5, 6, 1); usort($a, "cmp"); この例のユーザー定義の比較関数cmpは、前述の説明の通りに書かれているので理解できます。 しかし、ユーザーページの投稿にもありますが、($a > $b) としたり、($a < $b) ? 1 : -1 のように返り 値を変えて降順(逆順)にソートするという使い方を普通に見かけます。 これは、「最初の引数のほうが二番目の引数より大きい場合は正の数を(……)二番目の引数より小さい場合は負の数を返す必要があ」るという説明とは矛盾しています。 「必要」とまで書いているのでかなり強い指示だと思います。英語版でも「must」となっているので翻訳上の問題はなさそうです。 また、「配列のソート」ページによるとソート順は「ユーザー定義」とあり、件の比較関数次第ということになっています。 http://www.php.net/manual/ja/array.sorting.php ということは、逆順であれ自然順であれ可能だとこれは示唆しているのだと思うのですが、やはり説明部分との矛盾が気になります。 ……どう捉えたらよいのでしょうか?

    • ベストアンサー
    • PHP
  • 関数とarguments配列

    ●質問の主旨 下記サイト、CodeStudyによる JavaScriptの関数とarguments配列の 使い方に関する問題に対する 答えとなるコードの記述が分かりません。 どなたかアドバイスをお願いします。 CodeStudy 関数その2 3.arguments その3 http://jeek.jp/study/section18/3 ●問題文 関数checkが定義されています。 check内のif文により、引数が3つ以外の際は、 outputで"引数が3つではありません。"と出力させましょう。 function check(x, y, z) { if() { output("引数が3つではありません。"); } } check(1, 2, 3, 4); ●自分で作った途中経過 resultやreturnの使い方がよく分かりません。 function check(x, y, z) {  var result = 0; if(arguments.length !== 3) { output("引数が3つではありません。"); } return result; } check(1, 2, 3, 4); output(check); ●コードの条件(ヒント) argumentsは、引数を格納する配列で、 argumentsを使うと引数をいくつでもとることが出来ます。 また、argumentsは配列なので、 .lengthを使うと長さが求められます。

  • 関数の定義の仕方

    関数の定義の仕方についてなのですが、 関数名 = function(){} と function 関数名(){} ではどのように処理がかわってくるのですか? 本当に簡単なことも分からなくてすいませんが、 本当に分からなくて困っています。 分かる方がいらっしゃいましたら、なにとぞ教えてください。 よろしくおねがいいたします。

    • ベストアンサー
    • Flash
  • Excel2003 ユーザー定義関数

    お世話になります。 ユーザー定義関数について教えて下さい。バージョンはExcel2003です。 B268セルの数式をコピーしてB259~B281までその数式を貼り付けるような使い方をしたいのですが、ユーザー関数は関数の中身を変更しても再計算しないとのことで再計算されません。 セルひとつひとつに貼り付けを行っていくと再計算されましたが、さらに広範囲に一気にユーザー関数を使用した数式を貼り付ける使い方で、再計算させる方法はありますでしょうか。 よろしくお願いします。

  • VBAの中でユーザー定義関数を使うときに

    VBAの中でユーザー定義関数を引数に変数を持たせて使いたいのですが、変数をうまく認識してくれません。 VBAの中でユーザー定義関数を使うにはどうしたらいいのでしょうか? よろしくお願いします。

  • ユーザー定義関数の処理

    エラーメッセージに関する以下の関数はどのような処理をする関数ですか? 自分なりに解釈したものを//で書いています。 // エラーがセットされているときは、$errorsを返す // もしセッション変数にエラーがないときは、空の配列を返す function get_errors(){ // セッション変数にエラーがセットされているときは$errorsを以下のように定義する $errors = get_session('__errors'); if($errors === ''){ return array(); } // もしセッション変数にユーザー名($name)がセットされているなら、セッション情報を返す // セットされていないときは空文字を返す function get_session($name){ if(isset($_SESSION[$name]) === true){ return $_SESSION[$name]; }; return ''; } // $nameと$valueを受け取り、セッション情報(ユーザー名)を$valueと定義する function set_session($name, $value){ $_SESSION[$name] = $value; }

    • ベストアンサー
    • PHP

専門家に質問してみよう