• 締切済み

エクセルVBAにおけるプロシージャ引数について

いつもお世話になっております。 VBAを学習しているものですが、現在プロシージャの引数について学習しています。 引数に指定する項目にOptional、ParamArrayキーワードがありますが、使い方がイマイチ理解できません。私持っている参考書等には Optional:省略可能な引数にするにはOptionalキーワードを付ける? ParamArray:引数の数が不定のとき・・・ なんて事が記載してあるのですが・・・、私の周りにはVBAに習熟した方が居ないため、こちらに質問させていただきました。 よろしくお願いいたします。

みんなの回答

回答No.1

こんにちは 私も、完全に、 Optionalや、ParamArrayに関しては、理解しきれておりません。 なので、詳しくは、 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard48.htm http://msdn.microsoft.com/ja-jp/library/ct363x9h(v=vs.90).aspx http://msdn.microsoft.com/ja-jp/library/0dkhs7xx(v=vs.90).aspx ↑これらの、Webサイト様の情報の方が、よろしいかと思います。 しかし、 恥ずかしながら、私が勝手に個人的に感じている Optionalや、ParamArrayに関しての考え方を、 以下のコードと、共に、示させていただきます。 ■■■■■■■■■■■■■■■■ Option Explicit 'Optionalに関して。++++++++++++++++++++ Sub Optional_Test(Optional value As Integer = 2) 'Optionalで、引数を省略が可能となる。 MsgBox CStr(value) End Sub Sub Optional_テスト1() Call Optional_Test(0) '→0とメッセージ表示 End Sub Sub Optional_テスト2() Call Optional_Test '引数を省略したので→2とメッセージ表示 '※つまり、頻繁に使う値を、予め初期値として設定しておくことで、 '頻繁に同じ引数を指定する。というコードの煩雑さをなくしたりすることが可能。 End Sub 'ParamArrayに関して++++++++++++++++++++ Sub ParamArray_Test(ParamArray value() As Variant) '受け取った配列の中身を、確認する。 Dim item As Variant For Each item In value Debug.Print CStr(item) Next item End Sub Sub ParamArray_テスト1() Call ParamArray_Test("こ", "れ", "ら", "の", "文字", "列が", _ "全て", "配列", "として", "変換され", "渡される") '└→引数が自動的に配列に変換されて引き渡される。 '※いちいち配列を予め用意して渡す必要がないので、便利な時は便利。 End Sub ■■■■■■■■■■■■■■■■ 以上、 コード中のコメントにも、記載させて頂きましたが、 私としましては、 Optionalに関しては、 ある程度決まっている値があり、 たまに、違った値が入ってくるプロシージャにおいて、 ある程度決まっている値を、Optionalで指定しておき、 何度も、同じ値を指定する煩雑さを避ける場合に使います。 反面、慢心になってしまうと、指定を忘れても処理が走るので。 たまに、違った値のことを忘れていて、 うっかりバグを増やしてしまうことも、少なからず、ございます。 ParamArrayに関しては、 短い配列を扱う際に、 最初から、ループ構文などで、いちいち配列を作成して処理させるより、 ParamArrayを利用して、一気に配列にしてしまってから扱う場合などに、重宝させてもらっております。 とはいっても、 私としては、使用頻度がそんなには、ございません。 以上 私の完全な私情をさしはさんでの説明となってしまって、 失礼致しました。 ありがとうございました。

