• ベストアンサー

VBA 関数(Function) カッコの後のデータ型は必要?

Function あ() あ = "あああ" End Function Sub test3() MsgBox あ End Sub と、 Function あ() As String あ = "あああ" End Function Sub test3() MsgBox あ End Sub は同じ動作をするのですがやはり「As String」をつけたほうがいいのですか? ウォッチウインドウで確認すると 「As String」がないほうは「Variant/ String」型ですが あるほうは「String」型のみです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 あえて、一般という立場で書かせていただきます。 Function あ() As String あ = "あああ"  '←リテラル値 End Function これは、Function プロシージャですから、リテラル値で書くのは、一般的にはVBAのルール違反ですが、戻り値のデータ型は入れるほうがいいことは良いです。しかし、あまり厳密なことを行っても、VBAでは、小規模なものがほとんどでしょうから、細かいことを言うつもりはありません。そうしたほうがベターだというだけことです。 #4さんのリンク先の「型は覚えなくてもよい」を書いた田中亨氏は、VBAインスタラクターですから、そういうのかもしれません。内容はもっともで、入門時や初級で、最初から決めて掛かっても、結局はどうどう巡りしかねないのです。ただ、田中氏の書いている内容は、Microsoft の指導している内容とは、かなり違っている所がありますから、入門レベルの人は、その意味を誤解することがあります。 また、VB.Net や C言語では、最初、データ型をある程度決めておかないと、エラーが返ってきてしまうので書かなくてはなりません。コーディングでは、エラーが返ったら、その時点で直しても悪くはありません。 しょせんVB系だからという言い方をする人もいますが、データ型のキャスティングは、どの言語でもありますから、分からなければ、大きなものに設定しておくというのがよいです。下手に、Integer 型などして、どうしてエラーが発生するか、さっぱり分からないのでは、本末転倒です。まあ、バグの発生で、データ型の問題というのは、よほどの初心者でなければありえませんね。VBAでは、コードの中で、めまぐるしくデータ型が変わるものが存在しますが、それを読みきれるかどうか、ということが腕なのですが。 Excelの場合は、あまり、Function プロシージャを使いませんので、あえて、別に、ユーザー定義関数についても書かせていただきますが、中級レベルクラスまでは、明示的にデータ型をそれぞれ決めたほうが分かりやすいのですがが、上級レベルでは違います。 ユーザー定義関数の場合、あくまでも、ユーザー本意で作りますから、引数のデータ型等を、プログラマ側で、決めたりしません。戻り値は、特殊に関数以外は、Variant 型にします。戻り値のデータ型は、エラー値もひとつの値ですから、戻り値を一定に決めることはできません。引数も、概ね、Variant にして、内部で分岐させます。 引数には、パラメータ配列もありますので、Variant 型しか受けられません。ユーザー定義関数の処理は、処理速度が遅くなるとは言っても、よほど大量にならなければ、認知できるレベルにはありません。メモリの問題も、大量にユーザー定義関数を入れて、Volatileでも入れなければ、メモリが不足するようなことはありません。

noname#150929
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

 「変数」の宣言そのものは、コーディングのミスを防ぐためにも、是非行なっておきたいものですが、「データ型」の宣言は、今般の性能のよいパソコンでは必ずしも必要ではなくなったのかなぁと感じます。  型宣言を行なった場合と行なわなかった場合に処理速度などに明らかな違いが出る、あるいは、行なわなかった場合にはエラーが出る、というような具体的な例をお示しできないのが残念ですが、下記に面白い説明を見つけましたので、ご参考までにご覧ください。  パッと見、「型宣言はしなくてもよい」というような書きっぷりですが、そうではないと存じますので、飽くまでもご参考までに、ということでご覧ください。 ●Excel VBA「変数」講座 - 型は覚えなくてもいい http://pc.nikkeibp.co.jp/article/NPC/20070803/278742/?P=1  3ページありますので、ページ最下段の [2][3] をクリックして最後までザーッとご覧ください。

noname#150929
質問者

お礼

よく読んでみます!ありがとうございます。

