Excel VBA質問箱 IV

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

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


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

【18544】オートフィルタについて xyz 04/9/29(水) 10:46 質問[未読]
【18545】Re:オートフィルタについて Kein 04/9/29(水) 11:24 回答[未読]
【18551】Re:オートフィルタについて xyz 04/9/29(水) 13:28 質問[未読]
【18553】Re:オートフィルタについて Kein 04/9/29(水) 14:45 発言[未読]
【18555】Re:オートフィルタについて xyz 04/9/29(水) 15:14 質問[未読]
【18557】Re:オートフィルタについて Kein 04/9/29(水) 15:38 回答[未読]
【18565】Re:オートフィルタについて xyz 04/9/29(水) 21:02 質問[未読]
【18581】Re:オートフィルタについて Kein 04/9/30(木) 8:42 回答[未読]
【18673】Re:オートフィルタについて xyz 04/10/5(火) 10:37 質問[未読]
【18674】Re:オートフィルタについて Kein 04/10/5(火) 11:08 回答[未読]
【18676】Re:オートフィルタについて xyz 04/10/5(火) 15:18 質問[未読]
【18687】Re:オートフィルタについて Kein 04/10/5(火) 17:46 回答[未読]
【18725】Re:オートフィルタについて xyz 04/10/7(木) 15:44 質問[未読]
【18745】Re:オートフィルタについて Kein 04/10/8(金) 10:28 回答[未読]
【18877】Re:オートフィルタについて xyz 04/10/15(金) 13:09 お礼[未読]

【18544】オートフィルタについて
質問  xyz  - 04/9/29(水) 10:46 -

引用なし
パスワード
   A1〜F1までに項目名が、そして、A2〜F2以降は
その項目の各データが入力されています。
C1の項目のデータについて、在る条件でオートフィルタを
かけ、それにより抽出されたデータをコピーして
他のシートへ貼り付けます。そのコピーの際に、
項目名は除いて、データだけをコピーする方法を
教えてください。なお、行数は決まっていません。
宜しくお願いします。

【18545】Re:オートフィルタについて
回答  Kein  - 04/9/29(水) 11:24 -

引用なし
パスワード
   仮にC列として

Dim MyR As Range

Set MyR = Range("C2", Range("C65536").End(xlUp))
Range("C:C").AutoFilter 1, "検索値"
On Error Resume Next
MyR.SpecialCells(12).Copy Sheets("Sheet2").Range("A1")
ActiveSheet.AutoFilterMode = False
Set MyR = Nothing

のようにすれば良いでしょう。

【18551】Re:オートフィルタについて
質問  xyz  - 04/9/29(水) 13:28 -

引用なし
パスワード
   ありがとうございます。
ご教授の内容を現在のものに置換えました。
内容については、A列〜F列の項目以外の全てのデータをコピーし、
作業済シートへ貼り付けるというものです。抽出条件は、
100.0%なんですが、うまく100.0%が抽出できず、バラバラに
データが貼り付けられます。どうしてでしょう?
なお、Range("A4:F6").Select については、A列〜F列までの
6行目までが項目になっており、セルによっては結合をしている
関係でこのようにしています。

また、このデータがあるシート名を仮に「データ1」として場合、
「データ10」までの合計10個のシートについて同様の処理を行い、
準じ作業済シートへ貼り付けていきたいのです。
シートの選択については、WORKSHEETS(”データ1”).SELECT で
指定すればいいのでしょうが、これを簡単に作る方法と、
コピーしたデータを作業済シートへ貼り付ける際に、例えば
データ1分を貼り付けたら、その下にデータ2を、さらにその下に
データ3を、というふうにやりたいのですが、私が考えると
ものすごく複雑な内容になってしまいます。簡単な方法を
ご教授いただけたら幸いです。宜しくお願いします。

  
  Dim MyR As Range
  Set MyR = Range("A7", Range("F65536").End(xlUp))
  Range("A4:F6").Select
  Selection.AutoFilter Field:=6, Criteria1:="100.0%"
  On Error Resume Next
  MyR.Copy Sheets("作業済").Range("A1")
  ActiveSheet.AutoFilterMode = False
  Set MyR = Nothin

▼Kein さん:
>仮にC列として
>
>Dim MyR As Range
>
>Set MyR = Range("C2", Range("C65536").End(xlUp))
>Range("C:C").AutoFilter 1, "検索値"
>On Error Resume Next
>MyR.SpecialCells(12).Copy Sheets("Sheet2").Range("A1")
>ActiveSheet.AutoFilterMode = False
>Set MyR = Nothing
>
>のようにすれば良いでしょう。

