変数の値を破棄する方法

このQ&Aのポイント
  • 変数の値を破棄する方法について知りたいです。特にデータ型で宣言した場合の正しい破棄方法を教えてください。
  • データ型で宣言した変数の値を破棄する方法を教えてください。
  • 変数の値を破棄する方法について詳しく教えてください。特にデータ型で宣言した場合の正しい破棄方法が知りたいです。
回答を見る
  • ベストアンサー

変数の値を破棄する方法

データ型で宣言した場合、 変数の値はどうやって破棄すればいいのでしょうか? 例えば、標準モジュールに Option Explicit Dim s As String Dim w As Worksheet Sub test() Set w = ActiveSheet s = "sss" MsgBox w.Name MsgBox s Set w = Nothing s = Nothing End Sub とした場合、 s = Nothingがエラーになります。 オブジェクト型で宣言したら、 Set ●= Nothing で破棄しますが、 データ型で宣言した場合の正しい破棄の仕方を教えてください。 今回の例は、モジュールレベルのdimステートメント で宣言しているため、プロシージャーが終わっても 値を保持しています。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

データ型の変数は、そういう意味では「破棄する」ことはできません。 ステップ実行しつつローカルウィンドウで変数の中身の推移を観察しながら勉強してみると理解しやすいですが、オブジェクト変数は最初に変数に値を格納するまではnothingが初期値です。オブジェクト代入後、改めてnothingを格納する事で、オブジェクトへのインスタンスを破棄したことになります。 一方データ型の変数(たとえばstring)は、変数が生まれたその瞬間から各データ型に応じた初期値で初期化されています。たとえばStringなら""です。 従って、敢えて言えばs = "" として初期値に戻すことで、それまで格納されていた値を「破棄」したと見ることはできます。

fasd132ewq
質問者

お礼

変数の値を破棄する方法 No.1 ステップを実行しつつ確認した所、仰る通り、 オブジェクト変数はNothing データ型は”” で始まってました。 データ型を破棄したい時は、 s = ""のようにします。 ありがとうございました。