すると、全ての回答が全文表示されます。
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.3

結論から言いますと、なくても動きますが、つけることを強く推奨します。 データ型の宣言ですが、Functionプロシージャーのみでなくすべての変数宣言部分で重要な問題です。 といいますのは、変数を宣言するときに、その変数は何を入れる変数であるかというのを指定するのが[As データ型]です。それを省略するとVariant型という「何でも型」になります。何でも型は一見便利そうに見えるのですが、値が代入されるたびにこれはString?Integer?Long?Date?どの型がいいのかなと内部的には考えています。[Variant/String型]というのは、「Variant型だけど中に入っているのはString型のものです」ということを示してます。また、他の変数へ代入して使用するときにも、この変数はSingle型だからSingleに変換しなければいけないと内部で変更するようになっています。 これだけだと、「なんて便利な機能なのでしょう。」となるのですが、ここに大きな落とし穴があるのです。ぱっと思いついた2個を書きますと、 1個目は、代入・使用するたびに変数を何型に変形してあげると相手の型にぴったり合うかな~と考える時間が増えるので、処理速度が必然的に遅くなります。 2個目は、相手の変数が違うものであってもそれに合うように強引に変換するので、勝手に小数点以下が切り捨てられていたり電話番号の頭の0が勝手に消えてしまっていたりと思わぬバグの原因になります。 1個目も多くの処理を行うときには見逃せない点なのですが、2個目は非常に重要な点です。バグの起こりにくい、またバグがあっても発見が早くなるプログラム作りをすることが大切です。 よって、できる限り変数・関数の宣言部分には型宣言を行いましょう。 余談ですが、プロパティーも可能な限り明示してあげましょう。どちらでも動作はするのですが、Range("A1")="あああ"よりもRange("A1").Value="あああ"のほうが好ましいです。

noname#150929
質問者

お礼

なるほど。ご回答ありがとうございます。

すると、全ての回答が全文表示されます。
  • A88No8
  • ベストアンサー率52% (835/1605)
回答No.2

こんにちは 明示的に付けた方がいいと思います。 元々コンピュータは、データ型など認識しません。 文字型であろうが論理型であろうが、整数型であろうが浮動小数点型であろうが..ただのビット列でしかありません。 型は人間がプログラムを開発しやすくするためにルールを作ってきたのに過ぎません。 型を明示しておくことでコンピュータにプログラムミスを見つけて貰う手助けをさせることができるし、処理の途中で異常終了として実行を停止することすら可能です。 これは、プログラムミスのために用途の違うデータを気づかずに何事もなかったように処理してしまい結果がとんでもないことになっていることに気がつかないといったことを防げます。 つまり、お金の計算をしているルーチンに文字列が投入されてそれを整数がとして処理してしまうなんてことが事前に防げるわけです。 関数は、何らかのデータ型を返すわけですから、上記の理由から宣言しておくべきですが、エクセルの場合はシステム側で宣言がない場合は Variant型と暗黙の型宣言をしてエラーとしない運用が出来ますんで利用者の選択の自由度が高いです。 個人的には、頻繁にプログラミングする使い捨てプログラムなら、緩いルールでもよしとする。たまにプログラミングするまたは信頼性の高いプログラムを作るならデバッグしやすい、型宣言を省略しない厳しいルールがお勧めです。 エクセルはルールに寛容ですが、すべての変数を明示的に型宣言するように強制する「Option Explicit」を使うことも出来ます。 ちなみにヘルプにこんな解説文が.. 「数値をバリアント型 (Variant) で宣言した場合は、16 バイトのメモリを必要とし、他のデータ型を明示的に指定した変数よりも、アクセス速度がやや遅くなります。」

noname#150929
質問者

お礼

遅くなるのは嫌ですー ありがとうございます。

すると、全ての回答が全文表示されます。
  • abc_cgi
  • ベストアンサー率0% (0/1)
回答No.1

やっぱり、つけましょう。

noname#150929
質問者

お礼

そうですか。ありがとうございます。

すると、全ての回答が全文表示されます。

専門家に質問してみよう