- ベストアンサー
(VBA) dim の疑問
初歩的な疑問ですが、 ネットを見ていたら、以下のように dimで「as double」のように「as」以下が明記されていないコードがありました。 この場合、明記しないと「valiant」になるのでしょうか ? そもそも、「valiant」になるなら 全て「Dim r」のように省略してしまえば データ形式に迷わずにオールマイティ的な利用方法が出来そうですが 不具合(まずいこと)が有るのでしょうか? Dim r For r = 2 To Cells(Rows.Count, "B").End(xlUp).Row
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
どうなんでしょうね…宣言してもな場合もありますが、型宣言している方が無難な気はします。 結果は希望通りですけど代入の時にエラーになってほしい感じです。 型宣言していないと結果は46で変だぞとなるので、してた方が良かったかどうかは?? Sub A() Dim A As String, B As String 'Dim a, b A = 12 B = 34 Range("A2").Value = A + B End Sub String指定してるのにVariantな感じで相手や演算子によって変わる Sub B() Dim A As String Dim B B = 4 A = Cells(Rows.Count, "B").End(xlUp).Row Cells(A, "C").Value = A & B Cells(A + 1, "C").Value = A + B End Sub 型宣言していないと オブジェクトとしても値としてもエラーにならない r = Range("A1") で r.Address がエラーになっても Setが必要と知らなければ何故エラー?状態かも Sub C() Dim r Set r = Range("A1") MsgBox r r = Range("A1") MsgBox r End Sub
その他の回答 (4)
- kkkkkm
- ベストアンサー率66% (1719/2589)
ちなみにNo4のコードで Dim a As String, b As String, i As Long と型まで宣言しているとエラーにはなりませんし、他の人にも文字列として考えているというのが伝わります。ただし、文字列ならa + bよりa & bが無難だと言われるかもしれません。(エラーにならないので他の人に見せるという事もないかもしれませんが)
- kkkkkm
- ベストアンサー率66% (1719/2589)
> Sub C() は、実行できませんでした。 マクロ一覧からだとグレーアウトなんですね・・・以前にそのような現象があるというのを目にした記憶がありますが、解決法の記憶がありませんm(__)m プロシージャ名を変えるか、グレーアウトの時に作成ボタンで新しく作るとモジュール別々で2個現れて実行できるようになります。 > 型宣言している方が間違いが起きる可能性が少なくなるので無難ですね。 だと思います。 たとえば、Aを複雑にした場合 Sub a() Dim a, b, i For i = 1 To 3 a = Cells(i, "A").Value b = Cells(i, "B").Value Cells(i, "C").Value = a + b Next End Sub A列B列の値によってエラーになったりならなかったりします。 このコードを掲載してエラーになります、結果がおかしいですとの質問で、本人が文字列の操作として考えていて、質問にはその旨記載がない場合に、一発で正解回答が出る確率は低いと思います。見た目は数値の操作とだと思われますから。
補足
>プロシージャ名を変えるか、 適当にSub Ctttt() に変えたら処理できました。 >グレーアウトの時に作成ボタンで新しく作ると >モジュール別々で2個現れて実行できるようになります Module1.C Module2.C の2個作成されました。 こんな現象もあるとの理解でメモしておきます。 (そんなグレーアウトの機会が有るか分かりませんが。。。)
- kon555
- ベストアンサー率51% (1842/3559)
>>「これは、Valiantnにしてはいけない」は有るのでしょうか? 無いと思っておいていいです。他の言語の学習や、集団での開発を考慮しない一般的なユーザーレベルなら特に。少なくとも、学習の優先順位は非常に低いです。 こんな風に言っている講師の方も居るくらいです。 http://officetanaka.net/excel/vba/variable/03.htm 変数型については理解が深まって余裕ができたり、必要になってから覚えるので充分です。
補足
提示いただいたURLの例で、初心者は 「型は覚えなくていい」 と述べています。 正しくも有りですが、 「バリアント型変数のデメリット」でSampleで挙げられている 実行結果が違う例は、そもそも初心者でも直ぐ気が付くレベルですが 実際は簡単には気が付かないレベルも有りそうで 本当に形が分からない以外は、ちゃんと型式を明示した方が良さそうです。
- kon555
- ベストアンサー率51% (1842/3559)
はい、型の宣言を省略すると自動的にvaliantなります。 殊更にまずい点というのはありませんが「valiant型はほんの少し処理が遅い」「オールマイティすぎて『文字列型で渡したいところを数値型で処理した』のようなエラーが発生し得る」というのがありますね。 個人的には2番目のデメリットがやや気になるので型宣言はするようにしています。
お礼
回答ありがとうございます。 >型の宣言を省略すると自動的にvaliantなります。 御意。 >「オールマイティすぎて『文字列型で渡したいところを数値型で処理した』 >のようなエラーが発生し得る」というのがありますね。 つまり、データ形式を指定しないでValiantにすると Excelが、型式を意図した型式とは受け取ってくれずに 勝手に他の型式で判断してエラーが出る事があるとの事だ思いますが マクロ初心者は、型式を設定するのが苦手なので迷うとVliantを使うことが有るのですが 逆に「これは、Valiantnにしてはいけない」は有るのでしょうか ?
お礼
kkkkkmさん、回答ありがとうございます。 サンプルのA,B,CのSub()の結果がおかしいのを 実際マクロを実行して確認できました。 型宣言している方が間違いが起きる可能性が少なくなるので無難ですね。 理由は分かりませんが、 Sub C() は、実行できませんでした。 添付画像を確認ください。 https://imgur.com/jQ30a36