関連するQ&A

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • なぜiは変数の値が保持されるのに、wは保持されない

    なぜiは変数の値が保持されるのに、wは保持されないのでしょうか? Sub test() Dim w As Worksheet Dim i As Long i = 1 For Each w In Worksheets i = i + 1 Next MsgBox i MsgBox w.Name End Sub -------------------------------------- を行うと、 MsgBox i は表示されるのに、 MsgBox w.Name は、 「オブジェクト変数または With ブロック変数が設定されていません。」になります。 wはオブジェクト変数だから、 For Each ステートメントを抜けると値が破棄されてしまうのでしょうか? でもvbaのヘルプの 「For Each...Next ステートメントの使い方」 を見ても 「ステートメントを抜けるとオブジェクト変数なら値が破棄されます」 と記載されていません。

  • 変数の使い方の注意点なんですが・・・?

    Windows XP Home Edition Excel 2002 当方は、まだ基本がしっかり頭に入っていないので、 勝手な疑問が出てきているようでございます。 まだまだ勉強中ですが、 下記コードの場合、動作はしますが、 変数 c の使い方は間違っているのではないですか? 4は、 同プロシージャ内なので、 変数 c と r というように、区別して記述しないといけないのではないかと思って いるのですが。 3は、 プロシージャが違うので問題はないと思っております。 Dim r As Range, s As Range と記載してもいいのでしょうか?   つまり、曖昧に、ごっちゃ混ぜにしてしまうと、エラー等、PCに支障をきたすことになって しまうのではないかと心配でございます。 また、こんな記述だと、エラー等、PCに支障をきたすことになって しまうという例を 1つか2つ(又はHP等) 教えて頂けると有り難いです。 初歩的な例で結構です。 全くの初歩的な(ざっくりな)お答えで結構ですのでよろしくお願い致します。 Sub てす1() Dim r As Range, s As Range   Set s = Cells(1, 1)   s.Select  MsgBox " A1 です " End Sub '------------------------ Sub てす2() Dim r As Range, s As Range   Set s = Cells(1, 2)   s.Select  MsgBox " A2 です " End Sub '------------------------ Sub てす3() Dim r As Range, s As Range   Call てす1   Call てす2  MsgBox "  A1とA2 です " End Sub '------------------------ Sub てす4() Dim r As Range, s As Range   Set s = Cells(1, 1)   s.Select  MsgBox " A1 です "   Set s = Cells(1, 2)   s.Select  MsgBox " A2 です "  MsgBox " A1とA2 です " End Sub

  • 変数に入った値を追加したい

    Access97を使用しています。SQLで変数に入った値を追加したいのです。 Dim strSQL, NO3, NO2 As String Dim i As Integer Dim db As DATABASE Dim SN As Variant If (C_Flag = 0) Then SN = 0 Else SN = 1 End If strSQL = "INSERT INTO 連続印刷 (Nフラグ" strSQL = strSQL & ") VALUES (" strSQL = strSQL & "', 'SN'" strSQL = strSQL & ")" Set db = CurrentDb() db.Execute strSQL Set db = Nothing End Sub 上記のようにすると、"SN"のデータが入ります。 'SN'をSNのようにすると、パラメータが少なすぎますと出てきます。 どうすれば、上記 0や1の値を取得することができるのでしょうか?

  • 変数で指定したセルの値を取得して計算させるには?

    sub 単月発生残高の取得() Windows("総勘定元帳データ").Activate Worksheets(1).Activate Range("a2").Activate Dim sRange As Range, eRange As Range, tRange As Range, uRange As Range Dim j As Long, k As Long Dim i As Integer For i = 3 To Range("a2").End(xlDown).Row Set sRange = Cells(i, 1) Set eRange = sRange.End(xlToRight) Set tRange = eRange.Offset(2, 0) Set uRange = tRange.Offset(0, -1) j= tRange.value k= uRange.value Range("B1").formula="=k-j" Range("A1").value="単月発生残高" Next Set sRange = Nothing Set eRange = Nothing Set tRange = Nothing Set uRange = Nothing End Sub 上記のマクロを組んでみましたが、j= tRange.value のところでエラーになります。 uRangeの値からtRangeの値を引いた値を"B1"に表示させたいのですが、うまくいきません。 どうすればいいでしょうか。

  • 変数の宣言(s As String)で良い理由

    vbaについてしつもんです。 標準モジュールで Option Explicit Dim s As String Sub test1() Call test2("qqq") End Sub Sub test2(s As String) MsgBox s End Sub としたのですが、もしかしてDim s As Stringって必要ないのでしょうか? あってもなくても動きます。 (s As String)があるからDim s As Stringは不要なのですか? だとしたら、(s As String)に dim や publicをつけなくて良い理由を教えてください。

  • 返ってくる値が違う

    VBAでフォルダの中のファイルの個数を取得するコードなのですが Sub test1() Dim i As Long, buf, Path As String Path = ActiveWorkbook.Path & "\" buf = Dir(Path & "*.*") Do While buf <> "" i = i + 1 buf = Dir() Loop MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & i & "個のファイルがあります。" End Sub Sub test2() Dim Path As String Dim i As Long, FSO As Object, f As Object Path = ActiveWorkbook.Path & "\" Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & FSO.GetFolder(Path).Files.Count & "個のファイルがあります。" Set FSO = Nothing End Sub Test1とtest2では返ってくる値が違うのですが なぜでしょうか? Test2はフォルダの個数も取得されてるのですか?

  • 変数の値について

    変数の値について教えてください。 VB2010 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim A As Single A = 2.0 MsgBox(A) End Sub 上記のプロシジャを実行するとメッセージボックスに2と表示され 2.0と表示しません。 2.0と表示させるには、どのようにすればよいなでしょうか。

  • 「オブジェクトの破棄」と「メモリの解放」は同じ意味

    「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* Sub Sample1() Dim objIE As Object Dim buf As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://oshiete.goo.ne.jp/" Do While objIE.busy DoEvents Loop Do While objIE.Document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub ********************************* の場合の「Set objIE = Nothing」は、 「オブジェクトの破棄」でしょうか? 「メモリの解放」でしょうか? どちらでもありますか? ご回答よろしくお願いします。

  • ADOでアポストロフィー入りの値をフィルタしたい

    例えばレコードの値が「あああ'ああ」だった場合、 ----------------------------------------------------- Sub test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim MyFileName As String MyFileName = CurrentProject.FullName cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & "Data Source= " & MyFileName rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic rs.Filter = "フィールド1 = " & "'あああ'ああ'" MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ----------------------------------------------------- とすると 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 になってしまいます。 ADOでアポストロフィー入りの値をフィルタする方法を教えてください。

専門家に質問してみよう