質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

663閲覧

VBAの引数の括弧について

kazuo4465

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/03/10 18:14

失礼します

Excel VBA のクラスについて調べていたらこのサイトを見つかって読んでいたのですが

はてなID t-hom さん
http://thom.hateblo.jp/entry/2016/12/31/013555

言語
Excel VBA

プログラム内容
初期設定値30の値をメッセージボックスに表示して
その値を1づつ三回加算して
メッセージボックスに結果を表示する

コード

値を設定するためのアクセサを作成する

ここでやっぱりカウンターの値を外から代入できるようにしたいという要望が発生したとしよう。ただし設定できる値は1から100の間に制限したいとする。

そこで値を設定するため、LetValueという名前でアクセサを作成した。
引数を渡すと、1から100の範囲ならValueに設定し、それ以外ならエラーを発生させるプロシージャである。

クラス Counter
Private Value As Long

Sub Up()
Value = Value + 1
End Sub

Function GetValue() As Long
GetValue = Value
End Function

Sub LetValue(n As Long)
If n >= 1 And n <= 100 Then
Value = n
Else
Err.Raise vbObjectError, "Counter", "その値は設定できません。"
End If
End Sub

Private Sub Class_Initialize()
Value = 1
End Sub

このようにアクセサにチェック機能を持たせることで、不正な値でデータを壊すことなく、外部から安全にValueを設定することができる。

CountUpSampleは次のようにLetValueアクセサで30を設定するように書き換えたみた。

Sub CountUpSample()
Dim c As Counter
Set c = New Counter
c.LetValue 30 '----------------------この部分(質問者の追加コメント)
MsgBox c.GetValue
c.Up
c.Up
c.Up
MsgBox c.GetValue
End Sub

たとえば1000などの値に変えて実行してみるとちゃんとエラーが出るのが分かる。


このような内容だったのですが、コードを読んでいくうちに、メインコードの

c.LetValue 30 ではてなと止まってしまいました。

このアクサ、引数 30 が括弧で閉じられていないぞ・・・・

VBE にコピペしてみても動く
ではと
c.LetValue (30)
に書き換えてみてもやっぱり動く

さてと思い調べてみると戻り値が返ってこない場合は引数を括弧で閉じないとのこと

http://officetanaka.net/excel/vba/beginner/07.htm

この場合

c.LetValue 30

は、クラス内で処理して戻り値がありませんから括弧がなくて正解!!

c.LetValue 30 ・・・◎
c.LetValue (30) ・・・×

なるほど・・・・と思ったのですが・・・

となると・・・自分が修正した引数を括弧で閉じたコードでも動くのがわからなくなってしまいました。

本来なら、サイトの立ち上げ者に質問すべきなのでしょうが、コメント欄がないのでそれはできないようです。

理由を教えていただけませんか?

失礼しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そこで疑問を持つなら

vba

1MsgBox c.GetValue

ここでもカッコついてないぞ…ってならないとオカシイですよね。

c.LetValue (30)

ここのカッコは引数のカッコではないです。
ただ計算の優先順みたいなやつです。

わかりにくいですが…vb.netとかは確か全部カッコ付きに統一されているはずです。

個人的な好き嫌いですが値をセットするならプロパティの方が好きです。

vba

1 2Public Property Let letValue(n As Long) 3 If n >= 1 And n <= 100 Then 4 Value = n 5 Else 6 Err.Raise vbObjectError, "Counter", "その値は設定できません。" 7 End If 8End Property 9

vba

1Sub CountUpSample() 2 Dim c As Counter 3 Set c = New Counter 4 ' こうなる 5 ' c.LetValue 30 6 c.letValue = 30 '----------------------この部分(質問者の追加コメント) 7 MsgBox c.GetValue 8 c.Up 9 c.Up 10 c.Up 11 MsgBox c.GetValue 12End Sub

投稿2018/03/11 02:10

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuo4465

2018/03/11 03:57

返答ありがとうございます >MsgBox c.GetValue >ここでもカッコついてないぞ…ってならないとオカシイですよね。 確かにそうですね。 VBAの文法について、細かいところがあいまいで、()のあるなし、値の引き渡し、呼び出しなど・・・文法にそって読み直し中です。 ありがとうござました
guest

0

ベストアンサー

vba

1c.LetValue (30)

の括弧は、演算の優先順序を指定する括弧で、
プロシージャの引数を指定する括弧とは異なります。

vba

1c.LetValue 1*(2+3)

の括弧と同じです。

プロシージャの引数なら間に半角空白が入りませんので、両者の括弧は別物だと分かります。

Subプロシージャの場合は正式には、

vba

1Call c.LetValue(30)

と記述しますが、Callを省略すると () も省略できます。つまり、最初のコードを省略せずに記述すると、下記になります。

vba

1Call c.LetValue((30))

Call キーワードを使用して、引数を必要とするプロシージャを呼び出す場合、argumentlist をカッコで囲む必要があります。 Call キーワードを省略する場合、argumentlist のカッコを外す必要があります。
Call ステートメント より引用


では、

vba

1c.LetValue 30 2 3c.LetValue (30)

の2つの違いですが、今回のように引数の型が決まっている場合は同じ意味になりますが、バリアント型の場合は、結果が異なる場合がありますので、注意が必要です。例えば、

標準モジュール

vba

1Public Sub Hoge(v As Variant) 2 3 Debug.Print TypeName(v) 4 5End Sub

フォーム上のテキストボックスのダブルクリック時

vba

1Private Sub テキスト1_DblClick(Cancel As Integer) 2 3 Hoge Me.テキスト1 '※1 4 5 Hoge (Me.テキスト1) '※2 6 7End Sub

テキストボックスに何か入力してから、ダブルクリックすると、イミディエイトには

TextBox String

と出力されます。前者(※1)は、テキストボックスオブジェクトしてそのまま引き渡されますが、
後者(※2)のように()で囲むと演算式として値を評価されますので、テキストボックスの規定値プロパティのValueが引数として渡されString型になります。

かっこを使用すると、優先順位をオーバーライドして、式のある部分を他の部分より先に評価させることができます。かっこの中の演算は、かっこの外の演算よりも常に先に実行されます。
演算子の優先度 より引用

投稿2018/03/11 01:45

編集2018/03/11 02:11
hatena19

総合スコア33605

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuo4465

2018/03/11 04:02

大変、参考になりました。 VBAはある程度、わかっているつもりでしたが、文法から解釈して読み始めると不明な部分が多く、基礎ができていないと、改めて感じました。 おっしゃるとおり、引数なら()の前にスペースはないはず・・・・・  基本に戻って再度VBAのコードを読み読み、カキカキしています  ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問