VBA初心者です。
変数っていうのはその用途に合わせて方を宣言しますよね。
例)Dim r As Integer

ですが稀に型が無い宣言があります。
例)Dim r

そういうのはどういう時に使用するのですか?
また、どういう風に解釈されるのでしょうか?

A 回答 (2件)

Variant 型になります。



予期せぬ結果をまねくこともありますので、なるべくきちんと宣言した方が
いいと思います。
    • good
    • 0
この回答へのお礼

有難うございます。
謎が一つ解けました。

お礼日時:2005/04/11 23:27

下記が参考になると思います



参考URL:http://www.asahi-net.or.jp/~ef2o-inue/
    • good
    • 0
この回答へのお礼

早速拝見させてもらいました。
こういう初歩的な事を教えてくれるサイトを探していたんです。
頑張って勉強します。

お礼日時:2005/04/11 23:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QExcel VBAで、セルに入ってるデータ型を調べる方法は?

現在、Excel VBAでプログラムを作成しています。

Do Until ~ Loop の終了条件を
アクティブセルに入っているデータの型が文字列型の時
としたいのですが、そのようなことは可能なのでしょうか?

可能だとしたら、どのように記述したらいいのでしょうか?

当方のPCは
Win XP、Excel2003
です。

よろしくお願いいたします。

Aベストアンサー

VarType 関数を使うとか。

Sub SampleProc()

  Dim i As Long
  
  i = 1
  Do While Len(Cells(i, "A").Value) > 0
    If VarType(Cells(i, "A")) = vbString Then
      Exit Do
    Else
      ' // 処理
    End If
    i = i + 1
  Loop
  MsgBox CStr(i) & "行目で停止"

End Sub

Q変数の宣言の名称を教えてください。(Dim i As Long)

Dim i As Longについて

「dim」→?
「i」→変数名
「As」→?
「Long」→変数の型

というように、dimとAsがなんと言えばいいのかわかりません。
アドバイスよろしくお願いします。

Aベストアンサー

>「i」→変数名
という形と合わせるのなら、以下のような感じでしょうか?
(意味についてのご質問ではないと受け取りました)

Dim・・・ステートメント
     変数の(型)宣言に用いる
AS・・・・キーワード
     変数や関数の型を示したり、フォルダ(やファイル)名を
     示したりするのに用いる

QVBAでオブジェクト変数にsetしたシートがactiveかどうかを調べるには?

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nValue as integer)
  xxxxxx ←ここでoSheetAがActiveならやりたいことがある。
  oSheetA.Cells(nRow, nCol) = cValue
End Sub

具体的には、複数のBookを開いている状態で、Activeシートが何であるかはオペレータの操作次第なので固定化できない状態で、SetValueが呼び出されたとき、oSheetAがActiveだったら、値をセットするセルが見えるようにセルをActivateかスクロールさせたいんです。

標準モジュールの冒頭でワークシート用のオブジェクト変数を確保し、
あるタイミングで、あるシートをそのオブジェクト変数にSetしています。

で、そのシートに値をセットするときに、そのシートがActiveだった場合だけやりたい処理があるのですが、Setしてあるオブジェクト変数だけを見てそのシートがActiveか否かを判断する方法って、あるのでしょうか。

コード例)
Private oSheetA as Worksheet

Sub SetSheet(sName as String)
  Set oSheetA = worksheets(sName)
End Sub

