人に聞けない痔の悩み、これでスッキリ >>

Functionで戻り値を複数取得したいのですが
うまくいきません。(NULLの使い方が不正ですとエラー)

戻り値に配列を使う場合
呼び出し側はどのように記述すればいいでしょうか?

<呼び出し側>

Private Sub a()
wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー
wkkekka2 = 処理結果(Kensu, Houhou)(1)
wkkekka3 = 処理結果(Kensu, Houhou)(2)

End Sub


<関数>
Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String)

Dim kekka(3) As Double

If lngKensu = 1000 and strHouhou = aaaaaa then
kekka(0) =  0.1
kekka(1) =  2
  kekka(2) =  300
Else
↓ (省略)
    ↓
End If

処理結果 = kekka

End Function

このQ&Aに関連する最新のQ&A

A 回答 (4件)

関数 処理結果の戻り型を As Double() と定義します


呼び出し元で
Dim arKekka as double()
arKekka = 処理結果(Kensu, Houhou)
で受け取り
wkekka1 = arKekka(0)
wkekka2 = arKekka(1)
wkekka3 = arKekka(2)
といった具合にして見ましょう

3個の結果を返すなら変数kekkaの宣言は
dim kekka(2) as Double
としましょう
    • good
    • 1
この回答へのお礼

初心者にもとてもわかりやすいアドバイス
ありがとうございます。
しっかり理解できました★

お礼日時:2008/08/18 21:28

この関数の呼び出しが多用されるのであれば、その処理用の構造体なりクラスなりを用意して、関数の戻りはその型で返すようにするというのが


一番エレガントな答えじゃないかと思います。(手間との兼ね合いがありますが)

ちなみに上のような呼び出しが可能であっても(VB.netで関数の戻りの型を明示すれば可能のはず)上の使い方だと、関数が3回呼び出されることになります。
関数の呼び出しは最小限にして、戻りを変数に格納して使う習慣はつけといていいかと思います。

No1の返信について
>呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?
何もセットしないというよりは、初期化した変数をセットするというのが無難かと思います。

# FunctionならOutput引数は使わないというのは当然として、個人的には「答えを返す」のであれば極力関数の戻りとしてとるべきだと思っています。(そのほうがよんでいてわかりやすいし)
    • good
    • 1
この回答へのお礼

関数が3回呼び出されることになるんですね
NO1の返信についてのコメントも
ありがとうございます。
よくわかりました。

お礼日時:2008/08/18 21:35

 関数というのは元来アウトプットされるデータが一つのものを指します。

コール・バイ・ネームで引き数を定義すればデータを持ち出すことができますが、これは飽くまで非常手段であり、複数のアウトプットデータがある場合は Procedure として定義するべきです。そしてインプットデータはコール・バイ・バリュー、アウトプットデータはコール・バイ・ネームで宣言すると後のデバッグで紛れがなくなります。自分でコーディングするからいいじゃないか、それは勝手だというのは全く違います。自分で組んだルーチンは殆ど頭に残っておらず、それぞれがどういう計算をしているのかが分からなくなってしまい勝ちなのでできるだけ紛れのない構造にしておくことが大切なのです。
引数は何を意味するのかを、註釈で説明しておくことも大切ですよ。
 これは大きなシステムを大人数で共同開発するときには必要不可欠なことなのですが、一人で組むプログラムも全く同じですよ。
    • good
    • 0
この回答へのお礼

初心者かつ独学ではじめている為
まだまだ勉強不足です。
一字一句の理解から時間がかかってしまうので
Willytにアドバイスしていただいた語句は
ひとつづつ調べてみて理解していこうと思います。
取り急ぎお礼させていただきます。
ありがとうございました。

お礼日時:2008/08/18 21:25

同じような質問がありました。


http://oshiete1.goo.ne.jp/qa3511531.html
No.3及びNo.4の回答がそのままではないかと思います。
#個人的には参照型引数使いたいケースですが
    • good
    • 0
この回答へのお礼

早速試したらできました。
とても助かりました!
ありがとうございました。

ちなみに参照型引数について、調べてみました。
引数にも値をセットできるという事でしょうか?
今回の場合でいうと、
もともと必要な2つの引数+値を戻したい3つの引数=5つの引数を指定しておいて
呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?

お礼日時:2008/08/14 17:47

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

QVBA Functionプロシージャで複数の値を

エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として
受け取る方法を考えています。

下記のようなサンプルプログラムを作りました。
---------------------------------------------------------------------------------
Option Explicit

Private Sub CommandButton1_Click()
Dim kekka(3) As Double
Dim txt As String
txt = "12.12A,34.34B,56.56C,78.78D"
kekka(0) = test(txt)
End Sub

Public Function test(ByVal text As String) As Double
Dim txt_kakou(3) As String

'## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し
'## 下記のように配列txt_kakou(3)に振り分ける
'## 加工方法は割愛

txt_kakou(0) = 12.12
txt_kakou(1) = 34.34
txt_kakou(2) = 56.56
txt_kakou(3) = 78.78

