プロが教えるわが家の防犯対策術!

Excel2007のVBで以下のfunctionを定義すると、Returnのところでコンパイルエラーになります。

--------------------------------------
Public Function IsTen(lNumber As Integer) As Boolean
If lNumber = 10 Then
Return True
Else
Return False
End If
End Function
--------------------------------------

ググってみるとReturn True とか Return False とかができるように思えるのですが、何が不味いのでしょうか?

VBの知識はあまりなく、低レベルな質問かもしれませんが、よろしくお願いします。

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

A 回答 (3件)

VB7以降(=VB.NET以降) では,Returnは戻り値を指定して関数から戻る (またはサブプロシージャから戻る) 機能になっています。



しかし,VB6およびそれ以前や,VBAでは,ReturnはGoSub文で呼び出されたサブルーチンから戻る機能です。
このため,関数の戻り値を指定して関数から戻る目的でReturn文を使うことはできません。

なお,#1さんへのお礼に書かれていたページでは,
・背景が緑のものはVB6用のコード
・背景が青のものはVB.NET用のコード
です。
    • good
    • 1
この回答へのお礼

なるほど。
記事をよく読んでいませんでした。申し訳ないです。

VB7以降では「Return 戻り値」が使えるけれど、VB6以前では使えないということですね。

ありがとうございます。

お礼日時:2011/07/12 23:47

No.1さんの「お礼」で示されたページの説明を良く理解してください。


Return "Hello!"
のように書けるのはVB.NETの場合だけです。
VB6ではGoSubに対するReturunであってReturunに戻り値を引数を持つことはできません(関数を脱けるステートメントではない)。
このGoSub-Returunは古いバージョンのVBとの互換性のために残されたものであってVB6での使用は推奨されない。
VBAは詳しくありませんがVB6と同じか実装されていないかもしれません。
ヘルプで確認してください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

No.2さんのお礼に書いたとおりです。
私の読解不足でした。

uruzさんの回答も質問に対して十分な回答ですが、
先着順ということで、No.2さんをベストアンサーとさせていただきます。

お礼日時:2011/07/12 23:51

それは、CやC#でのReturnです。


VBAの場合は、
Function IsTen = True  ※つまりユーザー関数に代入するとそれが戻り値になる。
として、Returnです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Function IsTen = True とする書き方は知っているのですが、以下のサイトを見ると Returnで値を返せると言ってます。

http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6to …
「Return文のあとには式を書くことができ、これにより、関数が返す値を指定できる。」

サンプルを見ると、Return "Hello!" として String の値を返しています。

VB 6の機能と書いてるので、Excel2007はVB 6に対応してないということなのでしょうか?

お礼日時:2011/07/12 22:55

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

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

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

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

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

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

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

こんにちは。

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

Aベストアンサー

こんばんは.

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

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

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QFunctionで戻り値を複数返す方法

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

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...続きを読む

Aベストアンサー

関数 処理結果の戻り型を 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
としましょう

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 'グローバルな定数の宣言

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QVB.NETでのイベントの途中終了

VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。

そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。

どなたかおわかりの方お願いします。

Aベストアンサー

Exit ←これをイベント終了したいところで、使えばいいと思いました。

(例)
Private Sub Button1_Cilck・・・省略・・・
 '「Button1」をクリックしたときのイベント
 If Msgbox("イベントを途中終了しますか?",vbYesNo) = vbYes Then
  Exit Sub 'イベント途中終了
 End If
 Msgbox("イベントを途中終了しませんでした。")
End Sub

QVB.NET getとsetの概念がわかりません。

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As SelectionList)
Me.CheckBox = value
End Set

End Property

End Class
****************************************************************

ここでのGet Setはどういう動き・働きをしているんでしょうか?
わかる方がいたらご助言お願いいたします。
(サンプルソースなどがあれば理解しやすいかもしれません。。)

GetとSetがどういう働き・意味をもっているのか理解できていません。

たとえばSpecialTextBoxというクラスがあったとします。
***************************************************************
Imports System.Web.UI.MobileControls

Partial Class SpecialTextBox
Inherits System.Web.UI.MobileControls.MobileUserControl

Public Property Item() As SelectionList

Get
Return Me.CheckBox
End Get
Private Set(ByVal value As Sele...続きを読む

Aベストアンサー

getはそのインスタンスから値を取り出します。
setはそのインスタンスに値を設定します。
あなたの例だと、GetはCheckBoxの値を取り出します。
SetはCheckBoxに指定した値を設定します。

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ランキング