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」型のみです。
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でも入れなければ、メモリが不足するようなことはありません。
No.4
- 回答日時:
「変数」の宣言そのものは、コーディングのミスを防ぐためにも、是非行なっておきたいものですが、「データ型」の宣言は、今般の性能のよいパソコンでは必ずしも必要ではなくなったのかなぁと感じます。
型宣言を行なった場合と行なわなかった場合に処理速度などに明らかな違いが出る、あるいは、行なわなかった場合にはエラーが出る、というような具体的な例をお示しできないのが残念ですが、下記に面白い説明を見つけましたので、ご参考までにご覧ください。
パッと見、「型宣言はしなくてもよい」というような書きっぷりですが、そうではないと存じますので、飽くまでもご参考までに、ということでご覧ください。
●Excel VBA「変数」講座 - 型は覚えなくてもいい
http://pc.nikkeibp.co.jp/article/NPC/20070803/27 …
3ページありますので、ページ最下段の [2][3] をクリックして最後までザーッとご覧ください。
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="あああ"のほうが好ましいです。
No.2
- 回答日時:
こんにちは
明示的に付けた方がいいと思います。
元々コンピュータは、データ型など認識しません。
文字型であろうが論理型であろうが、整数型であろうが浮動小数点型であろうが..ただのビット列でしかありません。
型は人間がプログラムを開発しやすくするためにルールを作ってきたのに過ぎません。
型を明示しておくことでコンピュータにプログラムミスを見つけて貰う手助けをさせることができるし、処理の途中で異常終了として実行を停止することすら可能です。
これは、プログラムミスのために用途の違うデータを気づかずに何事もなかったように処理してしまい結果がとんでもないことになっていることに気がつかないといったことを防げます。
つまり、お金の計算をしているルーチンに文字列が投入されてそれを整数がとして処理してしまうなんてことが事前に防げるわけです。
関数は、何らかのデータ型を返すわけですから、上記の理由から宣言しておくべきですが、エクセルの場合はシステム側で宣言がない場合は Variant型と暗黙の型宣言をしてエラーとしない運用が出来ますんで利用者の選択の自由度が高いです。
個人的には、頻繁にプログラミングする使い捨てプログラムなら、緩いルールでもよしとする。たまにプログラミングするまたは信頼性の高いプログラムを作るならデバッグしやすい、型宣言を省略しない厳しいルールがお勧めです。
エクセルはルールに寛容ですが、すべての変数を明示的に型宣言するように強制する「Option Explicit」を使うことも出来ます。
ちなみにヘルプにこんな解説文が..
「数値をバリアント型 (Variant) で宣言した場合は、16 バイトのメモリを必要とし、他のデータ型を明示的に指定した変数よりも、アクセス速度がやや遅くなります。」
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) モードレスでユーザーフォームが開け(表示)ません。 4 2022/09/09 11:05
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Visual Basic(VBA) VBAでファイル名を指定して保存するとき 4 2023/03/26 21:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCPサーバ bind関数のエラーに...
-
式はメソッドではありませんと...
-
ソケット通信で同時受信の制限?
-
FileCopy時のエラー
-
C# try-catch でcatchに飛ばす方法
-
VB6でRDOに接続できない
-
VB6でのPL/SQLの実行について
-
CreateObject("Excel.Applicati...
-
Response.Redirectで引数2つの...
-
Tableを動的に増やしたい。
-
オラクル接続をopenしようとす...
-
EXECLマクロでshapeがグルーフ...
-
VBSからのサーバサイドのEXEの実行
-
CAsyncSocket::Create()がエラ
-
VBSからPDFファイルを開きたい...
-
エラー内容について
-
GridViewからテンプレートフィ...
-
ASP.NETで使用しているJavascri...
-
AutoPostBackにしているが、う...
-
Outlookで添付ファイルの有無を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 宣言Dimの場所
-
ソケット通信で同時受信の制限?
-
vbscriptの変数宣言
-
VBSにてサーバー中のエクセルフ...
-
VBSでIEを起動し、拡大率を変更...
-
名前が二重に定義されています
-
EXCEL VBA API宣言でコンパイル...
-
TCPサーバ bind関数のエラーに...
-
ACCESSのAutoKeysマクロでアク...
-
CreateObjectの同時実行時について
-
誰かVisualBasicのデータフォー...
-
式はメソッドではありませんと...
-
エクセル同一セル内の指定文字...
-
VBSについて
-
エクセルVBAで変数初期値を...
-
golang 空文字判定について
-
ハンゲーム
-
C# try-catch でcatchに飛ばす方法
-
FileCopy時のエラー
-
EXECLマクロでshapeがグルーフ...
おすすめ情報