'string型からdouble型に変換する。
txt_kakou(0) = CDbl(txt_kakou(0))
txt_kakou(1) = CDbl(txt_kakou(1))
txt_kakou(2) = CDbl(txt_kakou(2))
txt_kakou(3) = CDbl(txt_kakou(3))

test = txt_kakou()

End Function

-----------------------------------------------------------------------------------

まず、呼び出し側のプロシージャでkekka(3)という配列を宣言します。
次に変数txtに「"12.12A,34.34B,56.56C,78.78D"」の文字列を代入します。
そして変数txtをFunctionプロシージャに投げます。

Functionプロシージャでは、受け取った「"12.12A,34.34B,56.56C,78.78D"」
を数値のみに分解し、4つの変数に代入します。
この4つの変数も配列で用意し、txt_kakou(3)とします。

このtxt_kakou(3)を呼び出し元に返し、呼び出しもとの変数kekka(3)に入れたいのです。

また、はじめ変数txtに代入される値は文字列ですが、この文字列をFunctionプロシージャで分解し、
分解した値は、最終的には数値として扱いたいので、途中でdouble型に変換しています。

これを実行すると、Functionプロシージャの最後のtest = txt_kakou()で、型が一致しません
といわれてしまいます。

どのように書き直せばいいのでしょうか。

よろしくお願いします。

エクセルでVBAのFunctionプロシージャについて複数の値を戻り値として
受け取る方法を考えています。

下記のようなサンプルプログラムを作りました。
---------------------------------------------------------------------------------
Option Explicit

Private Sub CommandButton1_Click()
Dim kekka(3) As Double
Dim txt As String
txt = "12.12A,34.34B,56.56C,78.78D"
kekka(0) = test(txt)
End Sub

Public Function test(ByVal text As String) As Double
Dim txt_kakou(3) As St...続きを読む

Aベストアンサー

No2です。関数を以下に変更してください。
それこそエラーが出ないのでうっかり。

Private Function test(ByVal text As String, ByVal i As Integer) As Double
Dim txt_kakou(3) As String
Dim int_kakou(3) As Double

'## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し
'## 下記のように配列txt_kakou(3)に振り分ける
'## 加工方法は割愛

txt_kakou(0) = "12.12"
txt_kakou(1) = "34.34"
txt_kakou(2) = "56.56"
txt_kakou(3) = "78.78"

int_kakou(0) = CDbl(txt_kakou(0))
int_kakou(1) = CDbl(txt_kakou(1))
int_kakou(2) = CDbl(txt_kakou(2))
int_kakou(3) = CDbl(txt_kakou(3))

test = int_kakou(i)
End Function

No2です。関数を以下に変更してください。
それこそエラーが出ないのでうっかり。

Private Function test(ByVal text As String, ByVal i As Integer) As Double
Dim txt_kakou(3) As String
Dim int_kakou(3) As Double

'## 渡された「txt = "12.12A,34.34B,56.56C,78.78D"」を加工し、数値のみを取り出し
'## 下記のように配列txt_kakou(3)に振り分ける
'## 加工方法は割愛

txt_kakou(0) = "12.12"
txt_kakou(1) = "34.34"
txt_kakou(2) = "56.56"
txt_kakou(3) = "78.78"

int_kakou(0) = CDbl(txt_kakou(0)...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVBでグローバル変数を宣言するには

VB初心者ですが。クイズゲームのようなものを作成したいと考えてます。
Private Sub ~ End Sub の中で宣言した変数って他のところに呼び出したり(戻り値として渡す)出来るのでしょうか?
どこでも、いつでも呼び足せるグローバル変数の宣言とはどのようにやるのか、具体的に教えていただけないでしょうか?

Aベストアンサー

>Public a as Integerのように宣言して、初期化するにはどのように記述を行えばよいですか?

>Public a As Boolean = 0
のように記したら”コンパイルエラー”と出ました。

Booleanって整数値取れたかなと思いつつ。
Sub~End Sub内でa = 0を代入したりしてください

扱おうと言うことがあるかどうか疑問だけど

Public Const a As Integer = 10 'グローバルな定数の宣言

Q配列を関数に渡す方法

VB6.0のプログラムで質問があるのですが
下のプログラムのように配列num、num1を関数AAAに
渡したいと思うのですがどうすればいいのでしょうか?
よろしくお願いいたします。

Option Explicit
Private num(10) As Integer
Private num1(10) As Integer

Private Sub Write_Click()
   AAA(num)
   AAA(num1)
End Sub

Private Function AAA(???)
   Dim i As Integer
   For i = 1 To 10
      ???(i) = i
   Next i
End Function

Aベストアンサー

コードミスしてました申し訳ない

Option Explicit
Private num(10) As Integer
Private num1(10) As Integer

Private Sub Write_Click()
   Call AAA(num)
   Call AAA(num1)
End Sub

Private Function AAA(ByRef test() As Integer)
   Dim i As Integer
   For i = 1 To 10
      test(i) = i
   Next i
End Function

ですね!


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング