Excel VBA質問箱 IV

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

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


5441 / 13644 ツリー ←次へ | 前へ→

【50698】オートフィルの繰り返し ゆた 07/8/10(金) 17:15 質問[未読]
【50713】Re:オートフィルの繰り返し ichinose 07/8/11(土) 19:44 発言[未読]
【50737】どうもありがとうございます! ゆた 07/8/13(月) 22:09 お礼[未読]

【50698】オートフィルの繰り返し
質問  ゆた  - 07/8/10(金) 17:15 -

引用なし
パスワード
   データ.xlsのsheet1に入っている元データからツール.xlsのSheet2上にならべてある条件でオートフィルをかけて、データ.xlsのsheet2に結果を貼り付けるというのを繰り返させたいのですが、どうも動いてくれません。
まだVBAを勉強し始めたばかりで、自分の力だけでは解決できそうもありません。どうか宜しくお願いします。


Option Explicit
Dim a As Long
Dim b As Long
Dim c As Byte
Dim d As Long
Dim e As Long
Dim r As Long
Dim x As Byte

Sub main()
Workbooks("データ.xls").Sheets(2).Range("A1").Activate
  For x = 0 To 13
    a = x * 5 + 5
    b = x * 5 + 6
    c = 2
    d = ActiveCell.Row
    Call オートフィル
    Worksheets(c).Activate
    e = Cells(d, 1).End(xlDown).Row
    Cells(e + 2, 1).Activate
  Next
End Sub

Sub オートフィル()

  Workbooks("データ.xls").Sheets(1).Activate
  
  r = Range("A1").End(xlDown).Row
  
    Range(Cells(1, 1), Cells(r, 13)).AdvancedFilter _
    Action:=xlFilterInPlace, _
    CriteriaRange:=Workbooks("ツール.xls").Sheets("Sheet2").Range(Cells(a, 2), Cells(b, 3))
    
  r = Range("A1").End(xlDown).Row
  Range(Cells(1, 1), Cells(r, 13)).Copy Destination:=Worksheets(c).Cells(d, 1)
End Sub


※プログラム全体の一部分を抜き出したもので、データ.xlsは実際には任意のExcelファイルを選択させます。

【50713】Re:オートフィルの繰り返し
発言  ichinose  - 07/8/11(土) 19:44 -

引用なし
パスワード
   ▼ゆた さん:
こんばんは。

>データ.xlsのsheet1に入っている元データからツール.xlsのSheet2上にならべてある条件でオートフィルをかけて、データ.xlsのsheet2に結果を貼り付けるというのを繰り返させたいのですが、どうも動いてくれません。
>まだVBAを勉強し始めたばかりで、自分の力だけでは解決できそうもありません。どうか宜しくお願いします。
この投稿には、いくつかの問題があります。

1. コードだけの提示では、「どうも動いてくれません。」の事情がわからないということです。

だって、フィルタ処理を行うためには、データが必要です。

どのようなデータをフィルタ処理するのか記述されていません。

提示されたコードだとAdvancedFilterメソッドを使っていますね?
そうすると抽出条件もコードからはわかりません。

さらに最終的にどうのような結果をブック「データ.xls」の2番目のシートに表示したいのかが 明確になっていません!!。

つまり、情報処理に必要不可欠な 
 処理機能の説明
 入力データの説明(具体例を示す)
 出力データの説明(入力データの具体例から出力データの例を説明)

が不完全ということです。

具体的な入力データや出力データを記述してもらえないと
回答者は、入力データを作成しなければなりません。
(質問者が記述してくれさえすれば、コピーで済むのに・・・)。

例えば、

新規ブックBook1.xlsのSheet1というシートに

     A    B     C    D     E    F
 1  項目1   項目2   項目3   項目4   項目5   項目6
 2   1     2     3     4     5     6
 3   2     3     4     5     6     7
 4   3     4     5     6     7     8
 5   4     5     6     7     8     9
 6   5     6     7     8     9     10
 7   6     7     8     9     10     11


というデータが入力されているとします。

Book1.xlsのSheet2(左から、2番目のシートは未入力シートのままです)

新規ブックBook2.xlsのSheet2というシートには、抽出条件である以下のデータを入力します。

      A    B
 5   項目1   項目2
 6    1     2
 7
 8
 9
