Excel VBA質問箱 IV

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

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


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

【44764】Excel2003でオートフィルタ後のコピーでエラー yata 06/11/30(木) 21:10 質問[未読]
【44800】Re:Excel2003でオートフィルタ後のコピーで... Kein 06/12/1(金) 16:51 回答[未読]
【44817】Re:Excel2003でオートフィルタ後のコピーで... yata 06/12/1(金) 21:57 質問[未読]
【44820】Re:Excel2003でオートフィルタ後のコピーで... Kein 06/12/1(金) 23:19 回答[未読]
【44823】Re:Excel2003でオートフィルタ後のコピーで... yata 06/12/2(土) 8:38 お礼[未読]

【44764】Excel2003でオートフィルタ後のコピーで...
質問  yata  - 06/11/30(木) 21:10 -

引用なし
パスワード
   こんばんわ
度々ご教授頂き有難うございます。

今回は、下記の説明がすっきり理解できません。分かりやすく教えていただけませんか?
----------------------------------------------------------------
マイクロソフトのsupport.microsoft.com/kb/905164/ja
VBA マクロで 1 行全体のコピーと貼り付けを実行する場合にこの問題を回避するには、データを含む行の部分だけをコピーするように VBA マクロのコードを変更します。たとえば、次に示すような VBA マクロ コードを使用します。
Range(Range("A" & ActiveCell.Row), Range("IV" & ActiveCell.Row).End(xlToLeft)).Select
----------------------------------------------------------------
2行目がフィールド行で、フィールド行ごとコピーしたいのですが 、貼り付けは出来ているのにエラーメッセージ1004が表示されます。
 strDate = TextBox1.Value  '入力された日付
 Sheets("元データ").Select
 Range("A2").AutoFilter Field:=3, Criteria1:=Format(strDate, "yy/m/d")

 Set FilData = Range("A2").CurrentRegion.SpecialCells(xlCellTypeVisible)
 FilData.Select
 Selection.Copy Destination:=Sheets("結果").Range("A1")
Excel2000ではこれで問題は無いのですが、
可視セルの範囲を
 MsgBox FilData.Address(0,0)
で見ると A2:Z5 A8:Z10 と離れているので都合が悪いのでしょうか?
A2:Z5 とフィールド行とくっついていればメッセージは表示されませんが、A2:Z2 A4:Z4でもメッセージは表示されてしまいます。
それで上のマイクロソフトの説明を参考に
Sheets("元データ").Select
 r=Range("A65536").End(xlUp).Row
Range("A2").AutoFilter Field:=3, Criteria1:=Format(strDate, "yy/m/d")
Set FilData = Range(Range("A2"),Range("Z" & r)).SpecialCells(xlCellTypeVisible)
FilData.Select
 Selection.Copy Destination:=Sheets("結果").Range("A1")
としてみましたがエラーメッセージがでます。
Destinationを取ったり、PasteSpecialを使ったりしてみましたがうまく行きません。
また、フィールド行とデータ抽出部分の2回に分けて貼り付けをしてもダメでした。
結局 On Error Resum Next を挟んで使用しています。
何とかいい方法が無いでしょうか

【44800】Re:Excel2003でオートフィルタ後のコピー...
回答  Kein  - 06/12/1(金) 16:51 -

引用なし
パスワード
   項目行を含めてコピーするなら
>Range("A2").CurrentRegion
より Sheets("元データ").AutoFilter.Range を使う方が適切な気もするけど、
私ならフィルターそのものを使わず、数式で判定して処理します。例えば・・

Dim strDate As String
Dim MyR As Range

strDate = TextBox1.Text
With Worksheets("元データ")
  With .Range("C2", .Range("C65536").End(xlUp)).Offset(, 253)
   .Formula = _
   "=IF($C2=DATEVALUE(" & """" & strDate & """" & "),1)"
   .Value = .Value
   .Cells(1).Value = 1
   If WorksheetFunction.Count(.Cells) > 1 Then
     Set MyR = .SpecialCells(2, 1).EntireRow
     Intersect(MyR, .Parent.Range("A2").CurrentRegion) _
     .Copy Worksheets("結果").Range("A1")
     Application.GoTo Worksheets("結果").Range("A1"), True
     Set MyR = Nothing
   Else
     MsgBox "該当する日付が見つかりません", 48
   End If
   .ClearContents
  End With
End With

【44817】Re:Excel2003でオートフィルタ後のコピー...
質問  yata  - 06/12/1(金) 21:57 -

