Excel VBA質問箱 IV

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

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


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

【62674】フィルター後、visibleな行のみ保存するには にしもり 09/8/21(金) 10:51 質問[未読]
【62675】Re:フィルター後、visibleな行のみ保存する... Yuki 09/8/21(金) 14:49 発言[未読]
【62676】Re:フィルター後、visibleな行のみ保存する... にしもり 09/8/21(金) 15:36 質問[未読]
【62677】Re:フィルター後、visibleな行のみ保存する... Yuki 09/8/21(金) 15:43 発言[未読]
【62678】Re:フィルター後、visibleな行のみ保存する... にしもり 09/8/21(金) 16:28 質問[未読]
【62679】Re:フィルター後、visibleな行のみ保存する... Yuki 09/8/21(金) 18:16 発言[未読]
【62680】Re:フィルター後、visibleな行のみ保存する... にしもり 09/8/21(金) 22:53 お礼[未読]
【62686】Re:フィルター後、visibleな行のみ保存する... にしもり 09/8/24(月) 11:14 質問[未読]
【62687】Re:フィルター後、visibleな行のみ保存する... Yuki 09/8/24(月) 11:54 発言[未読]
【62691】Re:フィルター後、visibleな行のみ保存する... にしもり 09/8/24(月) 17:50 お礼[未読]

【62674】フィルター後、visibleな行のみ保存する...
質問  にしもり  - 09/8/21(金) 10:51 -

引用なし
パスワード
   こんにちは。 
或るエクセルファイルの19列目で、「協力」を含み「お断り」を含まないものを抽出しています。

 Selection.AutoFilter Field:=19, Criteria1:="=*協力*", Operator:=xlAnd, _
    Criteria2:="<>*お断り*"

1.フィルターをかけた結果、該当するレコードが0件の場合は、そのファイルはもはや必要がないのでファイル自体をDeleteしたいです。
2.該当するレコードが有ればタイトル行を含むvisibleな行のみ残して、フィルターを解除してSaveしたいです。
そのようなことは可能でしょうか?
ぜひアドバイスをお願いいたします。

【62675】Re:フィルター後、visibleな行のみ保存す...
発言  Yuki  - 09/8/21(金) 14:49 -

引用なし
パスワード
   ▼にしもり さん:
こんな感じですか?


Sub TESTf()
  Dim varFnm As Variant
  Dim wb   As Workbook
  Dim rng   As Range
  Dim ws   As Worksheet
  Dim shtName As String
  
  varFnm = Application.GetOpenFilename("Excel (*.xls), *.xls")
  If varFnm = False Then Exit Sub
  
  Set wb = Workbooks.Open(varFnm)
  ' とりあえず一番左にシートを追加
  Set ws = wb.Worksheets.Add(Before:=wb.Worksheets(1))
  ' 2番目になったけど本当は1番目のシート
  With wb.Worksheets(2)
    shtName = .Name
    Application.DisplayAlerts = False
    .AutoFilterMode = False
    With .Range("A1").CurrentRegion
      .AutoFilter Field:=19, Criteria1:="=*協力*", _
         Operator:=xlAnd, Criteria2:="<>*お断り*"
      Set rng = .SpecialCells(xlCellTypeVisible)
      ' 行数が2行以上(1行面はタイトル)の時
      If rng.Rows.Count > 1 _
      Or rng.Areas.Count > 1 Then
        rng.Copy ws.Range("A1")
        '該当のシートを削除
        wb.Worksheets(2).Delete
        ' 追加したシートをReName
        ws.Name = shtName
      Else
        ' 無かったらファイルを削除
        MsgBox "None Data"
        Application.DisplayAlerts = False
        wb.Close False
'        Application.Wait Now + TimeValue("0:00:01")
        Kill varFnm
      End If
    End With
    Application.DisplayAlerts = True
  End With
End Sub

【62676】Re:フィルター後、visibleな行のみ保存す...
質問  にしもり  - 09/8/21(金) 15:36 -

引用なし
パスワード
   ▼Yuki さん:
ありがとうございます!
今回は無理かもしれないとだめもとで投稿したのに、わたくしのほぼ希望のものができ驚きです。
ほぼ、と言ったのは実はタイトル行が2行だからです。すみません。
すこし変えて実行してみましたが、協力を含む場合もno dataと出てしまいます。
変えたところが間違っていますでしょうか。


