引数の使い方と省略方法について

このQ&Aのポイント
  • 関数の引数を使う際、特定の引数が必要ない場合はどのように省略するかについて質問しています。
  • 引数test()の値を渡さずに関数を呼び出したい場合、どのように記述すればよいかを知りたいとしています。
  • また、引数test_idの値を渡さずに関数を呼び出す場合、0を渡す方法を使用しているが、他の方法はないかも知りたいです。
回答を見る
  • ベストアンサー

引数(配列)について

呼ぶ側: Sub main()  Call func(test(),test_id) end Sub 呼ばれる側:  Private Sub func(Byref test() as string, Byval test_id as long) と言う関係がある場合で 引数(1)test() の値がなく渡したくない場合は、どのように記述すればいいのでしょうか? 引数(2)test_id の値がなく渡したくない場合は、0を渡しています  また、呼ぶ側で test() を宣言し、tast()=""を代入すれば問題ないことは分かっているのですが、test()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

  • nao0
  • お礼率10% (50/483)

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1

Function NullStringArray() As String() End Function Sub Main() Call Func(NullStringArray(), 0) End Sub

nao0
質問者

お礼

ご回答有難うございました とても参考になりました

その他の回答 (1)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.2

呼ばれる側: Private Sub func(Byref Optional test as Variant, Byval Optional test_id as long = 0) If IsMissing(test) Then Exit Sub '処理 End Sub で良いんじゃない? 配列なら勝手に配列にしてくれるし。 構造体(ユーザー定義関数)なら構造体にしてくれるし。

nao0
質問者

お礼

有難う御座います 勉強になりました