Sub SetValue(nVa...続きを読む

Aベストアンサー

Option Explicit

Private oSheetA As Worksheet

Sub SetSheet(sName As String)
Set oSheetA = Worksheets(sName)
End Sub

Sub SetValue(nValue As Integer)
If oSheetA Is ActiveSheet Then
MsgBox ("hoge")
End If
oSheetA.Cells(1, 1) = nValue
End Sub

Sub Main()
SetSheet ("Sheet1")
SetValue (5)
End Sub

'実行できるようにソースは変更していますが,
'こんな感じでIs演算子で同じオブジェクトか比較してみるってのはどうでしょう?

QAccessVBAで「dim dbs as database」がエラーになる

済みませんが、非常に基本的なことを聞かせていただきたいと思います。

AccessのVBAで関数を実行すると、いきなりエラーになりました。
dim dbs as database の文でエラーになり、「コンパイルエラー ユーザ定義型が定義されていません」というエラーメッセージが出ました。
databaseが定義されているような感じです。

どうすれば宜しいでしょうか?

Aベストアンサー

こんにちは。maruru01です。

VBEの画面のメニューの[ツール]→[参照設定]で、

「Microsoft DAO X.X Object Library」(X.Xはバージョン)

の項目にチェックが入っていますか?

ちなみに、DatabaseオブジェクトはDAOしかないのでいいですが、Recordsetオブジェクトなどは、ADOとDAOの両方にあるので、

Dim rs As DAO.Recordset

のように、どちらかを明確に記述しないといけません。
統一的で分かりやすいコーディングのためには、Databaseオブジェクトも、

Dim dbs As DAO.Database

のように記述するように心がけましょう。

QVoidポインタで受け取った変数の型を調べる方法

あるライブラリの関数を利用しようとしたのですが、その関数の引数にVoidポインタがあり、どういう型のデータを格納したのかわかりません。このポインタのアドレスに格納されたデータの型を調べる関数なり方法なりというのはあるのでしょうか。

Voidポインタというのは型を問わずに受け取れるというのは利点ですが、受け取ったものがあらかじめなんだかわからない場合はどうするのでしょうか。よろしくお願いします。

Aベストアンサー

★基本的に調べようがありません。
・『void』ポインタはアドレス情報のみを受け渡しますので、型のサイズまでは分かりません。
 逆に言えば、型のサイズが分からないから『汎用ポインタ』と呼べるのです。
・あるライブラリの関数とは何?→どんな関数か分かりませんので、これ以上はアドバイス無理!
 ただ、C言語の qsort などでは比較用の関数で『void』ポインタを受け取りますが、その関数内で
 渡されたデータの『型』を指定します。→ポインタの形でキャストします。
 この比較用の関数は自前で用意する関数ですので、ソートするデータの型が分かっています。
 でも、ソートするデータ型が複数ある場合は、比較用の関数を複数作って切り替えます。
・あと関数に型を表す引数があれば、それを見て判断できますが、そうでない場合は『void』ポインタで
 渡される前の『型』の調べることは不可能です。→言語仕様より。
・以上。参考に。→一応、あるライブラリの関数とは何?

Q記録マクロは分かるのにDim(変数)が入ると分からない

 マクロ初心者です。記録マクロで色んなファイルを作り、活用は出来ているのですが、データーの増減、条件判定などが入ってくると必ず、Dim〇〇の記述が入ってきます。
 記録マクロのコード記述を読んで大体は読めるのですが、Dimになるとサッパリ分からなくなります。

 私にはこのDimが変数、代入と言うことは分かるのですが、では『具体的にこうなんだ、こうなるんだ』ということが理解できません。変数宣言を強制していません。

 過去のこのカテの類似質問を拝見しましたが、今一、理屈が分かっておりません。

 変数型マクロのサンプル例でこの辺を詳しく解説しているサイトをご存知でないでしょうか?
 VBA構文と日本語記述解説を対比して解説してあると分かり易いと思うのですが、書籍も探しています。
ご存知の方、教えていただけないでしょうか?

Aベストアンサー

こんにちは。

ご質問の趣旨は、変数型の宣言ということと解釈してよろしいですか?回答されている中には、変数の有無を述べた方もいるようですから。

1960ken様は、もう、かなりVBAは、経験されている方のはずですから、「変数の型の宣言」の必要性を考えるのは、上達してきた証拠でしょうね。私も、少し考え直してみました。僭越かもしれませんが、1960ken様のVBAに対するアプローチの仕方に少し問題があるかもしれません。

最初に、「変数宣言を強制(Option Explicit)」は、コーディングの際に入力ミスを減らすという目的だけです。間違えれば、エラーが出るか、目的の値が取れないだけです。本来、変数を宣言するというのは、使用中のメモリを減らすことにあります。

次に、「変数の型の宣言」(Dimステートメントなど)が本当に必要になるのは、中級から上級に掛けてで、ここの掲示板に出で来るコード10のうち9までは、変数の型の宣言は必要がありません。Basic系の言語は、あまり変数型をとやかく言っても、「自動キャスト」がありますから、いわばルール無用の世界です。何でもあり、なんです。
(「自動キャスト」というのは、データから自動的に適当な型に割り振ってしまう機能)

しょせん、ある程度上達してくると、みなさん、どうでも良くなります。型の宣言の必要性は、もう少し上のクラスの話です。しかし、変数自体が分からないのでしたら、自分でお金を払った初級レベルのExcelマクロの本を読んでみるしかありません。

とはいえ、多くの人が、日付文字列を平気で、Date型の変数に入れたり、文字列を、そのまま平気でRangeの引数にしてみたり、まあ、危なっかしいことを見せられるのが常です。そのレベルでは、逆に、「型の宣言」などしないほうがよいかもしれません。ひどい例では、プロパティ名を変数名にする人間がいますが、そんなことをしたら、ひとつのプロジェクト全体に影響してしまいます。

VBAには、VBにはない、独特の特徴があります。
しかし、そういうことを言ったところで、PC自体のスペックがあがるにつれ、問題が表面化しなくなり、「コードが通れば、文句あるか! 」と、逆切れされるのがオチで、しょせん、こういうのは、他人がどうこういうことではないかもしれません。ただし、基本が分かっていない人は、必ずミスします。(以下にある「VBA コードを最適化する」を参照)

初級のVBAですと、大雑把に言って、Long型とString型とObject型(Object型は、固有の変数型 例、Worksheet, WorkBookなどなら、なお良い)の三つでほとんどをカバーします。初級レベルのコードでは、単に格好付けだけで、何の意味もありません。

一応、簡単な割り振りの仕方を教えておきます。

例えば、Dim A とだけ入れて、As ○○を入れない変数が、ローカルウィンドウの中で、Variant/Range としたら、それは、As Range に割り振っておけばよいのです。Variant/Doubleと出たら、As Doubleとしておけばよいです。(注意:オブジェクト型すべてを、そのように割り振りはできないこともあります。)

書籍では、『かんたんプログラミンシリーズ Excel VBA 基礎編』(技術評論者)の第9章、「変数を理解しよう」に説明があります。(私の持っている本は、Excel 2002用です)。それ以上に詳しい説明は、井川はるき さんの『Excel VBAプロの技』(ナツメ社)の第1章に出てきますが、文章が冗長なので、多少読みにくい点があります。 後者は、一通りVBAがすべて分かっている人向けです。

本を読んだら、実際に、自分の指で、VB Editor画面に文字を入れてみて、それを、F8を押して、ステップインで動かしてみるのが一番です。語学学習と同じで、機械仕掛けで翻訳した英文が、正しいとは言えません。それを覚えたところで役に立ちません。基本文法を学び、その構文に自分の言葉を入れて応用してみるしか手がないと思います。ある程度のレベルになると、その人のコードで性格さえ判ります。

サイトというなら、MSDNライブラリを読んでみる価値はあると思います。一般サイトは、しょせん、どこかを書き写しているのがほとんどです。この内容は、現行VBAの原則です。

「VBA コードを最適化する」
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deconoptimizingvbacode.asp

○変数の宣言が必要とされる代表的なサンプル
'(初級では出てきません)

''「なぜ、Currency型でなければならないか?」
'浮動小数点丸めに対しては、以下のような変数で防ぎます。
'ただし、数値リテラル値を直接入れるのは実務上はありません。
'これは、時間の計算、小数点が発生する演算、循環小数などに用いられます。
'実務では、金銭上の計算を用いるときに使われます。
'なお、必ずしも、「浮動小数点丸め誤差」が発生するわけではありません。

Sub BadSample1()
Dim ret As Double
 ret = 0.5 - 0.4 - 0.1
 MsgBox ret 'CStr(ret)
End Sub
'---------------------------------------------
Sub Sample2()
Dim ret As Currency
 ret = 0.5 - 0.4 - 0.1
 MsgBox ret 'CStr(ret)
End Sub
'---------------------------------------------
'または、
Sub Sample2a()
Dim ret As Double
 ret = 0.5 - 0.4 - 0.1@ 'Currency型
 MsgBox ret 'CStr(ret)
End Sub

'データ型の精度の違うものの比較
''「なぜ、違うと出るのか?」

Sub Sample3()
Dim a As Double
Dim b As Currency
Dim c As Double
Dim msg As String
 a = 49.8 - 12.1
 b = 49.8 - 12.1 'Currency型
 c = b '型を低精度にキャストしてしまったミス
If a <> c Then
  msg = "違う " & a - c
 Else
  msg = "同じ"
 End If
 MsgBox msg
End Sub

これは、隣接しているから分かりますが、離れてしたり、加筆していったりすると、分からなくなります。数値を比較する時や、他の型にキャストする時は、明示的に行う場合は除いて、自動キャストした場合、別の値に変わっていることがあります。(浮動小数点丸め誤差といいますが、小数点以下が入った数値の演算は、約半分ぐらいが、発生することがあります。上記の数値の組合せは、浮動小数点丸め誤差が発生します。)
(「明示的」というのは、VBAなどで良く使われる言葉で、意図して行うこと<->「暗黙的」)

 Mod 演算子など、Long型以上の精度を出力しない場合は、Long型以上の精度を持ったデータ型を用いても、精度は上がりません。求める値が何か、ということが、ここでは読み取れません。

Sub Sample4()
Dim a As Currency
 a = (49.8 - 12.1) Mod 4
 MsgBox a '実際は、Currency型の精度は出ていない
End Sub

Sub Sample5()
'修正例(私案)
Dim a As Currency
Dim b As Long
Dim c As Long
Dim d As Double
 a = 49.8 - 12.1 '浮動小数点誤差が発生する組合せ
 b = CLng(Fix(a * 10)) '小数点固定法
 c = b Mod 40
 d = c / 10
 MsgBox d 'CStr(d) 'Long型に戻すのも可
End Sub

上級では、Win32 API関数やBinaryコードを扱う場合に、どうしても、決められた変数(型)が必要になります。内容は割愛します。コードは、この板で実際にあった話を元にして作ったもので、十分に検証したつもりですが、私個人、この問題を明確に割り切れているわけではありません。一種の原則的なルールとして覚えていくほうが無難です。

参考URL:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/modcore/html/deconoptimizingvbacode.asp

こんにちは。

ご質問の趣旨は、変数型の宣言ということと解釈してよろしいですか?回答されている中には、変数の有無を述べた方もいるようですから。

1960ken様は、もう、かなりVBAは、経験されている方のはずですから、「変数の型の宣言」の必要性を考えるのは、上達してきた証拠でしょうね。私も、少し考え直してみました。僭越かもしれませんが、1960ken様のVBAに対するアプローチの仕方に少し問題があるかもしれません。

最初に、「変数宣言を強制(Option Explicit)」は、コーディングの際に入力ミス...続きを読む

QVBAでテキストファイルの件数を調べる方法

Access2000のVBAで関数を使用して
ファイルのパス名、ファイル名を指定すれば、
テキストファイルの件数を検索し変数に返す
関数はありませんか?
   
通常テキストファイルを開き1件1件カウントを
取っていけば件数を知ることは可能ですが、
数千レコードのテキストファイルが複数個存在
する場合処理スピードが遅くなるため何か
最適な関数はありませんか?
よろしくお願い致します。

Aベストアンサー

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

参考URL:http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm,http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/l

こんにちは。maruru01です。

No.2の方のFileSystemObjectを利用する方法です。

行数 = CreateObject("Scripting.FileSystemObject").OpenTextFile(ファイルのフルパス, 8).Line

複数のファイルをカウントするなら、ファイルでループを回せばいいでしょう。

あと、FileSystemObjectの参考ページを紹介しておきます。

http://www.bcap.co.jp/hanafusa/VBHLP/FSOme.htm

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/jsobjFileSystem.asp

...続きを読む

QACCESS2007で変数の宣言を強制するには

宜しくお願いします。

ACCESS2007 VBAのコーディングをしています。
うっかり変数のスペルを間違えると暗黙の宣言と解釈し、実行はされます。
当然のことながら期待通りの結果は得られません。
このうっかりミスを回避するため ACCESS2000では「変数の宣言を強制する」
の設定ができたのですが
ACCESS2007では どのようにしますか

Aベストアンサー

このPCにインストールしてあるのは2003と2007なので、2000の確認はできて
いませんが(汗)

> ACCESS2000では「変数の宣言を強制する」の設定ができたのですが
> ACCESS2007では どのようにしますか

多分、ほんのちょっとした記憶違いをされているだけだと思いますので、或いは
既に自力でたどり着かれた後かもしれませんが、「変数の宣言を強制する」の
設定は、『Accessのオプション』ボタンや『リボン』からではなく、
『Visual Basic Editor(VBE)画面のメニュー』から、です。

ですので、20003でも2007でも(そして恐らく2000でも)、その設定場所は
変わっていないものと思います。
(VBEのメニューから、「ツール(T)→オプション(O)」を選択して開く『オプション』
 ダイアログの『編集』タブに、「変数の宣言を強制する(R)」の項目があります)

QVBAで他のプログラムが起動しているか調べる方法

VBAで
D:\test\test.exe
が起動中か調べたいのですが
どのようにすれば良いですか?

http://www.vbalab.net/vbaqa/data/access/log/tree_532.htm

このページの方法を使えば、
exe以外のファイルが使用中かは調べることができたのですが
exeファイルの場合にはうまくいきません。

良い方法があれば教えてください。

Aベストアンサー

残念ながら・・・出来ません。
一応、プロパティの中に Handle ってのがあるのですが
取得できるのは ProcessID の値です。
以前、調べていて Handle を見つけた時は、
『やったー \(^o^)/』と思いましたが
ぬか喜びでした。。。orz

なお、当方の環境は、Windows7 Pro & Office2010 です。

Q標準モジュールにpublicで宣言するしかない?

フォームモジュールと標準モジュールで同じ変数を使って値を行き来したい場合、
標準モジュールにpublicで宣言するしかないのでしょうか?

【フォームモジュール】
Private Sub cmd_コマンド0_Click()
test = "aaa"
Call 標準モジュールtest
End Sub

【標準モジュール】
Public test As String
Sub 標準モジュールtest()
MsgBox test
End Sub

でいいのですか?

Aベストアンサー

> 標準モジュールにpublicで宣言するしかないのでしょうか?

例えば、「自身のPath」のように実行後の変動がないものや、
「ファイルのプロパティ」のように呼出元によらず共通になるもの
などは、「標準モジュールにPublicで宣言」でいいと思いますが、
「ある処理の開始時間と終了時間」のように【都度変化する
値】のような場合は「SubやFunctionの引数として渡す」という
方法を採った方がよいかと思います。
(そうした方が、「うっかり古いままの値を使用してしまった」と
 いった失敗を防げる、と)

この場合、「フォームモジュールのSubの中」と「Subの引数」の
2箇所で、同じ値を受け取る変数を宣言することになります。
(もしくは、下で「または~」としたように、フォームモジュール側での
 変数宣言はせずに、引数に直接記述)

【フォームモジュール】
Private Sub cmd_コマンド0_Click()
  Dim test As String
  test = "aaa"
  Call 標準モジュールtest(test)
  'または、変数「test」は宣言せずに文字列を引数に直接記述
  'Call 標準モジュールtest("aaa")
End Sub

【標準モジュール】
Sub 標準モジュールtest(test As String)
  MsgBox test
End Sub

> 標準モジュールにpublicで宣言するしかないのでしょうか?

例えば、「自身のPath」のように実行後の変動がないものや、
「ファイルのプロパティ」のように呼出元によらず共通になるもの
などは、「標準モジュールにPublicで宣言」でいいと思いますが、
「ある処理の開始時間と終了時間」のように【都度変化する
値】のような場合は「SubやFunctionの引数として渡す」という
方法を採った方がよいかと思います。
(そうした方が、「うっかり古いままの値を使用してしまった」と
 いった失敗を防げる、と)

この...続きを読む


人気Q&Aランキング

おすすめ情報