【18553】Re:オートフィルタについて
発言  Kein  - 04/9/29(水) 14:45 -

引用なし
パスワード
   もう一度、私の書いたサンプルをよーく見て下さい。あなたがUPしたコードは、
肝心な"抽出範囲を"コピーする、という処理になってません。

【18555】Re:オートフィルタについて
質問  xyz  - 04/9/29(水) 15:14 -

引用なし
パスワード
   すみません。。SpecialCells(12)が抜けていました。
しかし、うまく抽出できません。
どうしてでしょうか?

▼Kein さん:
>もう一度、私の書いたサンプルをよーく見て下さい。あなたがUPしたコードは、
>肝心な"抽出範囲を"コピーする、という処理になってません。

【18557】Re:オートフィルタについて
回答  Kein  - 04/9/29(水) 15:38 -

引用なし
パスワード
   抽出がうまくいかない可能性については、検索値の書式が問題である可能性が
大きいです。仮に数値の 1 を %表示にして小数点以下まで出す書式だと、
単純な文字列の比較ではダメだったと思います。その上、%を全角にしていたら
ますます予想不可能ですね。いちおう以下のコードでテストしてみて下さい。


  Dim MyR As Range

  Set MyR = Range("F7", Range("F65536").End(xlUp))
  Range("F6", Range("F65536").End(xlUp)) _
  .AutoFilter Field:=1, Criteria1:="100.0%"
  On Error Resume Next
  MyR.SpecialCells(12).EntireRow.Copy Sheets("作業済").Range("A1")
  ActiveSheet.AutoFilterMode = False
  Set MyR = Nothing

どうしても抽出が出来ないようなら、フィルターを止めて検索範囲をループで
見ていって、Textプロパティで判定するのが確実です。
シートをループして処理するのは、その先の話になりますが

Dim i As Integer

For i = 1 To 10
  With Sheets("データ" & i)
   処理
  End With
Next i

というような構造にするだけです。

【18565】Re:オートフィルタについて
質問  xyz  - 04/9/29(水) 21:02 -

引用なし
パスワード
   できました。
それで、
各シートのデータを作業済シートへ準じ貼り付けていくに当たって、
常に2行づつ空けて貼り付けていくのはどのようにするのでしょうか?

【18581】Re:オートフィルタについて
回答  Kein  - 04/9/30(木) 8:42 -

引用なし
パスワード
   >2行づつ空けて
Sheets("作業済").Range("A65536").End(xlUp).Offset(2)
に対して貼り付ける、という書き方もありますが、これだとA3から表示されることに
なります。A1からとしたい場合は、カウンタ変数を使えば良いでしょう。

Sub Test()
  Dim i As Integer, x As Long
  Dim MyR As Range

  Application.ScreenUpdating = False: x = 1
  For i = 1 To 10
   With Sheets("データ" & i)
     Set MyR = .Range("F7", .Range("F65536").End(xlUp))
     .Range("F6", .Range("F65536").End(xlUp)) _
     .AutoFilter Field:=1, Criteria1:="100.0%"
     On Error Resume Next
     MyR.SpecialCells(12).EntireRow _
     .Copy Sheets("作業済").Cells(x, 1)
     .AutoFilterMode = False
   End With
   Set MyR = Nothing: Err.Clear: x = x + 2
  Next i
  Application.ScreenUpdating = True
End Sub

【18673】Re:オートフィルタについて
質問  xyz  - 04/10/5(火) 10:37 -

引用なし
パスワード
   返事が遅くなり大変申し訳ありません。
ご教授の内容を試させていただきました。それで、
ワークシートコレクションについてですが、
今回の事例はシート名が「データ1」などという
ものでしたが、これが、全都道府県(46個)の名前のシート、
例えば「東京」「京都」という名前になると
どのようにFORループを作ればいいのでしょうか?
なお、全都道府県名のシートの他にも、いくつか
シートがあります。これらのシートは、FORループの
対象外としたいです。
よろしくお願いします。

【18674】Re:オートフィルタについて
回答  Kein  - 04/10/5(火) 11:08 -

引用なし
パスワード
   >全都道府県名のシートの他にも、いくつかシート
仮にこれらのシート名が、Sheet1, Sheet2, Sheet3 であるとすれば