関連するQ&A

  • VB.netでのVC++呼び出し引数の順番

    VC++で作成されたDLLをVB.NetにてそのDLLを呼び出すアプリを作成して います。以下のパターン2では問題なく動作しますが、パターン1では DLL側で見たときにchar変数に正しく値が入りません(NULL)になる。 パターン1とパターン2の違いは引数の順番です。 開発環境:VisualStudio2008 OS:WindowsXP SP2 パターン1(この場合はNG)  VC++側の宣言   extern "C" __declspec(dllexport) void func1(int i,char*s)  VB.Net側の宣言   <System.Runtime.InteropServices.DllImport("func.dll")> _   Public Sub func1(ByVal i As Long, ByVal s As String)   End Sub パターン2(この場合はOK)  VC++側の宣言   extern "C" __declspec(dllexport) void func1(char*s,int i)  VB.Net側の宣言   <System.Runtime.InteropServices.DllImport("func.dll")> _   Public Sub func1(ByVal s As String ,ByVal i As Long)   End Sub VC++側がパターン1で作成さているため、VC++側を修正をしないで 正常に動かすことは可能でしょうか? よろしくお願いします。

  • .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()を省略可能にしたいのです。 このような場合、どうやって宣言するべきなのでしょうか? ヘルプを見たのですが、よくわからなくて・・・(;_;) 念のため、省略された時に、何らかの値を設定する方法も知りたいです。 よろしくお願いいたします。

  • vba引数の渡し方について

    win32APIで作成したシステムを64bit環境でも動くよう修正をしています。 win7、access2010 以下のとおり宣言変更したところ、lpDevMode型が32bitの場合Long型、64bitはDEVMODE(構造体)となりました。 この時、Private Const DEFAULT_VALUES = 0のところは64bit用にどのように修正したらよいのでしょうか? このままコンパイルすると「ByRef 引数の型が一致しません。」となります。 <<宣言>> #If VBA7 And Win64 Then     Private Declare PtrSafe Function DeviceCapabilities Lib "winspool.drv" _         Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, _         ByVal lpPort As String, ByVal iIndex As Long, ByVal lpOutput As String, _         lpDevMode As DEVMODE) As Long #Else     Private Declare Function DeviceCapabilities Lib "winspool.drv" _        Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _         ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _         ByVal lpDevMode As Long) As Long #End If Private Const DEFAULT_VALUES = 0 <<呼び出し元>> lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_BINNAMES, _ lpOutput:=ByVal vbNullString, _ lpDevMode:=DEFAULT_VALUES)           ↑「ByRef 引数の型が一致しません。」

  • スレッドで Byref の引数を渡したい場合

    VB2005 の初心者です。 スレッドに Byref の引数を渡すやり方が分かりません。 Byval だとエラーは出ないのですが、 Byref だとどうしてもエラーが消えません。 ソースは下記です。 Private CDF As clsCDF Public Class clsCDF Public LOOP1 As clsLoop1 Public LOOP2 As clsLoop2 End Class Protected Overrides Sub OnStart(ByVal args() As String) Thread = New Thread(AddressOf ABC) Thread.Start(CDF) End Sub Private Sub prvABC ( ByRef CDF As Object ) End Sub 何かヒントになることでも良いので、 皆様の知恵をお借りできれば幸いです。 よろしくお願い致します。

  • ActiveXDLL関数の引数ByRefでの呼び出し

    例えばActiveXDLL関数 Sub func1(ByRef lP1 As Long) lP1 = 11 End Sub があるとします。これをASP側で呼び出そうとすると ii = objXX.func1(lP1)’このように エラー タイプ Microsoft VBScript 実行時エラー (0x800A000D) 型が一致しません。: 'objXX.func1' /login.asp, line 156 と出てしまいます Sub func1(ByVal lP1 As Long) だと正常に動くようです。これだと意味がありませんが。 引数がByRefの時はASP側をどのように記述したらよいのでしょうか?

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

  • VBA 引数にcombobox,Range

    おはようございます。 質問内容が明確?で無い点が多いかもしれませんが、 質問させていただきます。 まず、Excel2003を使い、フォーム上にはコンボボックスを置いています。 プロシージャ?の中の引数?として コンボボックスの名前を使いたいと思っています。 Private Sub UserForm_Initialize()  Call TEST(Combobox1,"A1") End sub Sub TEST(Byval ComboboxName,Byval TEST_Range)  ComboboxName.AddItem "A"  TEST_Range="テスト" End Sub 適当に作成してみましたが… TESTを実行したら、 引数にあるコンボボックスに”A"という値を追加し、 TEST_Rangeに"テスト"と入力したいです。 引数として宣言する際、Stringは違うと思うのですが、 どうやって宣言?すれば良いのでしょうか。 上記例では、TESTを実行したら Combobox1に"A"という値が追加され、 A1に"テスト"と入力されるようになっています(それを目的とします) 分からない点がありましたら、どんどん聞いてください。 よろしくお願いします!

  • VB.NETで値や参照について ByRefなど

    VB.NETで値や参照について、まだ初学ですがよろしくお願いします。 VBは2008です。 以下のようなs文字列を参照引数にしたSetDataメソッドがあります。 ByRef s As Stringという引数は、SetData内でsを書き換えると、 呼び出したSetDataメソッド外でも中身が変わるので 私のByRefの認識ではポインタと解釈しています。間違っているでしょうか? SetData(1,1, buf)とすれば、DataGridViewの中は、「初期値」という文字が表示されます。 別のメソッド(KaKikae)でbufを"あ"という文字に変えた場合、SetDataメソッドを使わなくても 書き換わっていると思っていたのですが、実際実行してみると書き換わりません。 値や参照について理解が足りないからだと思いますがわかりません。 どのようにすれば、それが実現できるのでしょうか? Public Class HogeClass Private buf As String = "初期値" Private Sub SetData(ByVal x As Integer, ByVal y As Integer, ByRef s As String) As Boolean Dim dg As DataGridView dg = DataGridView1 dg.Item(x, y).value = s End Sub Private Sub KaKikae() buf = "あ" End Sub End Class

  • VB.net 引数で配列変数を渡す際の要素数

    VB.net 2010 の質問です。 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。 Dim Hairetsu() As String ' ←エラー Dim Hairetsu(100) As String ' ←正常 Public Sub aaa(ByRef Hairetsu() As String) Hairetsu(0) = "Test" '←正常の場合と、エラーの場合 End Sub Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、 プログラム中、要素数がどこまで増加するか、分かりません。 Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

  • 配列を引数で渡したりするには?

    初心者なので困っています。配列をほかのサブルーチンへ渡して、その中で配列の値を書き換えて、上層のルーチンへ渡すにはどうしたらよいのでしょうか? 初心者なので、みなまさまのお知恵を拝借させてください。よろしくお願いします。 Private Sub Print() Dim C_ALL(3) As Integer Dim D_ALL(3) As Integer Data_Set(C_ALL(), D_ALL()) MsgBox(C_ALL() & " " & D_ALL()) '配列内容すべて表示 End Sub Private Sub Data_set(ByRef C_ALL As Integer, ByRef D_ALL As Integer) Dim i As Integer For i = 0 To 4 C_ALL(i) += i D_ALL(i) += i i += 1 Next End Sub

専門家に質問してみよう