関連するQ&A

  • VBScriptで引数を省略したい場合

    VBScript の Function、Sub プロシージャで引数を省略したい場合、Optional キーワードが使えないので、空文字を渡すようにしていますが、これは言語仕様的に正しいやり方でしょうか? Sub MyProc(ByVal a, ByVal b) . . . End Sub Call MyProc(a, "")   '← 引数 b は状況に応じて省略したい。 よろしくお願いします。

  • ユーザ定義関数の引数省略について

    VBAで自分で関数を作成しているのですが、 引数を複数省略したいときはどうすれば良いでしょうか? 例えば、Test(A as integer, Optional B as integer =1, Optional C as integer =1)という関数で Test(1,0)と記述した時に"0"は引数BなのかCなのかどうやって指定するのでしょうか? それとも複数省略は出来ないのでしょうか?

  • Functionプロシージャの便利さがわかりません

    私はVBAコードを作る時は、もっぱらsubプロシージャーを使ってしまうのですが、 http://excelvba.pc-users.net/fol5/5_4.html を参考に、 Functionプロシージャとsubプロシージャの違いを確認してみたのですが、 Functionプロシージャの便利さがわかりません。 *********************************** Sub Test() SubプロシージャとFunctionプロシージャのテスト i = 1 Call Subプロシージャ(i) i = Functionプロシージャ(i) MsgBox "Functionプロシージャ結果:" + CStr(i) End Sub Sub Subプロシージャ(ByVal i As Integer) MsgBox "Subプロシージャ結果:" + CStr(i) End Sub Function Functionプロシージャ(ByVal i As Integer) As Integer i = i + 1 Functionプロシージャ = i End Function *********************************** Functionプロシージャは、 (ByVal i As Integer) As Integer のように、、二回もデータ型(Integer)の指定をしなくてはいけないのでしょうか? リンク先の説明には、 「SubプロシージャとFunctionプロシージャの違いは Subプロシージャが引数を受け取るのみに対して Functionプロシージャは引数を受け取り、 戻り値を返すという関数としての役割を果たすことができる点です。」 と記載されてますが、 それはSubプロシージャでも出来てますよね? サンプルコードにおいてのFunctionプロシージャの便利さを教えてください。

  • .NET - 配列変数を省略可能の引数にする方法

    お世話になっています。 .NETでのコーディングを行っています。 標記の件ですが、初めてなので .NETからなのか、もともとそうなのかは不明なのですが、 プロシージャの引数をOptionalで宣言すると、 省略された時の値を設定する必要がありますよね。 省略可能の引数を配列変数にしたい場合、どのように宣言したら良いのでしょうか? 初期値って言っても、今回省略可能にしたい変数は、 検索結果を格納するための変数ですので、 省略されたときには何の値も入っていなくて良いんです。 宣言部分は以下のとおりです。 Public Function CM_fun_b_Get_WeekdayNm(ByRef Wstr_WeekKb() As String, _ ByRef Wstr_WeekNm() As String, _ ByRef Wstr_WeekNmR() As String) As Boolean この、Wstr_WeekNmR()を省略可能にしたいのです。 このような場合、どうやって宣言するべきなのでしょうか? ヘルプを見たのですが、よくわからなくて・・・(;_;) 念のため、省略された時に、何らかの値を設定する方法も知りたいです。 よろしくお願いいたします。

  • EXCELのVBAプログラミング

    VBAで手続きの処理を書くのは,余り難しさを,感じませんが,目的に応じて 1)どのようなオブジェクトを使うか 2)オブジェクトを決定したとして,目的に沿った処理を行うのにどのメソッド,あるいは,プロパティを使うか 3)メソッドのどの引数をどのように指定するか は,知るのが大変です.これをどのようにして知る,あるいは見当をつけることができるのでしょうか. 一般の手続き型の言語,例えば,Fortran,Cobol,Cなどは,プログラムを書くのに必要な単語(予約語)はある程度学習すれば,そんなに時間をかけなくても,プログラムの質の善し悪しは別としてかけるようになります. それに反して,VBAでは,予約語が著しく多いようで,目的に沿った知らない予約語(オブジェクト,メソッド,プロパティ,引数など)をどのように探すかが問題になるはずだと思いますが,経験者の方はどのようにされているのでしょうか.場数を踏めば次第にできるようになるのでしょうが,正統的な方法はないのでしょうか.

  • エクセルVBAのMsgBox関数について

    エクセルVBAのMsgBox関数で項目1と項目2の値を表示して 問題なければデータベースに登録するといったコードを作りたいです。 今のところ以下のような感じです。 MsgBox("項目1" & 項目1.Value & vbCrLf & "項目2" & 項目2 & vbCrLf & "以上の内容で登録してよろしいですか?", 36 + 256, "確認,") これでは 項目1XXXX (XXXX 項目1の値) 項目2XXXX (XXXX 項目2の値) 以上の内容で登録してよろしいですか? のように表示され、項目1と項目1の値の間にスペースがないため 見栄えが悪いです。そこでスペースを表示して、尚且つ項目1の値と 項目2の値を右端を揃えて表示したいのですが、文字数が不定なので スペースを決まった数入力すれば解決するということではありません。 誰かVBAに詳しい方、ご教授願えませんでしょうか。

  • 引数を受け取る@_について

    subプロシージャ(関数)の引数について教えていただきたいのですが,例えば, @data1=(1,2,3,4,5); @data2=(6,7,8,9,10); &stat::cov(@data1,@data2); などとすると,sub cov{}で@_という配列の中に一緒に格納されますよね。しかし私としては@data1に格納されているデータと@data2に格納されているデータを別の配列に渡したい(別の配列で受け取るようにしたい)のです。 考えた策としては sub cov{ my $n=@_; my $h=$n/2; for($i=0;$i<$h;$i++){ $x[$i]=shift(@_); } for($k=0;$k<$h;$k++){ $y[$k]=shift(@_); } (以下省略) のように,shift関数で1つずつずらして違う配列に格納していくという方法なのですが,これは@data1と@data2に格納されているデータ数が等しい場合で無いと使いものになりません。 指定した引数を@_以外の配列で受け取らせる方法などはないものでしょうか?ちなみにPerlはまだ初心者にも達していないド素人ですのであまりプロ志向のものは勘弁してください(それでもなければ仕方ありませんが、、、)。

    • ベストアンサー
    • Perl
  • VBAの学習について(VBAエキスパート)

    いつもお世話になっております。 VBAの勉強を始めて半年程度の初心者に毛が生えた程度のものです。 仕事での作業を楽にしたい!!と思い半年程前にVBAの学習を始めました。 私の周りにはVBAの習熟者が皆無のため、ネットや書籍『・・・すぐわかる』『・・・ツボとコツがゼッタイわかる・・・』などの本を参考にある程度、当初の要望に応えられるコードを書けるようになったと思っています。(もっとも、習熟者から見れば汚いコードかもしれませんが・・・) 具体的には ・各シートのデータを配列変数に格納して、総括表に転記して、日付順に並び替え ・ユーザーフォームを使っての制御 ・簡単なデバッグ 程度だと思います。 折角学習したので今後も継続してスキルアップを目指し、綺麗なコードが書けるようになりたいと考えています。 そこで2点ほど質問があります (1)継続学習の良い参考書やサイト(練習問題があるような) 実用的な例題や解説が多数掲載されているような書籍やサイトはありますでしょうか? 本屋に見に行くのですが、初歩的な本と、辞書的な重厚な本は見かけるのですが、その中間的な書籍は見当たりません。 (2)VBAエキスパートの資格取得を考えています。 公式テキストがあるようですが・・・これっていかがでしょうか?? 2009年以降改定されていないようで、近所の書店には置いてないため、現物を見る事が出来ません。資格取得を考えるなら購入するべきでしょうか? 纏まりのない文章で申し訳ありませんが、よろしくお願いします。

  • 「名前付き引数 string」とはどういう意味です

    Left 関数のヘルプを見ると、 ----------------------------------- 指定項目 :string 内容:必ず指定します。 この文字列式の左端から文字列が取り出されます。 名前付き引数 string に Null 値が含まれている場合は、Null 値を返します。 ----------------------------------- とヘルプに書かれてるのですが 「名前付き引数 string」とはどういう意味でしょうか? 「引数」と、「名前付き引数」は、別の物ですか? http://officetanaka.net/excel/vba/error/compilation_error/error_21.htm を見るところによると、 Replace 関数で例えるなら、 Cells.Replace What:="aaa", Replacement:="" の 「What:=」や「Replacement:=」の事を名前付き引数と言うで、あってますか? しかし、Left 関数には、「What:=」のような引数はないので、 名前付き引数は使われてないと思うのですが・・・ http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_03/003.html を見たのですが、よくわかりませんでした。

  • エクセルのVBAについて

    エクセルのVBAに詳しい方がいらっしゃれば、助けて頂きたい事がございます! ・Sheet1(以下S1と記載)の、1列目に、A1セルより、項目として、「ID、地区、住所、電話番号、資産名、耐用年数、取得日」が記載(=S1は項目のみ) ・Sheet2(以下S2と記載)の、1列目に、A1セルより、項目(住所、設備、資産名、区域、備考)と2列目以降にそのデータが記載 【やりたいこと】 S1の項目と完全一致するS2の項目(上記では、住所、資産名のみ)の2列目以降のデータを、S1の2列目以降に張り付ける作業を自動化するコードを書きたいのですが、上手くいかず・・・ どなたかコードを記載して頂けないでしょうか?また下記の前提を考慮したコードであると、なお助かります! 【前提】 ・「S1の項目が空欄にぶつかったら、検索を終了」という事をループに入れる(S1の項目数は変動するため) ・「S2の2列目以降の全てのデータをS1に張り付ける」という事をコードに入れる(S2の2列目以降のデータの列数も変動する且つ途中に空欄も含むため) ・S1の「地区」に、S2の「区域」を反映できるようなコードを入れる 宜しくお願いいたします_(._.)_

専門家に質問してみよう