• ベストアンサー

自作ファンクションの引数の参照

エクセルでオリジナルの関数を作るとき Public Sub abc(a as Range) ~ End Sub というようにレンジ型を引数にとった場合、例えばaにB5:E10を代入した時、各セル(aの中身)に入っている値を参照するにはどういう風に書いたらよいでしょうか?  ちなみにバージョンはEXCEL2000です。 よろしくお願いします。

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Function fnn(Rng As Range) As Double fnn= Rng.Cells(2, 1) End Function 上記が動きます。 C6:D8に 1 4 5 9 3 6 に入れて、=fnn(c6:d8)(""は付けない)をA1とかに入れると、5すなわちC7がえられます。 我々はCells(1,1)などを使いますが、A1を起点にする ことを略している(省略できている)からです。 上記のRngはC6:C8と範囲が狭いですが、やはりC6を起点にしてcellsプロパティが使えるわけです。 条件に合った1つ(関数は1つの値しか返せない)を掴まえるにはFor next でcells(i,j)を繰り回し判断すれば良いです。またはForEachも使えるでしょう。 Rng.Cells(3)と言う表現もあります。 Rng(4)もあります(D7の9になります)。

ssssssssss
質問者

お礼

なるほど、大変よく解りました。 ありがとうございました。

その他の回答 (1)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

AAAで指定範囲を設定し、それを引数にしてBBBを呼び出しています。 参照ということで MsgBox で値とセル番地を表示しています。ご参考に。 Sub AAA()   Dim rg As Range     '指定範囲   Set rg = Range("B5:E10")   'BBBで指定範囲の値を参照してみる   Call BBB(rg) End Sub Private Sub BBB(a As Range)   Dim elm As Range    '指定範囲内での1つのセル   '***** for each を使った参照例。行列の順の参照になる *****   For Each elm In a     MsgBox elm.Value & " address:" & elm.Address   Next   '***** 行・列を指定して参照例。2つのforで行・列の順は自由にできる *****   Dim eRow As Long    '指定範囲内での表示する行   Dim eCol As Integer   '指定範囲内での表示する列   For eCol = 1 To a.Columns.Count     For eRow = 1 To a.Rows.Count       MsgBox a.Cells(eRow, eCol).Value & " address:" & a.Cells(eRow, eCol).Address     Next   Next End Sub

ssssssssss
質問者

補足

早速の回答ありがとうございます。 nishi6さんのサンプルコードによるとRange型はa.Cells(Row,Col).Valueで参照できるみたいですね。 もうちょっとくだけた内容で質問しますと 表題の例の場合B5を参照したければ a.Cells(1,1).Value、D8を参照したければ a.Cells(4,3).Value で良いということですよね?

