Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6561 / 13646 ツリー ←次へ | 前へ→

【44496】データの抽出コピーでリソース不足エラー こなつ 06/11/19(日) 20:03 質問[未読]
【44506】Re:データの抽出コピーでリソース不足エラー こなつ 06/11/20(月) 9:07 質問[未読]
【44510】Re:データの抽出コピーでリソース不足エラー Jaka 06/11/20(月) 11:25 発言[未読]
【44519】Re:データの抽出コピーでリソース不足エラー こなつ 06/11/20(月) 13:48 お礼[未読]
【44522】Re:データの抽出コピーでリソース不足エラー りん 06/11/20(月) 14:48 発言[未読]
【44528】Re:データの抽出コピーでリソース不足エラー Jaka 06/11/20(月) 16:36 発言[未読]
【44537】Re:データの抽出コピーでリソース不足エラー こなつ 06/11/20(月) 21:32 発言[未読]
【44546】Re:データの抽出コピーでリソース不足エラー Jaka 06/11/21(火) 11:19 発言[未読]
【44566】Re:データの抽出コピーでリソース不足エラー こなつ 06/11/21(火) 22:20 お礼[未読]

【44496】データの抽出コピーでリソース不足エラー
質問  こなつ  - 06/11/19(日) 20:03 -

引用なし
パスワード
   こんにちわ^^
 いつも お世話になってます。

 今日はVBAを使ってデータの抽出・コピー・ペースト
 をするプログラムを作ったのですが、『リソース不足です
 プログラムを終了します』のエラーメッセが出て止まってしまいます

 どなたか、良いアドバイスをいただければと思い投稿しました。

 データは約300×70セル程度のデータです。

 プログラムは単純にオートフィルタを使ってあるキーワードごとに
 抽出しその抽出データをコピーし 指定した別のシートへペースト
 を行うものです。 キーワードは35種類で シートも35シート
 あります。
  抽出するデータは、35種類すべてあるわけではなく、その中の
 数種類のみとなります。

 プログラムは順番にオートフィルタを使って抽出をかけています。
 数が少ない時はうまくいくのですが・・・少し多くなると先ほどの
 エラーが出てしまいます。

 メモリーを消費しない方法をご教授下さい。お願いします。

 

【44506】Re:データの抽出コピーでリソース不足エ...
質問  こなつ  - 06/11/20(月) 9:07 -

引用なし
パスワード
   すいません
もう少し捕捉説明をします。

PCスペックは
 NEC MA21X CPU Celeron2.1GHz
            760MByte RAM

  
 エラーメッセージ

 『リソース不足のため、このタスクを完了することができません。
  選択するデータを少なくするか、ほかのアプリケーションを
  終了して再度試してください。   元に戻さずに続けますか?』
  

 「OK」を押すと

 『実行時エラー '1004':
   RangeクラスのPasteSpecialメソッドが失敗しました。』

 以上のような エラーが発生しています。

【44510】Re:データの抽出コピーでリソース不足エ...
発言  Jaka  - 06/11/20(月) 11:25 -

引用なし
パスワード
   その手の質問をたまに見ますが、経験したことがないので対策ではないですけど。
(ろくな仕事をしてないから.....。)

使ったものは、ちゃんと後片付けをする。
(特に配列をグローバル変数で使う場合は。)
ところどころにDoEventsを入れて見る。
ぐらいでしか思いつきませんでした。

私の使っているPCより遥かに構成なPCですよね〜。
う〜ん。コード見てないし。
見ても多分解らないと思うけど....。

一応それらしき関連のもの。(これだけじゃないと思います。)
追加、コピペを繰り返しやりすぎるとスタックオーバーフロー?なんてのも合ったような...。

[XL2003]ズームが設定されたシートのコンボボックスやリストボックスを操作すると メモリ不足が発生する
ht tp://support.microsoft.com/default.aspx?scid=kb;ja;842231

[XL2003]外部参照式を含むブックを保存するとメモリ不足
ht tp://support.microsoft.com/default.aspx?scid=kb;ja;410964

[XL]上書き保存の際の「ディスク容量がいっぱいです」のエラーについて
ht tp://support.microsoft.com/kb/402706/ja

