• 締切済み

エクセルVBAでメモリ解放するには?

初心者な質問でもうしわけないのですが、教えてください。私は現在エクセルVBAを利用してウェヴマクロのimacrosの制御を行いサイトからリストの抽出を行っています。その際、変数の定義がうまくできなかったため、クリップボードに必要な情報をコピーし、エクセルに張り付けるという流れで作業を行っています。そして、このループ作業を約1000回行いたいのですが、大体50回目で止まります。止まっている際にエラーボックスが出て、「out of memory」となっています。クリップボード多用によるメモリの使い切りだと思います。そこで、クリップボードの内容を一度クリアすることを行いたいのですが、VBAのソースコードがわかりません、どなたかご存知であればご教授していただきたいと思います。 尚、VBAのソースコードは以下の通り。 Sub 抽出マクロ() Dim iim1, iret, row, counter, column, url Application.ScreenUpdating = False Set iim1 = CreateObject("imacros") iret = iim1.iimInit iret = iim1.iimDisplay("Submitting Data from Excel") row = 2 counter = 1 Range("I1").Copy Do If counter = 2500 Then Application.ScreenUpdating = True Exit Sub End If iret = iim1.iimPlay("titlename1.iim") Cells(row, 1).Value = Replace(iim1.iimGetLastExtract(), "[EXTRACT]", "") iret = iim1.iimPlay("newprice.iim") Cells(row, 2).Value = Replace(iim1.iimGetLastExtract(), "[EXTRACT]", "") iret = iim1.iimPlay("ISBN10.iim") Cells(row, 3).Value = Replace(iim1.iimGetLastExtract(), "[EXTRACT]", "") iret = iim1.iimPlay("ISBN13.iim") Cells(row, 4).Value = Replace(iim1.iimGetLastExtract(), "[EXTRACT]", "") iret = iim1.iimPlay("ASIN.iim") Cells(row, 5).Value = Replace(iim1.iimGetLastExtract(), "[EXTRACT]", "") row = row + 1  counter = counter + 1   Loop End Sub ***追伸*** ちなみにループの中に同じソースが12個続きます。そのため50回程度ループしているだけで約600回の抽出が行われます。 お手数ですが、ご教授していただけると助かります。

みんなの回答

回答No.1

失礼な表現、不適当な記載あったらご容赦ください。 先ず、質問するカテゴリーですが、 デジタルライフ>ソフトウェア>MS Office または同、Office系ソフトで質問した方が良いかと存じます。 そちらの方が具体的なコーディングを教えてくれると思われます。 Windows95/98の走りの時に主にやってましたが、VBAは、最近いじっていないので忘れましたが、 EXCELのVBAに限ってはマクロの登録開始し、コピーし、EXCELに貼り付け、EXCELのクリップボードをクリアするまでをマクロで登録します。 EXCELのバージョンが解りませんが、少なくとも2007にはクリア機能があります。 そしてそのコーディングをVBAで覘いて必要なコーディングを特定してはいかがですか? これに限らず、やりたいことがあってどうしてもステートメントやコマンドが解らないときは、マニュアル(手作業)で出来る作業はマクロ登録で実際にやることで大抵のコーディングは解ります。 そのコーディングから不要部分を削除すれば良いかと思います、 マクロ登録開始→「やらせたい作業をマニュアル(手作業)でやってみる」→マクロ登録を終了 その後、そのマクロのコーディングを修正したり、部分的にコピーして自分のやりたいVBAプログラムを作っていました。 その他の注意として、コーディングの追加箇所ですがコピーに行く前が適当かと思います。 エラー処理などでは対応しない方が良いかと思います。 経験上、エラー処理はトラブルの要因になることが多いようです。最悪の時にだけ使う方がいいかと思います。 以上

