Visual Basic の使いにくい点 ― 2018/02/10 08:45
最近、Excelを使って自動化する必要に迫られ、VBAを使ってプログラムを組んでいます。
VBAはVisiaul Basic for Applicationの略で、基本はVisual Basic 6.0のようです。
今となっては古い言語のため、色々と使いにくい点が目につきます。
■デフォルトがグローバル変数
まずはこれです。VBでは、変数は基本的にグローバル変数です。
そのため、親プロシージャーの変数を、それから呼ばれた子供のプロシージャーで意図せず変更してしまうという危険なことが起こってしまいがちです。
これを回避するためには、「忘れないように」一つ一つ変数をdim宣言してやる必要があります。
■デフォルトの引数が参照渡し
これも同様にどうかしている仕様です。
プロシージャー等の引数が参照渡しのため、そのままだと子供のプロシージャーで引数を変更すると、親の変数も変わってしまいます。
これを回避するには、「忘れないように」byval宣言する必要があります。
■複数の引数を括弧で囲む場合callが必要
しばし悩んだのが意味不明のエラー。原因は括弧を使って複数の引数を与えるプロシージャー呼び出し時にcallステートメントを忘れたことでした。
http://www.atmarkit.co.jp/ait/articles/1503/17/news039.html
どれもこれもC言語を使っていた人からすると、なしてこうなの、と思う点だと思います。
おそらくこれはいずれもおおもとのBASICに原因があると思います。
私が知っているBASICには、そもそもローカル変数なんてありませんでした。なので、グローバル変数がデフォルトでローカル変数として使いたい場合には宣言するという形になったのではないかと思います。
callステートメントはサブルーチンを呼び出すときの名残ではないかという気がします。で、後からfunctionが追加されて戻り値を使えるようになったと。
VBの場合、戻り値を使う場合には括弧で囲む、そうでない場合、つまりプロシージャーの場合は括弧を使わないというやり方がシンプルなのかもしれません。
msgboxに括弧を付けるか付けないかという話では、括弧はC言語では括弧演算子という演算子の一つだという事を忘れていました。
参照呼出しについても似たようなものかもしれません。
VBAは言語仕様はともかく、あの開発環境はどうにかならないのかと思っていました。言語仕様に手を付けるのは互換性の面から大変なのはよくわかりますが、開発環境位は改善できると思うのですが。
VisualStudioを使った後にVBAを使うと、なんなのこれは、と思います。(-_-;)
言語仕様面では、是非try catchを追加してほしい。on errorはいやです。
後は、変数名の後に、つい"."を打って、あれ、なんでインテリセンスが効かないんだ? となってしまうのも何とかなると嬉しい。
早く、VB.NET化しないかなぁ、と思っていたら、なんとPythonの導入が検討されているとか。
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1097447.html
VBAはVisiaul Basic for Applicationの略で、基本はVisual Basic 6.0のようです。
今となっては古い言語のため、色々と使いにくい点が目につきます。
■デフォルトがグローバル変数
まずはこれです。VBでは、変数は基本的にグローバル変数です。
そのため、親プロシージャーの変数を、それから呼ばれた子供のプロシージャーで意図せず変更してしまうという危険なことが起こってしまいがちです。
これを回避するためには、「忘れないように」一つ一つ変数をdim宣言してやる必要があります。
■デフォルトの引数が参照渡し
これも同様にどうかしている仕様です。
プロシージャー等の引数が参照渡しのため、そのままだと子供のプロシージャーで引数を変更すると、親の変数も変わってしまいます。
これを回避するには、「忘れないように」byval宣言する必要があります。
■複数の引数を括弧で囲む場合callが必要
しばし悩んだのが意味不明のエラー。原因は括弧を使って複数の引数を与えるプロシージャー呼び出し時にcallステートメントを忘れたことでした。
http://www.atmarkit.co.jp/ait/articles/1503/17/news039.html
どれもこれもC言語を使っていた人からすると、なしてこうなの、と思う点だと思います。
おそらくこれはいずれもおおもとのBASICに原因があると思います。
私が知っているBASICには、そもそもローカル変数なんてありませんでした。なので、グローバル変数がデフォルトでローカル変数として使いたい場合には宣言するという形になったのではないかと思います。
callステートメントはサブルーチンを呼び出すときの名残ではないかという気がします。で、後からfunctionが追加されて戻り値を使えるようになったと。
VBの場合、戻り値を使う場合には括弧で囲む、そうでない場合、つまりプロシージャーの場合は括弧を使わないというやり方がシンプルなのかもしれません。
msgboxに括弧を付けるか付けないかという話では、括弧はC言語では括弧演算子という演算子の一つだという事を忘れていました。
参照呼出しについても似たようなものかもしれません。
VBAは言語仕様はともかく、あの開発環境はどうにかならないのかと思っていました。言語仕様に手を付けるのは互換性の面から大変なのはよくわかりますが、開発環境位は改善できると思うのですが。
VisualStudioを使った後にVBAを使うと、なんなのこれは、と思います。(-_-;)
言語仕様面では、是非try catchを追加してほしい。on errorはいやです。
後は、変数名の後に、つい"."を打って、あれ、なんでインテリセンスが効かないんだ? となってしまうのも何とかなると嬉しい。
早く、VB.NET化しないかなぁ、と思っていたら、なんとPythonの導入が検討されているとか。
https://forest.watch.impress.co.jp/docs/serial/yajiuma/1097447.html
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
※投稿には管理者が設定した質問に答える必要があります。