引用なし
パスワード
   Keinさん こんばんわ
有難うございました。作業用セルを使うなんて考えもしませんでした。
またIntersect とGo Toメソッド勉強になりました。良く拝見するのですが今まで使用したことがありません。
頂いたコードでコピーはできるのですが、やはり「RangeクラスのCopyメソッドが失敗しました」のエラー表示が出ます。私のパソコンのせいでしょうか?
MyR とIntersect のアドレスを調べてみると 2:5,8:10 A2:Z5,A8:Z10
になっていて、張り付けのところで止まってしまいます。
もう一度お聞きしたいですが、Intersectで取り出した共通部分から
 Set KyotuR = Intersect(MyR, .Parent.Range("A2").CurrentRegion)
 AreaCnt = KyotuR.Areas.Count
として 素人考えですが、Union を使って1つにすることは出来ませんか?
配列は全く手が出ません。
>項目行を含めてコピーするなら
>>Range("A2").CurrentRegion
>より Sheets("元データ").AutoFilter.Range を使う方が適切な気もするけど、
Sheets("全データ").AutoFilter.Range.SpecialCells(xlCellTypeVisible)
有難うございます。勉強になりました。使用しました。
>私ならフィルターそのものを使わず、数式で判定して処理します。例えば・・
>
>Dim strDate As String
>Dim MyR As Range
>
>strDate = TextBox1.Text
>With Worksheets("元データ")
>  With .Range("C2", .Range("C65536").End(xlUp)).Offset(, 253)
>   .Formula = _
>   "=IF($C2=DATEVALUE(" & """" & strDate & """" & "),1)"
>   .Value = .Value
>   .Cells(1).Value = 1
>   If WorksheetFunction.Count(.Cells) > 1 Then
>     Set MyR = .SpecialCells(2, 1).EntireRow
ここで止まってしまいます。
     Intersect(MyR, .Parent.Range("A2").CurrentRegion) _
     .Copy Worksheets("結果").Range("A1")
>     Application.GoTo Worksheets("結果").Range("A1"), True
>     Set MyR = Nothing
>   Else
>     MsgBox "該当する日付が見つかりません", 48
>   End If
>   .ClearContents
>  End With
>End With

【44820】Re:Excel2003でオートフィルタ後のコピー...
回答  Kein  - 06/12/1(金) 23:19 -

引用なし
パスワード
   やはりエラーが出るのですか・・おかしいですね。
ならば分割されているコピー元を、Area毎ループで転記していくというコード
なら、大丈夫だと思います。こんな感じになります。

Dim strDate As String
Dim Sh As Worksheet
Dim MyR As Range
Dim i As Long

strDate = TextBox1.Text
Set Sh = Worksheets("結果")
With Worksheets("元データ")
  Sh.Rows(1).Value = .Rows(2).Value
  With .Range("C3", .Range("C65536").End(xlUp)).Offset(, 253)
   .Formula = _
   "=IF($C3=DATEVALUE(" & """" & strDate & """" & "),1)"
   If WorksheetFunction.Count(.Cells) > 0 Then
     Set MyR = Intersect(.SpecialCells(3, 1).EntireRow, _
     .Parent.Range("A2").CurrentRegion)
     For i = 1 To MyR.Areas.Count
      With MyR.Areas(i)
        Sh.Range("A65536").End(xlUp).Offset(1) _
        .Resize(.Rows.Count, .Columns.Count).Value = .Value
      End With
     Next i
     Application.Goto Sh.Range("A1"), True: Set MyR = Nothing
   Else
     MsgBox "該当する日付が見つかりません", 48
   End If
   .ClearContents
  End With
End With
Set Sh = Nothing

【44823】Re:Excel2003でオートフィルタ後のコピー...
お礼  yata  - 06/12/2(土) 8:38 -

引用なし
パスワード
   Keinさん お早うございます。
丁寧な回答を頂き有難うございました。ずいぶん遅くまで起きておられるのですね。
Copyを使わずにセル範囲そのままの値を設定するなんてしたことが無いので大変勉強になりました。
For Nextループの部分は、オートフィルターで抽出したものにも使用できました。
エラー表示は全くありません。
最終的に1行づつA列からZ列までコピーしなければならないのかと思っていました。
Areaごと値を移せれば大変効率的です。
結局Excel2003の場合は範囲が離れていれば、貼り付けはできているのにエラー表示がでるという事ですね。回避策としてはエリア毎に行わないといけないということが分かりました。これならCopyメソッドでもエラーになりません。
全て解決しました。有難うございました。

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