関連するQ&A

  • エクセルVBAについて

    こんにちわ! 今、エクセルでAシートの入力した項目をBのシートへデーターが入力できるようなシステムを以下のようにくみました。 そこでBシートにデーターが入力されるのですが20行まで入力すると入力できないようにしたいのですが、なかなか上手くいきません。 A1からF20まで書式のロックを外しそれ以外のセルは保護をかけたのですがその状態でVBAを使って20行以上入力できませんという感じのエラー表示をしたいのですが、どうすればいいでしょうか? VBAは初心者ですが宜しくお願いします。 Private Sub CommandButton1_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("date").Columns(1)) + 1 Sheets("date").Cells(row, 1).Value = Range("B2").Value row = WorksheetFunction.CountA(Sheets("date").Columns(2)) + 1 Sheets("date").Cells(row, 2).Value = Range("B3").Value row = WorksheetFunction.CountA(Sheets("date").Columns(3)) + 1 Sheets("date").Cells(row, 3).Value = Range("B4").Value row = WorksheetFunction.CountA(Sheets("date").Columns(4)) + 1 Sheets("date").Cells(row, 4).Value = Range("B5").Value row = WorksheetFunction.CountA(Sheets("date").Columns(5)) + 1 Sheets("date").Cells(row, 5).Value = Range("B6").Value row = WorksheetFunction.CountA(Sheets("date").Columns(6)) + 1 Sheets("date").Cells(row, 6).Value = Range("B7").Value Sheets("統制入力").Select Range("B17").Select ActiveWindow.SmallScroll Down:=-9 Range("B3:B7").Select Selection.ClearContents Range("B1").Select End Sub

  • エクセル VBAで入力フォームを作成し、そのフォームで検索をしようとF

    エクセル VBAで入力フォームを作成し、そのフォームで検索をしようとFindを使って動かしたのですが、一度表示したあと、再度別の値で検索しても最初に検索したデータが表示されてしまいます。 色々調べましたが、全く分からずこちらに質問しました。VBAは全くの初心者で本やHPを見ながら作っています。勉強不足なのは承知しております。どなたかご親切な方のご指導をお待ちしています。 顧客名   ・・・・・・・・・・・ 店舗名   ・・・・・・・・・・・ 略称    ・・・・・  ←ここに入力して検索をクリックします。 ・ ・ Private Sub 検索_Click() Dim w As Variant Dim r As Range ActiveSheet.Unprotect w = 略称.Value If w = "" Then Exit Sub Set r = Cells.Find(What:=w, After:=ActiveCell, LookIn:=xlValues, LookAt:= _ xlPart, SearchOrder:=xlByRows, MatchCase:=False _ , MatchByte:=False, SearchFormat:=False) If TypeName(r) = "Range" Then 略称.Value = Cells(ActiveCell.Row, 2).Value 顧客名.Value = Cells(ActiveCell.Row, 3).Value 店舗名.Value = Cells(ActiveCell.Row, 4).Value 締日.Value = Cells(ActiveCell.Row, 5).Value 売単価.Value = Cells(ActiveCell.Row, 6).Value サイクル.Value = Cells(ActiveCell.Row, 7).Value 郵便番号.Value = Cells(ActiveCell.Row, 8).Value 住所.Value = Cells(ActiveCell.Row, 9).Value 電話番号.Value = Cells(ActiveCell.Row, 10).Value FAX.Value = Cells(ActiveCell.Row, 11).Value 担当者.Value = Cells(ActiveCell.Row, 12).Value End If ActiveSheet.Protect End Sub

  • VBA (Row とRowsの違いについて)

    いつもお世話になっております。 VBA初心者ですが、RowとRowsの違いについて今一つ分かりません。 添付ファイルのように、A2:A25まで数字を入れた表を作って、今ある知識で行数をカウントするコードをいくつか書いてみました。 test1:A2から始まる表を構成するトータル行数を返す。 test2:?? test3:A2から始まる表の最終行番号を返す。 test4:test1と同じ test5:??? (1)test2、5は同じ内容のコードになると思いますが・・結果の『2』は何を意味しているのか分かりません。 (2)RowとRowsの違いは簡単に言うとどういう事でしょうか? まとまりの無い文章で申し訳ありませんが、よろしくお願いいたします。 Sub test1() Cells(2, 2).Value = Cells(2, 1).CurrentRegion.Rows.Count End Sub Sub test2() Cells(2, 3).Value = Cells(2, 1).CurrentRegion.Row End Sub Sub test3() Cells(2, 4).Value = Cells(2, 1).End(xlDown).Row End Sub Sub test4() Cells(2, 5).Value = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Rows.Count End Sub Sub test5() Cells(2, 6).Value = Range(Cells(2, 1), Cells(2, 1).End(xlDown)).Row End Sub

  • VBAについて教えて下さい

    EXCEL2010を使用中。 独学で、Web上で色々検索したものをパクリながら VBAを組んでるようなレベルです。 今回教えて頂きたい内容ですが、 カード型の入力シート「Sheet名:入力」を作成して、 登録ボタンでデータベースシート「Sheet名:スケジュール」に 書き足していくような業務スケジュール表を作成中です。 わざわざそんな手のこんだものを 作らなくてもと思われるかもしれませんが 諸事情があっての事なので 登録ボタンのVBAは Private Sub 登録_Click() Dim row As Integer row = WorksheetFunction.CountA(Sheets("スケジュール").Columns(1)) + 1 Sheets("スケジュール").Cells(row, 1).Value = Range("Q2").Value Sheets("スケジュール").Cells(row, 2).Value = Range("G6:G7").Value Sheets("スケジュール").Cells(row, 3).Value = Range("G8:G9").Value Sheets("スケジュール").Cells(row, 4).Value = Range("G10:G11").Value Sheets("スケジュール").Cells(row, 5).Value = Range("G12:G13").Value Sheets("スケジュール").Cells(row, 6).Value = Range("G14:G15").Value Sheets("スケジュール").Cells(row, 7).Value = Range("G16:G17").Value Sheets("スケジュール").Cells(row, 8).Value = Range("G18:G19").Value Sheets("スケジュール").Cells(row, 9).Value = Range("G20:G21").Value Sheets("スケジュール").Cells(row, 10).Value = Range("G22:G23").Value Sheets("スケジュール").Cells(row, 11).Value = Range("G24:G25").Value Sheets("スケジュール").Cells(row, 12).Value = Range("M6:M7").Value Sheets("スケジュール").Cells(row, 13).Value = Range("M8:M9").Value Sheets("スケジュール").Cells(row, 14).Value = Range("M10:M11").Value Sheets("スケジュール").Cells(row, 15).Value = Range("M12:M13").Value Sheets("スケジュール").Cells(row, 16).Value = Range("M14:M15").Value Sheets("スケジュール").Cells(row, 17).Value = Range("M16:M17").Value Sheets("スケジュール").Cells(row, 18).Value = Range("M18:M19").Value Sheets("スケジュール").Cells(row, 19).Value = Range("M20:M21").Value Sheets("スケジュール").Cells(row, 20).Value = Range("M22:M23").Value Sheets("スケジュール").Cells(row, 21).Value = Range("M24:M25").Value Sheets("スケジュール").Cells(row, 22).Value = Range("S6:S7").Value Sheets("スケジュール").Cells(row, 23).Value = Range("S8:S9").Value Sheets("スケジュール").Cells(row, 24).Value = Range("S10:S11").Value Sheets("スケジュール").Cells(row, 25).Value = Range("S12:S13").Value Sheets("スケジュール").Cells(row, 26).Value = Range("S14:S15").Value Sheets("スケジュール").Cells(row, 27).Value = Range("S16:S17").Value Sheets("スケジュール").Cells(row, 28).Value = Range("S18:S19").Value Sheets("スケジュール").Cells(row, 29).Value = Range("S20:S21").Value Sheets("スケジュール").Cells(row, 30).Value = Range("S22:S23").Value Sheets("スケジュール").Cells(row, 31).Value = Range("S24:S25").Value Sheets("スケジュール").Cells(row, 32).Value = Range("S26:S27").Value Range("Q1").Select End Sub としています。 この時、移行するセル内の文字数が指定文字数を超えると、 移行した先のセルの書式設定を「折り返して全体を表示する」に 設定変更をしたいですのですが、その方法について ご教授いただけないでしょうか? 因みに現在の設定は、「縮小して全体を表示する」としています。

  • エクセルVBAとmsg関数

    こんばんは。 エクセルVAB初心者です。 現在、エクセル2003で以下の画像のような 表を作成しました。 上段が請求書データ(シート1)で、 下段が請求書の印刷フォーム(シート2)です。 VBAで実行する処理は、請求書データNOをそれぞれ 任意でクリックし、選択しているNOの行データをシート2にそれぞれ 転記していき、一括で印刷するものです。 以下のように、コードを作りました。 Sub 発行() Dim i As Range Dim m As Integer Dim W1 As String With Selection W1 = Cells(.Row, 1).Value & " ~ " & _ Cells(.Rows.Count + .Cells(1, 1).Row - 1, 1).Value & vbCrLf & _ " の請求書を発行しますか?" m = MsgBox(W1, vbYesNoCancel) If m <> vbYes Then Exit Sub For Each i In .Resize(, 1) With Sheets("Sheet2") .Range("b1").Value = Cells(i.Row, 1).Value .Range("e1").Value = Cells(i.Row, 2).Value .Range("c5").Value = Cells(i.Row, 3).Value .Range("b3").Value = Cells(i.Row, 4).Value .Range("c6").Value = Cells(i.Row, 5).Value .PrintOut End With Next End With End Sub ここで質問なのですが、"の請求書を発行しますか?" の後に、選択している行の数を(合計O枚)のように 表示したいのですが、どのようなコードを入れればいいのでしょうか。 また、メッセージボックスのウインドウの中の文字が 小さいので、もう少し大きくしたいのです。 以上の2点ですが、お願いします。

  • エクセル 条件に合わせてマクロを停止させたい

    VBA初心者です。よろしくお願いします。 Sub テスト1() Select Case Cells(ActiveCell.Row, "a").Value Case "○" テスト2 Case "×" ここでマクロを停止させたい End Select End Sub これをループさせているのですが、”a”に”×”がきたときにマクロを停止させる記述方法はありますか?

  • EXCEL VBA コードをスマートに

    EXCEL VBAのフォームで、 テキストボックスの値をあらかじめTextBox1に入力しておくコードを 書いてみました。 Private Sub UserForm_Initialize() TextBox1.Value = Cells(4, 1) & Cells(4, 3) & Cells(4, 5) & Cells(4, 7) & Cells(6, 1) & Cells(6, 3) & Cells(6, 5) & Cells(6, 7)Cells(8, 1) & Cells(8, 3) & Cells(8, 5) & Cells(8, 7).Value End Sub 実際はもっと長いです・・・ どうしたら、スマートに記述できますか? お知恵をお貸しください!!!

  • エクセルのVBAで悩んでいます。

    いつもありがとうございます。 エクセルのVBAで悩んでいます。 セルの範囲指定をVBAで行いたいのです。 ただし、引数に数値変数を使用する為、Cellsプロパティを使います。 すると、離れている範囲の範囲指定が出来ないのです。 例えば、Rangeプロパティだと、 Range("A5:E5,A9:E32").Select こうなるところを、 A9:E32 を変数に置き換えたくて、 Range("A5:E5", Cells(g, 1), Cells(h, 5)).Select と、するとエラーが出ます。 VBAの前文は次の通りです。 Private Sub CommandButton1_Click() a = Me.TextBox1.Value b = Me.TextBox2.Value Set c = Range("a:a").Find(what:=a, LookIn:=xlValues, lookat:=xlWhole) Set d = Range("a:a").Find(what:=b, LookIn:=xlValues, lookat:=xlWhole) 'MsgBox c + d e = c.Address 'MsgBox e f = d.Address 'MsgBox f g = Range(e).Row MsgBox g h = Range(f).Row MsgBox h Range(Cells(g, 1), Cells(h, 5)).Select End sub よろしくお願い致します。

  • Excel VBAについて

    Excel VBAについて VBA初心者ですが、作業で使うファイルを使いやすくしようと思っているのですが行き詰ってしまいました。 是非、知恵をお貸しいただきたいと質問させていただきました。 フォームを使ってデータを打ち込むようにしようと思っています。 日付の列を選択するとフォームが立ち上がり、必要項目を記入するというものです。 日付欄が未記入なら「新規」、記入済みなら「修正」 という風にしたいのですが、うまくいきません・・・ 修正しようと入力しなおしても新規として新しい行に書かれてしまいます。 色々と自分で勉強して下のような書き方をしましたが、何がいけないのでしょうか。 ご指摘おねがいいたしますm(__)m Public Sub KAKIKOMI(GYO As Long) GYO = ActiveCell.Row Load UserForm1 With UserForm1 If ((GYO = 17) Or (Cells(GYO, 3).Value = "")) Then GYO = 17 .hiduke.Text = "" .bunnrui.Text = "" .tantou.Text = "" .gaku.Text = "" .memo.Text = "" Else .hiduke.Text = Cells(GYO, 3).Value .bunnrui.Text = Cells(GYO, 7).Value .tantou.Text = Cells(GYO, 8).Value .gaku.Text = Cells(GYO, 9).Value .memo.Text = Cells(GYO, 11).Value .ComboBox1.Text = Cells(GYO, 5).Value End If g_swOK = 0 .Show If g_swOK <> 1 Then GoTo TOUROKU_EXIT If GYO = 17 Then GYO = 19 Do While Cells(GYO, 1).Value <> "" GYO = GYO + 1 Loop End If ActiveSheet.Unprotect Cells(GYO, 3).Value = Trim$(.hiduke.Text) Cells(GYO, 7).Value = Trim$(.bunnrui.Text) Cells(GYO, 8).Value = Trim$(.tantou.Text) Cells(GYO, 9).Value = Trim$(.gaku.Text) Cells(GYO, 11).Value = Trim$(.memo.Text) ActiveSheet.Protect End With End Sub ちなみに、17行目が見出しで、3列目が日付欄です。 よろしくお願いします。

  • VBAについて

    Excel2010使用。 VBA初心者である為、 何度か質問させていただきながら 回答いただいた内容に修正を加えつつ、 思いのものがひと通りできたと 解決していたつもりだったのですが、 動作確認をしたところ、一部不具合が生じました。 自己解決を試みているのですが、解決できず困っております。 どなたかお助けいただけないでしょうか? Private Sub 登録_Click() '登録ボタン押下で勤務表にデータを登録 Dim row As Integer Application.ScreenUpdating = False '画面更新の抑制 row = WorksheetFunction.CountA(Sheets("勤務表").Columns(1)) + 1 myCol = 1 Sheets("勤務表").Cells(row, 1).Value = Range("T2").Value Sheets("勤務表").Cells(row, 34).Value = Range("T1").Value For i = 8 To 22 Step 7 For j = 6 To 26 Step 2 If IsEmpty(Cells(j, i)) Then Exit For Else myCol = myCol + 1 With Sheets("勤務表").Cells(row, myCol) .Value = Cells(j, i).Value If LenB(StrConv(Cells(j, i).Value, vbFromUnicode)) > 8 Then '(1) ここを修正 .WrapText = True .Font.Size = 6 End If End With End If Next j Next i Sheets("勤務表").Cells(5, 22).Value = Range("P3").Value '月末日を移す Range("T1").ClearContents '連続入力の為、消去 Range("E6:G25").ClearContents Range("L6:N25").ClearContents Range("S6:U27").ClearContents Application.ScreenUpdating = True '抑制の解除 Range("T1").Select End Sub 上記コードを作成し、 入力用のシートから勤務表シートに 1人ずつ登録していくようにしております。 入力用のシートのH6:H24、O6:O24、V6:V26 (シートの都合により2行を1行に結合しています) このマクロを実行したところ、 V24までは転記ができているのですが、 V26だけが転記できない状況となっています。 CellsでいくとCells(22,26)まで範囲に入っていると 思うのですが・・・。 どこがおかしいのでしょうか?