<略>
'↓A1をA2に
 With .Range("A2").CurrentRegion
      .AutoFilter Field:=19, Criteria1:="=*協力*", _
         Operator:=xlAnd, Criteria2:="<>*お断り*"
      Set rng = .SpecialCells(xlCellTypeVisible)
      ' 行数が3行以上(1−2行目はタイトル)の時
      '↓1を2に
      If rng.Rows.Count > 2 _
      Or rng.Areas.Count > 2 Then
      '↓A1をA2に
       rng.Copy ws.Range("A2)
<略>

【62677】Re:フィルター後、visibleな行のみ保存す...
発言  Yuki  - 09/8/21(金) 15:43 -

引用なし
パスワード
   ▼にしもり さん:
>▼Yuki さん:
>ありがとうございます!
>今回は無理かもしれないとだめもとで投稿したのに、わたくしのほぼ希望のものができ驚きです。
>ほぼ、と言ったのは実はタイトル行が2行だからです。すみません。
>すこし変えて実行してみましたが、協力を含む場合もno dataと出てしまいます。
>変えたところが間違っていますでしょうか。
>

多分
>Or rng.Areas.Count > 2 Then
Or rng.Areas.Count > 1 Then のままで宜しいです。

最初に rng の行数が2行以上かって聞いて
その後に rng.areaの数を聞いています。
rng.areaが1より大きいということはDataがあるということです。

【62678】Re:フィルター後、visibleな行のみ保存す...
質問  にしもり  - 09/8/21(金) 16:28 -

引用なし
パスワード
   ▼Yuki さん:
次のようにしました。

<略>
'↓↓A1のまま
 With .Range("A1").CurrentRegion
      .AutoFilter Field:=19, Criteria1:="=*協力*", _
         Operator:=xlAnd, Criteria2:="<>*お断り*"
      Set rng = .SpecialCells(xlCellTypeVisible)
      ' 行数が3行以上(1−2行目はタイトル)の時
      '↓1を2に
      If rng.Rows.Count > 2 _
     '↓1のまま
      Or rng.Areas.Count > 1 Then
      '↓A1のまま
       rng.Copy ws.Range("A1")
<略>

もともとフィルターを2行目でかけたいのですが
上記のようにすると1行目でかかってしまうようです。
つまり2行目が、invisibleになるため、2行目もコピペしたいのにコピペの対象にならないようです。
2行目をvisibleにするにはどうしたら宜しいでしょうか。

【62679】Re:フィルター後、visibleな行のみ保存す...
発言  Yuki  - 09/8/21(金) 18:16 -

引用なし
パスワード
   ▼にしもり さん:
>▼Yuki さん:
>
最初に見出し行を貼り付けてからにしました。
変更して下さい。
  With wb.Worksheets(2)
    ' 見出し行をコピー
    .Rows("1:2").Copy ws.Range("A1")
    shtName = .Name
    Application.DisplayAlerts = False
    .AutoFilterMode = False
    With .Range("A1").CurrentRegion
      .AutoFilter Field:=19, Criteria1:="=*協力*", _
         Operator:=xlAnd, Criteria2:="<>*お断り*"
      Set rng = .SpecialCells(xlCellTypeVisible)
      ' 行数が2行以上(1行目はタイトル)の時
      If rng.Rows.Count > 1 _
      Or rng.Areas.Count > 1 Then
        ' 見出し行とる
        Set rng = .Offset(2).Resize(.Rows.Count - 2).SpecialCells(xlCellTypeVisible)
        ' 3行目に貼り付ける
        rng.Copy ws.Range("A3")
        '該当のシートを削除
        wb.Worksheets(2).Delete
        ' 追加したシートをReName
        ws.Name = shtName
      Else
        ' 無かったらファイルを削除
        MsgBox "None Data"
        Application.DisplayAlerts = False
        wb.Close False
'        Application.Wait Now + TimeValue("0:00:01")
        Kill varFnm
      End If
    End With
    Application.DisplayAlerts = True
  End With

【62680】Re:フィルター後、visibleな行のみ保存す...
お礼  にしもり  - 09/8/21(金) 22:53 -

引用なし
パスワード
   ▼Yuki さん:
できましたが絶対に独力ではできませんでした。
深く感謝申し上げます。

【62686】Re:フィルター後、visibleな行のみ保存す...
質問  にしもり  - 09/8/24(月) 11:14 -

引用なし
パスワード
   ▼Yuki さん:

こんにちは。  
まことにすみません、出来たと思ったのですができてませんでした。

     .AutoFilter Field:=19, Criteria1:="=*協力*", _
         Operator:=xlAnd, Criteria2:="<>*お断り*"
      Set rng = .SpecialCells(xlCellTypeVisible)


このAutofilterが1行目にかかってしまいます。
というのはspread sheetがこんなふうになっているからです。


A    B         C
Title  
ID  Phone        Item
1  03-1111-2222  Book
2  03-1111-2223  CD
3  03-1111-2224 DVD

(実際は3列でなく、もっと21フィールドまであります)

Autofilterを2行目(ID  Phone        Itemの行)にかけるにはどうすばよろしいでしょうか。

【62687】Re:フィルター後、visibleな行のみ保存す...
発言  Yuki  - 09/8/24(月) 11:54 -

引用なし
パスワード
   ▼にしもり さん:
>
>このAutofilterが1行目にかかってしまいます。
>というのはspread sheetがこんなふうになっているからです。
>
>
>A    B         C
>Title  
>ID  Phone        Item
>1  03-1111-2222  Book
>2  03-1111-2223  CD
>
>Autofilterを2行目(ID  Phone        Itemの行)にかけるにはどうすばよろしいでしょうか。

こんにちは。
With .Range("A1").CurrentRegion

With .Range("A1").CurrentRegion.Offset(1).Resize( _
   .Range("A1").CurrentRegion.Rows.Count - 1)
に変えればよろしいかと

【62691】Re:フィルター後、visibleな行のみ保存す...
お礼  にしもり  - 09/8/24(月) 17:50 -

引用なし
パスワード
   ▼Yuki さん:
ありがとうございました。
できました。

Yukiさんのロジックをトレースしてみました。
小生の実力は、以前よりはましだと思いますが、
まだまだ解っていないことだらけだと痛感して居ります。

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