[XL2000]オートメーションでセルの値の取得やコピーを繰り返すと応答しない
ht tp://support.microsoft.com/kb/414107/ja

【44519】Re:データの抽出コピーでリソース不足エ...
お礼  こなつ  - 06/11/20(月) 13:48 -

引用なし
パスワード
   早速の回答 ありがとうございました。

 私の質問の仕方が悪くてごめんなさいm(__)m

 一度 コピーして そのデータをリセット(?)するのは
 DoEventsなのでしょうか・・・・
 
 すいません、ど素人なんで・・・・
  どうしていいのか さっぱりなんです。。。

【44522】Re:データの抽出コピーでリソース不足エ...
発言  りん  - 06/11/20(月) 14:48 -

引用なし
パスワード
   こなつ さん、こんにちわ。
> すいません、ど素人なんで・・・・
>  どうしていいのか さっぱりなんです。。。
とりあえず、出せる情報(VBAのコード、表の形式等)を全部出したほうがいいですよ。

【44528】Re:データの抽出コピーでリソース不足エ...
発言  Jaka  - 06/11/20(月) 16:36 -

引用なし
パスワード
    りんさん こんにちは。お尻につかせてね!

▼こなつ さん:
> 一度 コピーして そのデータをリセット(?)するのは
> DoEventsなのでしょうか・・・・
リセットの意味が解りませんが、コピーモードを解除するだけなら、
Application.CutCopyMode = False
で、できます。

これとは別になんか変なものが溜まっていたりするのを解放?(できるのか解らないけど)したいがためにWindowsに一旦制御を渡すって感じで私は入れてます。

同じような意味で、Application.ScreenUpdating = False は、表示する情報をためにためているため(メモリの浪費)、逆に遅くなっているような気がしてあまり使わないです。
処理内容にもよりますが、画面が長い時間止まっていると、マクロが止まっているのか、フリーズしているのか見分けがつかないためでもあります。

【44537】Re:データの抽出コピーでリソース不足エ...
発言  こなつ  - 06/11/20(月) 21:32 -

引用なし
パスワード
   Jaka さん・りんさん
 いろいろ アドバイスありがとうございます。

コードを乗せておきます。(一部)


'各シート削除(ここでコピー先のシートのデータを削除して)
  For i = 1 To 数 - 1
  
  Worksheets(Array(i)).Select
    削除ID = Range("A1").Value
       
    If 削除ID >= 1 Then
      Range("A2:BP2").Select
      Range(Selection, Selection.End(xlDown)).Select
      Selection.ClearContents
      Range("A2").Select
    Else
    
    End If
  Next
  
'各項目別データ入力(抽出キーワードで抽出します。オートフィルター使用)
  For i = 1 To 数 - 1
    Worksheets(Array(i)).Select
    項目コード = Range("A1").Value
'各シートの一番はじめのセルに項目コード(抽出キー)を仕込んでます
    
    If 項目コード >= 1 Then
      Sheets("サンプルリスト").Select
      Selection.AutoFilter Field:=68, Criteria1:=項目コード
      Range("B2:BP2").Select
      On Error GoTo tugi
      Range(Selection, Selection.End(xlDown)).Select
      Selection.Copy
      On Error GoTo tugi

'コピー・ペーストしてます。^^;
     
      Worksheets(Array(i)).Select
      Range("B2").Select
      Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False
      On Error GoTo tugi
      Application.CutCopyMode = False
      
      Range("B65536").Select
      Selection.End(xlUp).Select
      最大行 = ActiveCell.Row
      Range("a2").Select
      
      If 最大行 = 1 Then
    
      Else
        For k = 2 To 最大行
          Cells(k, 1).Value = k - 1
        Next
      End If
      
      Sheets("サンプルリスト").Select
      Selection.AutoFilter Field:=68
      Application.CutCopyMode = False
      
    Else
    
    End If
tugi:

  Next

----------ここまで-------------------------

  おおまかに こんなマクロになってます。

【44546】Re:データの抽出コピーでリソース不足エ...
発言  Jaka  - 06/11/21(火) 11:19 -

引用なし
パスワード
   例えば、これ↓