10   項目1   項目2
11    2     3
12
13
14
15   項目1   項目2
16    3     4


これが抽出条件です。

このデータでフィルタ処理した場合、
Book1.xlsのSheet2(左から2番目のシート)には

     A    B     C    D     E    F
 1  項目1   項目2   項目3   項目4   項目5   項目6
 2   1     2     3     4     5     6
 3
 4  項目1   項目2   項目3   項目4   項目5   項目6
 5   2     3     4     5     6     7
 6
 7  項目1   項目2   項目3   項目4   項目5   項目6
 8   3     4     5     6     7     8

という結果を表示します。

コードを拝見した限りでは、上記の結果を表示したいのかなあ

と想像しました
(項目名が抽出毎の表示が必要かは疑問でしたが、コードを拝見した限りで
 判断しました)。


だとすると、

Book1.xls Book2.Xls どちらの標準モジュールでもかまいませんが、

統一してBook1.xlsの 標準モジュールに

'================================
Sub main()
  Dim a As Long
  Dim b As Long
  Dim d As Long
  Dim x As Long
  Dim rng As Range
  Dim crng As Range
  Dim prng As Range
  With Workbooks("book1.xls").Worksheets(1)
    Set rng = .Range("a1", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, 6)
    .Next.Cells.ClearContents
    End With
  d = 1
  For x = 0 To 2
    a = x * 5 + 5
    b = x * 5 + 6
    With Workbooks("book2.xls").Sheets("Sheet2")
      Set crng = .Range(.Cells(a, 2), .Cells(b, 3))
      End With
    Set prng = Workbooks("book1.xls").Worksheets(2).Cells(d, 1)
    Call フィルタ処理(rng, crng, prng)
    With Workbooks("book1.xls").Worksheets(2)
      d = .Cells(.Rows.Count, 1).End(xlUp).Row + 2
      End With
  Next
End Sub
'==================================================================
Sub フィルタ処理(rng As Range, ctrrng As Range, cpyrng As Range)
'機能  :指定されたセル範囲を指定された条件でフィルタ処理し、結果を指定位置にコピーする
'input  :rng フィルタをかけるセル範囲
'     crng フィルタ条件が入力されているセル範囲
'     prng フィルタ結果を表示する開始セル
  rng.Parent.Activate
  rng.AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=ctrrng, _
            copytorange:=cpyrng

End Sub

として、mainを実行してみてください。
(Book1.Xls及び、Book2.Xlsは 一度、それぞれの名前で保存してから実行すること)


呼び出しプロシジャーはオートフィルではないので名前は変えました。

2. プロシジャー呼び出しを行うときのデータの受け渡しは、
出来うる限りパラメータ渡しを使うことです。

これにより、個々のプロシジャーの結合度が弱くなり、汎用性(再利用可能)が
高まります。

これについては、以前にも投稿して事があります。
www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=28808;id=excel

3.直接のエラーの原因は、
  Range(Cells(1, 1), Cells(r, 13)).AdvancedFilter _
    Action:=xlFilterInPlace, _
    CriteriaRange:=Workbooks("ツール.xls").Sheets("Sheet2").Range(Cells(a, 2), Cells(b, 3))

これでしょうか?

Workbooks("ツール.xls").Sheets("Sheet2").Range(Workbooks("ツール.xls").Sheets("Sheet2").Cells(a, 2), Workbooks("ツール.xls").Sheets("Sheet2").Cells(b, 3))

本来なら、↑このように記述しなければなりません。


まずは、上記のように今問題を抱えているブックではなく、
新規ブックで上記の手順でデータやコードを作成して試して見てください。

【50737】どうもありがとうございます!
お礼  ゆた  - 07/8/13(月) 22:09 -

引用なし
パスワード
   パソコンの調子がおかしくなってネットにつなげなかったため、お礼が遅くなってしまいました…。

自分の投稿の不明瞭さから、「自分のしたいこと」の推察からデータの作成までと余計な労力をかけさせてしまいましたこと、申し訳ありませんでした。
そして、そんな自分の不完全な質問投稿にご回答くださいまして、本当にありがとうございました。

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