関連するQ&A

  • EXCEL2002で、VBEの記述のセル参照について

     EXCEL2002で、VBEの記述のセル参照について Sub データ置換(1)() With Range("C4:E4") .Replace What:="8038", Replacement:="A4" End With End Sub 上記コードの3行目、右端、 Replacement:="A4" の"A4"を、セル参照にして、"9984"等、可変する4桁の数字を入力して、 "8038"⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒"9984" というように、いつ何時でも、変更可能な『好きな数字』を、マクロボタン一つで変えられるように、編集したいのですが、どのように修正したら良いでしょうか?  引数に関する初歩的な質問ですが、何分、初心者でありまして、優しくお答えお願いします。

  • 配列変数を引数として(参照)値渡しをしたいのですが

    プロシージャ間で配列変数を引数として(参照)値渡ししたいのですが、例えば以下のような場合、2箇所のXXX部分はどのように記述したらよいのでしょうか。 よろしくお願いします(Excel2000使用) Public Sub give()   Dim a(2) As Byte   a(0) = 3   a(1) = 15   take XXX End Sub Public Sub take(XXX)   (処理省略。受け取り側でも配列変数で処理したい) End Sub ※上記の例では配列の要素数が2ですが、実際はもっと多いので、例えば「take a(0),a(1),・・・」というふうな記述は(仮に適切なものであったとしても)記述しきれません。

  • 参照なバリアント

    VB熟達者というよりは、VBマニアな方々に質問です。 Sub Hoge(A) A = 6 End Sub Sub Main() Dim N As Long Hoge N Debug.Print N End Sub このコードを実行して "6" が出力されるのは明白です。 Hogeはバリアントの参照を取るにも関わらず、LongのNを渡してそのNに6を入れてくれました。 これは、VBが引数を渡す時点で変数A用のメモリ領域をかってに確保し、Nという変数の参照型を作ったということの証拠になります。 実際、DLLでAPIを用意して、バリアント構造体のVarTypeを調べたところ、未知の16387という数値が現れました。 これは、MSDNライブラリを見たところ、VT_LONG Or VT_BYREFのようです。 このように、VBでも参照型は存在していますが、隠蔽されています。 そこで、参照型をもっと自由に使いたいと思い、参照型を作るAPIを作ってみました。 しかし、=演算子で代入しようとしたところ、参照が解除されて通常のバリアント型に戻ってしまいます。 ただし、もともとある変数の参照であるバリアント変数を別の変数の参照に変えたもののときは、参照先に代入してくれました。 どうやらVBはケチなようで、VBが内部で引数として作った参照変数以外は、参照している先に代入はしてくれないようです。 この障害を乗り越える方法を思いついた方、ぜひ教えてください。

  • 自作したメソッド・・・引数はなるべく省略すべき?(VB2005)

    自作したメソッドに関して、引数はなるべく設定するべきでしょうか?それとも、引数は省略できるなら省略したほうがよいでしょうか? 下記(a)、(b)は例です。 a)引数はなるべく省略   ---------------------------------   Private Sub hoge()     Call foo()   End Sub   Private Sub foo()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     '処理   End Sub   --------------------------------- b)あえて引数を設定   ---------------------------------   Private Sub hoge()     Dim hoga As integer = Pbar    'プロパティ「Pbar」の値を設定     Call foo(hoga)   End Sub   Private Sub foo(ByVal hoga As integer)     '処理   End Sub   --------------------------------- 現在、(b)のようにあえて引数を設定したほうが、呼び出し先のメソッドがどういう処理を行っているかを掴めていいかな?と考え始めています。 ご助言よろしくお願い致します。

  • セル値のシート参照

    excel2010 セル値のシート参照がうまく動作しません。 構成は下記です。 ディスクトップにa.xlsmのファイル。シート名称はSheet1、シート計算は手動にしています。 Cドライブのtempフォルダにabc.xlsというファイルを登録しています。 C:\TEMP\abc.xls abc.xlsのファイルは、シート名称が(日付け)という構成です。 9/1だと(1)、9/23だと(23)の様になっています。 a.xlsmのファイルからマクロを使い、日付けに相当するシートを表示させようとしています。 a.xlsmのQ2セルには日付けのデータが入ります。表示形式は9/23みたく。 Q3セルは、="("&TEXT(Q2,"dd")*1&")" これで、日付けからabc.xlsファイルのシート名称を参照させる構成です。 作成したマクロは下記です Sub マクロからブックを開く2() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t ’Q3セル値を更新させる為に計算実行 Calculate Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate End Sub 上記だと、Q2セルの日付けを変えても1つ前の日付けで参照されます。 上記を2回そのまま実行すると正しく反映されます。 Debug.Print tでも更新されていないのが分かります。 なぜなのでしょうか? ちなみに、下記の様にマクロを分割すると、正しく表示されます。 Sub マクロからブックを開く() Worksheets("Sheet1").Activate Dim t As String t = Range("Q3").Value Debug.Print t Calculate cal End Sub Sub cal() Dim t As String t = Range("Q3").Value Debug.Print t Workbooks.Open "C:\TEMP\abc.xls" Worksheets(t).Activate 'Call カレントフォルダの表示 End Sub 上記の様に2つに分けると Debug.Print tで更新されていることが確認出来ます。 1つ目のマクロ マクロからブックを開く2 のおかしな内容の理由と対策内容を教えていただきたく、よろしくお願いします。

  • 関数の引数

    こんにちわ。 ご存知の方、ご教授してもらえないでしょうか? VB.net2005を使っているのですが 関数の引数に変数をセットして、別関数で 引数に対してデータをセットすることは可能でしょうか? C言語でいうところのポインタを引数に渡し ポインタアドレスに書き込むような処理はVB.netでは 可能なんでしょうか? 下記のような事は試したのですが、うまく出来ませんでした(。。; public sub test1() dim mojiretu as string test2( mojiretu ) msgbox(mojiretu) end sub public sub test2( str as string) str = "文字列" end sub

  • バッチファイルからVBAに引数を渡したい

    お世話になります。 a.batというバッチファイルがあります。 このファイルを起動させた時にABC.xlsというEXCELが起動するようにしたいのですが、その際にバッチファイル側から"1303"という文字列をabc.xlsに引数として渡したいのです。 EXCEL側ではauto_open(a)で待ち受けて、このaに"1303"が入ってmsgで"1303"と表示させたいのですが、引数は省略出来ません、というエラーが出てしまいます。 どなたかやり方をご教授いただけませんでしょうか?よろしくお願い致します。 環境 WindowsXP SP3 Excel2003 ============================== バッチファイル側 ============================== @echo off echo バッチファイルを実行します。 ABC.xls "1303" echo 終了しました。 ============================== EXCEL VBA側 ============================== Sub auto_open(a As String) Msg a end sub

  • ExelVBAで参照渡し

    こんばんは。またお世話になります。m(_ _)m 土・日を利用してVBAを学習しようと参考書を買ってきたのですが、基本構文について載ってなかったので質問します。 Sub Main() subject1(Range("A1:B2")) End Sub Sub subject1(arg As Range 上の式にてエラーが出る為ヘルプを参照したところ、どうも Range()が返すオブジェクト参照を Sub subject1(argument As Range) で受けられないようだと分かったのですが、ではどうやって参照を渡せば良いのかが分かりません。 VBは触った事がなく、初歩的かと思いますが、どなたか教授願えませんでしょうか。また、どこか参考になるサイトを教えて頂ければ助かります。

  • Excel VBA セルの隣を参照し別セルに 代入

    Excel2003版でVBAを使い  検索と参照プログラムを組みたい ----------------------------------------- Sub Sample1() Dim FoundCell As Range Set FoundCell = Range("B55:B63").Find("1") If Not FoundCell Is Nothing Then MsgBox FoundCell.Offset(0, -1) End If End Sub ------------------------------------------- ↑VBAプログラム参照↑ ・B55~B63セル内の中から(1)の 数字があるセルを探し更に検索してヒット したセルの左セルの内容を メッセージボックスに表示させると ゆうやり方です。 この内容を あるセル 例えば"E17"セルに代入させたい場合 やりたいこととしまして、 ○----------------------------------------------------------○ E17セルの内容を空白にした後 Calculateを使い ランダムシャッフルし、 B55~B63セル内の中から(1)の 数字があるセルを探し更に検索してヒット したセルの左セルの内容をE17に入力(代入又は参照でも可)させたい ○---------------------------------------------------------○ 場合はどのようにプログラムを組めばよろしいですか? 無知で愚かな私ですが 恥を忍んでご教授頂けませんか よろしくお願いします(人>д<*ペコ謝)

  • 引数付のFuncitonプロシージャと引数付のSUBプロシージャの違い

    親プロシージャに数値を渡すときに、引数付のFuncitonプロシージャと引数付のSUBプロシージャは、結果を見ると同じ動きをするように思います。 このような場合、両者には、どのような違いがあるのでしょうか? Sub 親プロシージャ() Cells(1,MyNOend)=123 end Sub ・子プロシージャ Function FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Function Sub FMyRowCnt(MyNOend As Integer) MyNOend = TMYKanriBkWs1.Range("D1").CurrentRegion.Rows.Count End Sub 以上 よろしくお願い致します。

専門家に質問してみよう