Sub Test()
  Dim WS As Worksheet  
  Dim x As Long
  Dim MyR As Range

  Application.ScreenUpdating = False: x = 1
  For Each WS In Worksheets
   Select Case WS.Name
     Case "Sheet1", "Sheet2", "Sheet3", "作業済"
     Case Else
      Set MyR = WS.Range("F7", WS.Range("F65536").End(xlUp))
       WS.Range("F6", WS.Range("F65536").End(xlUp)) _
       .AutoFilter Field:=1, Criteria1:="100.0%"
       On Error Resume Next
       MyR.SpecialCells(12).EntireRow _
       .Copy Sheets("作業済").Cells(x, 1)
       WS.AutoFilterMode = False
      Set MyR = Nothing
      Err.Clear: x = x + 2
   End Select
  Next
  Application.ScreenUpdating = True
End Sub

【18676】Re:オートフィルタについて
質問  xyz  - 04/10/5(火) 15:18 -

引用なし
パスワード
   作業済シートへ貼り付けはできました。
しかし、最初に貼り付けたデータの3行目から
次のデータが貼り付けられます。
データが重なることなく、次のデータを貼り付ける際には、
2行空けたいのです。
なお、当方の都合により作業済シートには、表題項目を
6行目まで入れることになり、つまり、貼り付けは
7行目からとなります。X=7としたら、とんでも
ないことになりました。
宜しくお願い致します。

【18687】Re:オートフィルタについて
回答  Kein  - 04/10/5(火) 17:46 -

引用なし
パスワード
   Sub Test()
  Dim WS As Worksheet, Sh As Worksheet  
  Dim MyR As Range

  Set Sh = Worksheets("作業済")
  Application.ScreenUpdating = False
  For Each WS In Worksheets
   Select Case WS.Name
     Case "Sheet1", "Sheet2", "Sheet3", "作業済"
     Case Else
       Set MyR = WS.Range("F7", WS.Range("F65536").End(xlUp))
       WS.Range("F6", WS.Range("F65536").End(xlUp)) _
       .AutoFilter Field:=1, Criteria1:="100.0%"
       On Error Resume Next
      If IsEmpty(Sh.Range("A7").Value) Then
        MyR.SpecialCells(12).EntireRow.Copy Sh.Range("A7")
      Else
        MyR.SpecialCells(12).EntireRow _
        .Copy Sh.Range("A65536").End(xlUp).Offset(3)
      End If
       WS.AutoFilterMode = False
       Set MyR = Nothing: Err.Clear
   End Select
  Next
  Set Sh = Nothing
  Application.ScreenUpdating = True
End Sub

で、どうでしょーか ?

【18725】Re:オートフィルタについて
質問  xyz  - 04/10/7(木) 15:44 -

引用なし
パスワード
   ▼Kein さん,こんにちは。
返事が遅くなりまして申し訳ありません。
ご教授の内容を確認させていただきましたが、
出来ました!しかし、これを0.0%を条件に抽出すると
違ったデータが抽出されたり、0.0%のデータが抽出されたりで
うまくいきません。色々勉強はしてみましたが、分からずじまいです。
何故なのでしょうか?ちなみに、各都道府県のシートにあるデータは、
他のファイルをリンクしています。そして、リンクする際に、
「%」が付いていないデータがあるので、そのデータに対しては
表示形式を
 [赤][=100]##0.0"%";[青][=0]##0.0"%";##0.0"%"
に定義しています。これらが起因しているのでしょうか?
宜しくお願い致します。

【18745】Re:オートフィルタについて
回答  Kein  - 04/10/8(金) 10:28 -

引用なし
パスワード
   >0.0%を条件に抽出すると
>違ったデータが抽出されたり、0.0%のデータが抽出されたりで
確かこのスレッドの始めの方にも書いておいたはずですが、パーセンテージや日付を
フィルターするのは、とても厄介なのです。なので確実にやろうと思ったら、表の
右隣りの空白列に数式(例えば =IF(A1="100.0%",1,"") など)を入れて、そこを
検索条件 1 でフィルターするとか、一工夫する必要があるでしょう。
こちらにはデータの状況が、完全には分からないので、ご自分で試してみて下さい。

【18877】Re:オートフィルタについて
お礼  xyz  - 04/10/15(金) 13:09 -

引用なし
パスワード
   返事が大変遅くなりすみませんでした。
フィルターがうまくいかないので、IF関数を用いて
以下のように置換えた「1」をフィルターしましたが
同じ結果でした。又、FORループで1件づつ検索しても
だめですね。どうやっても分からないので、この質問に
ついては、あきらめます。今後、自分で試行錯誤して
みます。
ということで、色々ご相談にのっていただき
ありがとうございました。

=IF(G1="0.0%",1,"")

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