VBAでコレクションの要素を一括削除する方法とは?

このQ&Aのポイント
  • VBAでコレクションの要素を一括削除する方法について調べています。掲載されているコードでは、Nothingを代入しないままNewを使用していますが、これは問題ありませんか?
  • VBAのコードでコレクションの要素を一括削除する方法について調べていますが、詳しい情報が見つかりませんでした。コードに関する情報が載っているサイトなどを教えていただけますか?
  • VBAでコレクションの要素を一括削除する方法について調べています。掲載されているサンプルコードでは、Nothingを代入しないままNewを使用していますが、これは一般的な方法です。詳しい情報は見つかりませんでしたが、問題なく使用できると考えられます。
回答を見る
  • ベストアンサー

Nothingを代入しないままNew

VBAでコレクションの要素を一括削除する方法として、下記のコードが掲載されていましたが Nothingを代入しないままNewを使用しても問題ないでしょうか。 また、この辺りの挙動について詳しく書かれているサイトがありましたら、ご教示頂ければ幸いです。 Dim fruits As Collection Set fruits = New Collection With fruits Call .Add("バナナ") Call .Add("リンゴ") Call .Add("ミカン") End With Set fruits = New Collection

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

VBAのメモリ解放は『ガベージコレクション』任せなので、メモリリークの心配はナイです。 基本的に、Nothingの代入は必要ありませんよ。 ・ガベージコレクション@wikipedia http://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3 ・VBのオブジェクト解放@MSDN http://msdn.microsoft.com/ja-jp/library/cc440884.aspx C言語とかやるなら、"とにかく解放する"癖つけとくのも良いですが。

popporunga
質問者

お礼

ご回答ありがとうございます。 VBAにもガベージコレクションのような機能があったのですね。