>Range("A2:BP2").Select
>Range(Selection, Selection.End(xlDown)).Select
この書き方なんですが、前にもどこかで質問者が書いているのを見かけたことがあるんですが、何でこんな書き方をするのか解りませんでした。
データ状態によって、下記コードのようになってしまいますよ。
1度、新規シートで、実行してみてください。

Sub abcd1()
 Range("A2:N15").Value = 5
 Range("A11:A15").Value = Empty
 Range("A2:N2").Select
 Range(Selection, Selection.End(xlDown)).Select
End Sub

Sub abcd2()
 Range("A2:N15").Value = 5
 Range("M16:M20").Value = 5
 Range("A2:N2").Select
 Range(Selection, Selection.End(xlDown)).Select
End Sub

・書式もフィルするから、必要なかったら後で書式を修正する手間が要ります。
 でも、連番の作成は1番早いです。

>      Range("B65536").Select
>      Selection.End(xlUp).Select
>      最大行 = ActiveCell.Row
>      Range("a2").Select
>      If 最大行 = 1 Then

>      Else
>        For k = 2 To 最大行
>          Cells(k, 1).Value = k - 1
>        Next
>      End If

       ↓

      最大行 = Range("B65536").End(xlUp).Row
      If 最大行 <> 1 Then
       With Range("B2")  '←スタート位置
         With .Resize(最大行 - .Row + 1).Offset(, -1)
           .Cells(1).Value = 1
           .DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
                 Step:=1, Trend:=False
         End With
       End With
      End If

・オートフィルター使用時は、マクロ記録をそのまま使用せずに
 範囲がB2:AA2だったら、左端の始点セルを指定しておく
 また、いちいちシートを選択しなくてもできます。

>     Sheets("サンプルリスト").Select
>     Selection.AutoFilter Field:=68, Criteria1:=項目コード
       ↓
      Sheets("サンプルリスト").Range("B2").AutoFilter Field:=68, Criteria1:=項目コード
                     ↑例えばだけど....。

・↓を修正しようと思いましたが、何でエラートラップしてあるのでしょうか?
 この辺は、上記したことが判明しないと修正できませんけど
 なんとなく、データ量が多すぎる、SpecialCells(コードには書いてないけど)の最大認識数に
 関係しているのかな?と思います。
>     Range("B2:BP2").Select
>     On Error GoTo tugi
>     Range(Selection, Selection.End(xlDown)).Select
>     Selection.Copy
>     On Error GoTo tugi

なんか課題が多いようですから、少しづつ修正していくほかないような気もします。

これなんか選択しなくてもできますよ。
>     Worksheets(Array(i)).Select
>     Range("B2").Select
>     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
>     :=False, Transpose:=False
       ↓
      Worksheets(Array(i)).Range("B2").PasteSpecial Paste:=xlPasteValues, _
           Operation:=xlNone, SkipBlanks:=False, Transpose:=False

【44566】Re:データの抽出コピーでリソース不足エ...
お礼  こなつ  - 06/11/21(火) 22:20 -

引用なし
パスワード
   こんばんわ
 Jakaさん いろいろとご指導ありがとうございます。

 確かにマクロの記録と我流のマクロを組み合わせて
 作ったのでおかしなことになってるかもしれません・・・

 そもそも これを作ったのは 抽出してコピーして
 他のシートに貼り付ける作業がめんどくさくて作った
 ものですから・・・(^。^ゞ

 ご指摘頂いた 内容を直してみたいと思います。


 あと、エラートラップですが、抽出キーでデータベースに
 ない物を選択して抽出してコピーしようとすると
 エラーになったので つけたような・・・・気がします。
 (すいません、あいまいで)

>・↓を修正しようと思いましたが、何でエラートラップしてあるのでしょうか?
> この辺は、上記したことが判明しないと修正できませんけど
> なんとなく、データ量が多すぎる、SpecialCells(コードには書いてないけど)の最大認識数に
> 関係しているのかな?と思います。
>>     Range("B2:BP2").Select
>>     On Error GoTo tugi
>>     Range(Selection, Selection.End(xlDown)).Select
>>     Selection.Copy
>>     On Error GoTo tugi
>

6561 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free