Excel (VBA) |
|
(macOS 12.0 : Excel 2016)
複数シートから特定の日次のみを集計シートへ移動させたい!
投稿日時: 24/07/25 13:57:16
投稿者: Mow
|
---|---|
こんにちは!
|
投稿日時: 24/07/25 15:47:08
投稿者: simple
|
|
---|---|
VBA二日目ですか。すごい長足の進歩ですね。
.Range(.Cells(2, 1), .Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1)などと書いてシートの操作はしないほうが普通でしょうか。 |
投稿日時: 24/07/25 15:53:24
投稿者: Mow
|
|
---|---|
ご教授いただきありがとうございます。
|
投稿日時: 24/07/25 17:49:40
投稿者: simple
|
|
---|---|
該当データが無いときに、今のままだと全データがコピーされる仕様です。
.Range("A1").AutoFilter field:=5, Criteria1:=Date1 If .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Rows.Count >= 2 Then .Range(.Cells(2, 1), .Cells(lRow, lCol)).Copy Worksheets(1).Cells(lRow2, 1) End Ifなどとしてください。 |
投稿日時: 24/07/25 17:54:24
投稿者: simple
|
|
---|---|
日付指定は 2024/7/25 の形式が良いと思います。
|
投稿日時: 24/07/25 19:24:42
投稿者: simple
|
|
---|---|
24/07/25 17:49:40のコードは間違っていました。失礼しました。
Sub matome() Dim i As Long Dim lRow As Long, lCol As Long, lRow2 As Long Dim rng As Range, rng2 As Range Dim Date1 Application.ScreenUpdating = False Date1 = InputBox(prompt:=" 検索したい日付を書いてください。(例2024/7/26) ") Worksheets(1).Cells.ClearContents Worksheets(2).Range("1:1").Copy Worksheets(1).Range("A1") For i = 2 To Worksheets.Count With Worksheets(i) If .AutoFilter Is Nothing Then .AutoFilterMode = False '★ lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(1, Columns.Count).End(xlToLeft).Column Set rng = .Range(.Cells(1, 1), .Cells(lRow, lCol)) Set rng2 = .Range(.Cells(2, 1), .Cells(lRow, lCol)) If lRow >= 2 Then lRow2 = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row + 1 rng.AutoFilter field:=5, Criteria1:=Date1 If Intersect(rng, .Columns("A")).SpecialCells(xlCellTypeVisible) _ .Count >= 2 Then rng2.Copy Worksheets(1).Cells(lRow2, 1) End If .AutoFilterMode = False End If End With Next i Worksheets(1).Activate Range("A1").Select Application.ScreenUpdating = True End Sub |
投稿日時: 24/07/26 06:37:16
投稿者: simple
|
|
---|---|
Autofilterでの日付の扱いは、Excelのversionによっても変動があり、微妙な話のようです。
Dim Date1 As String Dim fmt As String Date1 = InputBox(prompt:=" 検索したい日付を書いてください。(例 24/7/26) ") fmt = Worksheets(2).Range("E2").NumberFormatLocal ' 表示形式を取得としておき、 rng.AutoFilter field:=5, Criteria1:=Format(DateValue(Date1), fmt)とすればうまくいくと思います。 ( DateValue関数の使用を前提とすれば、24/7/26という入力も可能でした。) |
投稿日時: 24/07/26 09:43:01
投稿者: Mow
|
|
---|---|
ご教授いただきありがとうございます!
|
投稿日時: 24/07/26 10:08:40
投稿者: mattuwan44
|
|
---|---|
必要なものをコピペするという考え方もありますが、
Option Explicit Sub test() Dim wsh As Worksheet Dim wshResults As Worksheet Dim i As Long, ixRow As Long Dim Rng As Range Dim myDate As Variant Set wshResults = Worksheets(1) wshResults.UsedRange.ClearContents ixRow = 3 '各データシートに対してコピペを繰り返し1つのシートに集約 For i = 2 To Worksheets.Count 'データセル範囲取得 Set wsh = Worksheets(i) With wsh.Range("A1").CurrentRegion Set Rng = Intersect(.Cells, .Offset(1)) End With 'タイトル行のコピー If i = 2 Then Rng.Rows(0).Copy wshResults.Cells(ixRow, 1) End If 'データのコピー Rng.Copy wshResults.Cells(ixRow, 1) '次のコピーの行番号 ixRow = ixRow + Rng.Rows.Count Next '日付の指定 Do myDate = InputBox("日付を入力(例2024/7/26)") If myDate = False Then Exit Sub Loop Until IsDate(myDate) = True myDate = CDate(myDate) '不要データを抽出してクリア With wshResults.Cells(1).CurrentRegion .AutoFilter 5, ">" & myDate, xlOr, "<" & myDate If .Columns(1).SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then .Offset(1).ClearContents .Sort key1:=.Cells(1, 5), Header:=xlYes '並び替えて空白を詰める End If .AutoFilter End With End Sub ※動作確認してません。バグがあったらご容赦を。。。 |
投稿日時: 24/07/26 10:38:22
投稿者: Mow
|
|
---|---|
ご教授いただきありがとうございます!
|
投稿日時: 24/07/26 10:57:15
投稿者: simple
|
|
---|---|
引用: エラーか何かになるのですか?それを検証して改善する必要は無いのですか? ともかく動きさえすればよく、抽出漏れがあっても構わない、ということであれば、 With Worksheets(i) If .Name <> "Sheet1" Then ' (中略) End If End With |
投稿日時: 24/07/26 11:10:09
投稿者: Mow
|
|
---|---|
simple さんの引用:引用: ご連絡いただきありがとうございます。 実行時エラー'1004が発生いたします。 オブジェクトAutoFilterのメソッド'Rangeが失敗しました。 rng.AutoFilter field:=5, Criteria1:=Format(DateValue(Date1), fmt) 上記の部分を指摘されます。 |
投稿日時: 24/07/26 11:23:37
投稿者: simple
|
|
---|---|
エラーになった状態のときに、
?rng.Addressと入力してEnterして、返ってくるアドレスを確認して下さい。 想定外のことが発生していませんか? # なお、?は入力ミスではありません。Debug.Printのエリアスです。そのまま使ってください。 |
投稿日時: 24/07/26 11:48:03
投稿者: Mow
|
|
---|---|
ご連絡ありがとうございます。
|
投稿日時: 24/07/26 12:03:38
投稿者: simple
|
|
---|---|
エラーになったシートの見出し行が一行目ではないのでは?
|
投稿日時: 24/07/26 12:33:37
投稿者: Mow
|
|
---|---|
ご教授いただいたとおり、データシートではございません。
|
投稿日時: 24/07/26 20:44:07
投稿者: mattuwan44
|
|
---|---|
>オブジェクトAutoFilterのメソッド'Rangeが失敗しました。
|
投稿日時: 24/07/27 13:06:01
投稿者: simple
|
|
---|---|
> ご教授いただいたとおり、データシートではございません。
For Each sh In Array("SheetA","SheetB","SheetC") set ws = worksheets(sh) ’.... Nextとする。 ( http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_data_matome.html あなたが最初に読んだサイトです。 シート名を指定して、その順序で処理をする参考コードが載せられています。 それを応用するだけです。) (3)逆に除外シートが少数なら、全体を繰り返し処理し、ループの内部で、除外することもできるでしょう。 If Not ( .Name = "SheetD" Or .Name = "SheetE" ) Then ' 処理実行 End If 【注意喚起】 他のサイトにマルチポストしてますね。 こちらでの回答をそのまま、さも自分で作成したかのようにアップして、 「できました」などと書いているのはいかがなものですか。 もしマルチをするのであれば、マルチポストしている旨を書き、一方の回答は別の方にも知らせるべきです。 そういう手間に耐えられないなら、最初からマルチポストなどしないでください。 |
投稿日時: 24/07/29 09:38:51
投稿者: Mow
|
|
---|---|
ご連絡いただきありがとうございます。
|
投稿日時: 24/07/29 10:41:21
投稿者: simple
|
|
---|---|
伝わってよかったです。
|