関連するQ&A

  • Collectionによる多次元配列

    VBAでCollectionを二つ使用し、 値が入ったCollectionをもう片方のCollectionに入れて2次元配列のようにしたいのですが、 やり方がいまいちわかりません。 確か昔にそういった使い方をした記憶があるのですが、 ネットで調べてもみかけないので困っています。 Dim colA As Collection Dim colB As Collection Set colA = New Collection Set colB = New Collection colB.Add ("A") colB.Add ("B") colB.Add ("C") ※ colA.Item(1) = colB. Set colA = Nothing Set colB = Nothing 上記の※の箇所をどうすれば入れられるのでしょうか。 宜しくお願い致します。

  • イメージコントロールの代入を簡単にしたい。

    エクセル2003のVBAで次のイメージコントロールの代入処理をループや配列などを使って簡単にしたいのですが出来ますでしょうか? Dim photo As New Collection photo.Add Item:=Image1 photo.Add Item:=Image2 photo.Add Item:=Image3 photo.Add Item:=Image4 photo.Add Item:=Image5 photo.Add Item:=Image6 photo.Add Item:=Image7 photo.Add Item:=Image8 photo.Add Item:=Image9 photo.Add Item:=Image10・・・以下は~image26まで続いています。以下省略。image1~26はイメージコントロールです。

  • エクセルのVBAについて

    エクセルのVBAに関することです。 例えば、50個のリストがあり、そこからランダムに10個選び出す。そのランダムに選び出す手順を10回繰り返す。ランダムに選んだ10セットをシートに書き出すやり方を教えてください。よろしくお願いします。 リスト        結果            1セット    2セット    3セット   ・・・・・・・ 10セット りんご       みかん     りんご    梨             キウイ   みかん       梨       バナナ    パイナップル      みかん 梨          いちご    みかん    キウイ          バナナ バナナ        :        :        :             : パイナップル       キウイ いちご ・ ・ ・ のような感じです。

  • SetとNothingの存在意味?

    数値とオブジェクトの変数セットはそれぞれ、 Dim num as integer num = 5 Dim obj as Object set obj = new From set obj = Nothing ですが、 オブジェクトの場合でインスタンスを生成しない、単なる参照?別名? の場合はNothingは不要でしょうか? Dim obj as Object For x = 1 to 10 set obj = Form2 ' newとインスタンスを生成するのではなく、単なる参照  obj.Caption = str(x) & "回目" 'set obj = nothingは不要? Next x

  • 「New」はつけた方がいいのでしょうか?

    vbaなのですが、 FileSystemObjectでドライブの情報を取得したりファイル操作をしているのですが FileSystemObjectを宣言する時は、 Dim myFSO As New FileSystemObject にしたほうがいいのか、 Dim myFSO As FileSystemObject でいいのか教えてください. Sub Sample() Dim myFSO As New FileSystemObject Dim Drv As Variant Dim buf As String Set myFSO = CreateObject("Scripting.FileSystemObject") For Each Drv In myFSO.Drives Debug.Print Drv.DriveLetter Next Drv Set myFSO = Nothing End Sub 上記のコードは、newを付けても付けなくても結果は変わりませんでした。 よろしくお願いします。

  • 複数選択可能なリストボックス

    Excel VBAの質問をさせてください。 シート(sheet1)のA列、セルA1から以下のデータがあるとします。 みかん りんご バナナ 苺 梨 バナナ バナナ みかん フォームのリストボックスで"みかん"と"バナナ"を選択した際、シート(sheet2)のセルA1にコピーしていきたいのですが機能しません。 単品、"みかん"だけを選択しても何もコピーされません。 どこがいけないでしょうか?? Private Sub UserForm_Initialize()   With ListBox1     .AddItem "みかん"     .AddItem "りんご"     .AddItem "バナナ"     .AddItem "苺"     .AddItem "梨" .MultiSelect = fmMultiSelectMulti   End With End Sub Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 8 If Worksheets("Sheet1").Cells(i, "A").Value = Me.ListBox1.Value Then Worksheets("Sheet1").Cells(i, "A").Copy Worksheets("Sheet2").Cells(i, "A") End If End Sub

  • VBAで、エクセルからワードへの変換について

    VBAは、全くの初心者で、テキスト等のサンプルコードを参照して書いているのですが 期待通りの動きをしないので、教えてください。 やりたい事は、Excelファイル(A-Fカラム、400行程度)を 1行ページのワードに変換し、400枚のワードファイルを作成します。 その際に、添付画面のように、各カラムを、タイトル、連番、内容などと区分けをして フォントも変えたいです。 下のコードでは、転送は、出来るのですが、1行1ページにならず、また、 エクセルの枠も転送されてしまいます。 ワードVBAも試したのですが、特定文字での検索が難しく、各ページでの 改行位置が異なるため、自分の理解では出来ませんでした。 ワードでテンプレートを作って、Excel VBAから差込になるのでしょうか? よろしくお願い致します。 Sub CopyExcelDataToWord() Dim wsSource As Excel.Worksheet Dim cell As Excel.Range Dim collUniqueHeadings As Collection Dim lngLastRow As Long Dim i As Long Dim appWord As Word.Application Dim docWordTarget As Word.Document Set wsSource = ThisWorkbook.Worksheets(1) With wsSource lngLastRow = .Range("A" & Rows.Count).End(xlUp).Row Set collUniqueHeadings = New Collection For Each cell In .Range("A2:A" & lngLastRow) On Error Resume Next collUniqueHeadings.Add Item:=cell.Value, Key:=cell.Value On Error GoTo 0 Next cell End With Set appWord = CreateObject("Word.Application") With appWord .Visible = True Set docWordTarget = .Documents.Add .ActiveDocument.Select End With For i = 1 To collUniqueHeadings.Count With wsSource .Range("A1").AutoFilter Field:=1, Criteria1:=collUniqueHeadings(i) .Range("A1:D" & lngLastRow).Copy End With With appWord.Selection .PasteExcelTable linkedtoexcel:=False, wordformatting:=True, RTF:=False .TypeParagraph End With Next i For i = 1 To collUniqueHeadings.Count collUniqueHeadings.Remove 1 Next i Set docWordTarget = Nothing Set appWord = Nothing End Sub

  • VB.NETでのnothing の意義について

     VB.NET(.NET環境)ではガーベジコレクションがあるので、オブジェクトの解放はそれほど気を使わなくても良いようですが、やはり明示的に解放したいときがあります。  例えば下記のようにオブジェクトを解放してから確保したいときなどです。 objMyFile As clsMyFileClass = New clsMyFileClass("SAMPLE1.TXT") objMyFile.Write("TEST") objMyFile = Nothing ←ここで解放したい objMyFile = New clsMyFileClass("SAMPLE2.TXT") objMyFile.Write("TEST")  このクラスの Finalize でファイルクローズするようにした場合、Nothing を代入しても Finalize が実行されないようです。  また、GC.Collect()を使用すると他のオブジェクトのコレクションも実行されるので、ちょっと大げさな感じがします。  Open と Close メソッドを追加すれば解決しますが、せっかくなので New と Finalize で処理するようにしたいです。なお、VB.NET 2003なのでUsing も使えません。

  • マクロの改ページの追加について。

    下記コードに、E列を上から見て値が変わったら改ページ、を追加したいのですが、上手くできません。 A列、D列のみの下記コードでは成功します。 ちなみにE列は日付なんですが、A列D列同様にコードを書き足すだけではダメなんでしょうか?? 以前こちらで質問させて頂いて、回答を頂いたコードで、私自身完璧に内容を理解できていないので、追加の仕方もわからない状況です。 よろしくお願い致します。 Sub test() Dim rng As Range Dim objA As New Collection Dim objD As New Collection Dim strA As String Dim strD As String Dim blnBreak As Boolean ' 改ページを全て解除 Activesheet.ResetAllPageBreaks Activesheet.PageSetup.PrintArea ="$A:$K" For Each rng In Range("A:A") strA = CStr(rng.Value) strD = CStr(rng.Offset(0, 3).Value) ' コレクションに追加(同じデータはスキップする) On Error Resume Next objA.Add strA, strA objD.Add strD, strD On Error GoTo 0 If objA.Count = 2 Then ' A列の 2つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else If objD.Count = 4 Then ' D列の 4つ目のコレクションで改ページ blnBreak = True ' コレクションをリセット Set objA = New Collection Set objD = New Collection objA.Add strA, strA objD.Add strD, strD Else blnBreak = False End If End If ' 改ページ挿入 If blnBreak Then Activesheet.HPageBreaks.Add rng End If Next End Sub

  • [性能改善]AccessのDBに大量のデータをUpdateする場合の性能対策について

    初めまして。 早速質問なのですが、VB(6.0)でmdb(Access2000)のDBを更新する処理を作りました。 DAOを用いて(初めて使います)以下のような構文を作ったのですが、 性能がぱっとしません。 何か下記のソースをいじることで性能が改善するような手立てはありませんでしょうか? ---------------------------------------------------------------------- Sub Main()      Dim cDaoDB    As DAO.Database      Dim cDaoWS    As Workspace      Dim cColUpdate  As Collection      Dim varColItem  As Variant      Dim lngCnt    As Long      Set cDaoWS = DBEngine.Workspaces(0)      Set cDaoDB = mDaoWS.OpenDatabase("C:\TEST.mdb")      'コレクションにデータをaddする処理は省略しています      cColUpdate.add            With cDaoDB           cDaoWS.BeginTrans           'cColUpdateコレクションには10万件ほどのSQL構文(Update構文)が格納されています           '10万回ほど繰り返し処理します           For Each varColItem In cColUpdate                lngCnt = lngCnt + 1                If lngCnt > 1000 Then                     'データ量が多いため1000件ごとにコミットしています                     cDaoWS.CommitTrans                     cDaoWS.BeginTrans                     lngCnt = 0                End If                strErrSQL = varColItem                'Update処理が繰り返し流れます。                .Execute varColItem           Next           .Close           cDaoWS.Close      End With      Set cDaoDB = Nothing      Set cDaoWS = Nothing End Sub ---------------------------------------------------------------------- よろしくお願いします。

専門家に質問してみよう