[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『「オートフィルタの全ての結果を別々シートに」[モモ] について』(てんちゃん)
投稿
[[20030726021552]] 『オートフィルタの全ての結果を別々シートに』(モモ)
について...
過去ログを見て、質問があり投稿しました。
やまさんの質問と同一になりますが、それに対する具体的な回答が見当たらなかったので投稿します。
モモさんが質問した内容でケンさんが回答したマクロで無事できました。
そこで、追加で作業したいことがあります。
1.@このマクロを走らせて別々にシート分けした後に、それぞれ分けられたシートで集計形式(エクセルのデータの小計を入れたい)にしたい
2.上記1のあとにその表のセル全体に縦横全部黒い罫線を引きたい
(エクセルならctrl +aでセルが入っている表を選択し縦横全部黒線をいれるのですが)
A1からM列までデータが入っており、M列の企業名をオートフィルタで選択しNEWシートへA1からMまでコピーしています。
NEWシートへコピーしたあとの集計設定は、エクセルのデータの小計で言うと、
グループ基準がA列の仕入先、集計の方法は合計、集計するフィールドはI列の支払金額、現在の小計をすべて置き換えるにチェック、集計行をデータの下に挿入するにチェックしOK選択した状態と同じものにしたいです。
そういう式以下ののマクロに追加可能ですか。
ご教示お願いいたします。
Sub test()
Dim LastR As Long, i As Long
Application.ScreenUpdating = False
LastR = Cells(Application.Rows.Count, "M").End(xlUp).Row
Range("M1:M" & LastR).AdvancedFilter Action:=xlFilterInPlace, Unique:=True
Range("M2:M" & LastR).Copy Cells(LastR + 2, 13)
ActiveSheet.ShowAllData
For i = Cells(Application.Rows.Count, "M").End(xlUp).Row To LastR + 2 Step -1
Sheets.Add After:=Worksheets("加工")
ActiveSheet.Name = Sheets("加工").Cells(i, 13).Value
Sheets("加工").Select
Columns("A:M").AutoFilter Field:=13, Criteria1:=Sheets("加工").Cells(i, 13).Value
Range("A1:M" & LastR).Copy Sheets(Sheets("加工").Cells(i, 13).Value).Range("A1")
Next i
Columns("A:M").AutoFilter
Range("M" & LastR + 2 & ":M" & Cells(Application.Rows.Count, "M").End(xlUp).Row).ClearContents
Application.ScreenUpdating = False
End Sub
< 使用 Excel:Office365、使用 OS:Windows10 >
こんにちは! 記録ばっかりお勧めして申し訳ございませんが、取り敢えず記録出来るのなら記録してそれを叩き台にされてみてはどうでしょうか?
>グループ基準がA列の仕入先、集計の方法は合計、 >集計するフィールドはI列の支払金額、 >現在の小計をすべて置き換えるにチェック、 >集計行をデータの下に挿入するにチェックしOK選択した状態 >と同じものにしたいです。
他にいい回答がつくといいですね(^^; (SoulMan) 2021/04/03(土) 14:33
>Excel:Office365
そのバージョンだとUNIQUE関数が使えるんじゃないかと思うんですが、 どこかの空いているセルに = U と1文字を入力しただけで、UNIQUE関数が候補の中に現れないですか?
(半平太) 2021/04/03(土) 15:33
>グループ基準がA列の仕入先
それに関してですが、データはこの処理をする前から 仕入先を基準に並べ替えが済んでいる状態なんでしょうか?
(半平太) 2021/04/03(土) 16:09
For i = Cells(Application.Rows.Count, "M").End(xlUp).Row To LastR + 2 Step -1
Sheets.Add After:=Worksheets("加工")
ActiveSheet.Name = Sheets("加工").Cells(i, 13).Value
Sheets("加工").Select
Columns("A:M").AutoFilter Field:=13, Criteria1:=Sheets("加工").Cells(i, 13).Value
Range("A1:M" & LastR).Copy Sheets(Sheets("加工").Cells(i, 13).Value).Range("A1")
ActiveSheet. Range("A1").Select
Selection.Subtotal GroupBy:1 ,Function:=xl Sum,TotalList:=Array(9), _ Replace:=True, Page Breaks:=False, Summary BelowData:=True
Next i
(てんちゃん) 2021/04/03(土) 17:12
また、2つ目のコメントもありがとうございます!
>グループ基準がA列の仕入先
ですが、繰り返しのデータ処理をする手前でA列で並べ替えしております。
みなさん、本当にいろいろアドバイスありがとうございます。
またアドバイスありましたらどんなことでも構いませんのでよろしくお願いします。
(てんちゃん) 2021/04/03(土) 17:19
シートのレイアウトとシートの関係がよくわからないのでほとんどブラインドExcelですけど。。。
もう少し変数を使うなどしてSheetからちゃんと明示するようにした方が良いと思います。
それとシートを追加するのは
If Not Evaluate("=ISREF('" & Sheets("加工").Cells(i, "M").Value & "'!A1)") Then Sheets.Add.Name = Sheets("加工").Cells(i, "M").Value
がお勧めです。
これでも↓動かないんですけど、、、何かのヒントになれば幸いです。。。
Option Explicit
Sub kk()
Dim LastR As Long
Dim i As Long
LastR = 30
With Sheets("加工")
For i = .Cells(Rows.Count, "M").End(xlUp).Row To LastR + 2 Step -1
If Not Evaluate("=ISREF('" & Sheets("加工").Cells(i, "M").Value & "'!A1)") Then Sheets.Add.Name = Sheets("加工").Cells(i, "M").Value
.Columns("A:M").AutoFilter Field:=13, Criteria1:=Sheets("加工").Cells(i, 13).Value
With Sheets(Sheets("加工").Cells(i, "M").Value)
.Range("A1").Subtotal groupBy:=1, Function:=xlSum, TotalList:=Array(9), Replace:=True, PageBreaks:=False, SummaryBelowData:=True
End With
Next i
End With
End Sub
(SoulMan) 2021/04/03(土) 18:16
よかったらCellsやRangeの前を空白にしないでSheet名を付けてみてください。 こちらで編集してみます。 (SoulMan) 2021/04/03(土) 19:04
>=Uを試してみたのですがマクロも関数も初心者のため、なんだかよくわかりませんでした。
昔のコードでは、「企業名」の一覧を作る為にAdvancedFilterが使われているのですが、 最新版のエクセルなら、そんなことをする必要もなくなっているので、 果たしてそちらのエクセルは最新版なのかどうか確認したかったのですが。。
そう言う観点からすると、オートフィルタも使う必要がないかも知れない。
とにかく最新版かどうか知りたいので、どこか空いているセルに
=SEQUENCE(3)
と入れてみてください。 それで、そのセルから下に1,2,3と自動的に 出るかどうか確認していただけませんか。
(半平太) 2021/04/03(土) 19:16
(てんちゃん) 2021/04/04(日) 09:51
>UNIQUE関数またはSEQUENCE関数はこのあとどのように使えば良いでしょうか。
1.UNIQUE関数は、AdvancedFilter の代わりに使います。 2.SEQUENCE関数は、バージョンが最新版か確かめる為だけに出した話題なので、忘れてください。 3.AutoFilterは使うことにします。1行目のタイトルもコピーして来れて便利と感じたので。
Sub test()
Dim LastR As Long, i As Long
Dim newSh As Worksheet
Dim Companies
Application.ScreenUpdating = False
LastR = Cells(Application.Rows.Count, "M").End(xlUp).Row
Companies = Application.unique(Range("M2:M" & LastR))
For i = UBound(Companies) To 1 Step -1
Sheets.Add After:=Worksheets("加工")
Set newSh = ActiveSheet
newSh.Name = Companies(i, 1)
With Sheets("加工")
.AutoFilterMode = False
.Columns("A:M").AutoFilter Field:=13, Criteria1:=Companies(i, 1)
.Range("A1:M" & LastR).Copy newSh.Range("A1")
End With
additionalOrder newSh
Next i
Sheets("加工").AutoFilterMode = False
Application.ScreenUpdating = True
End Sub
Private Sub additionalOrder(newSh As Worksheet)
Dim newShLastRW As Long
newShLastRW = newSh.Cells(newSh.Rows.Count, "A").End(xlUp).Row
With newSh.Range("A1:M" & newShLastRW)
.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(9), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
End With
newShLastRW = newSh.Cells(newSh.Rows.Count, "A").End(xlUp).Row
With newSh.Range("A1:M" & newShLastRW).Borders
.LineStyle = xlContinuous
.Weight = xlThin
End With
End Sub
(半平太) 2021/04/04(日) 11:17
こんにちは! 私のはただただトピ主さんの記録コードを走らせたかっただけなので 半平太 さんの方で進めてください。
>空白省き、試してみます! そうではなくて必ず Range や Cellsの前にSheets名を付けてください。 という意味です。
半平太 さんのコードがすごく参考になると思います。 では、、では、、どうも失礼しました。m(__)m (SoulMan) 2021/04/04(日) 13:24
追加でわがまま聞いてください、お願いします。
加工シートの企業名はマスタシートからvlookupで引っ張ってきており、マスタにないものが#N/Aになります。
#N/Aがあると、実行時エラー"13" 型が一致しません。とでてしまいます。
デバッグはnewSh.Name = Companies(i, 1)が黄色くなります。
#N/Aがあった場合の対処方法なにかありましたらご教示お願いします。
(てんちゃん) 2021/04/04(日) 14:02
Range や Cellsの前にSheets名を付けてください。 という意味です。
なるほど、そうなのですね。わかっておらず、すみませんでした。
マクロの記録を使っていたため、変数の宣言など知らずにやっていましたがみなさんに教えていただいたり自分で調べたりし少し理解ができました。
本当にみなさんお優しいです。
感謝いたします。
(てんちゃん) 2021/04/04(日) 14:10
>#N/Aがあった場合の対処方法なにかありましたら
#N/Aがあった場合(=マスタに無い企業)はどうしたいのか、 その希望を述べて頂かないと始まらないですけども。
※例えば、その企業(?)は無視して何も処理しないで欲しいとか。 個人的には、マスタを修正するのが本筋だと思っているんですが。。
(半平太) 2021/04/04(日) 14:24
半平太さんが作られたコードのあとにメッセージボックスで"完了しました"と出るようにしています。
#N/Aがあった場合、メッセージボックスで知らせることはできますか?
IF関数でできそうですが、コードのどこに挿入したらいいかがわかりません。
よろしくお願いします。
(てんちゃん) 2021/04/04(日) 16:30
Sub test()
Dim LastR As Long, i As Long
Dim newSh As Worksheet
Dim Companies
Dim msg As String
Application.ScreenUpdating = False
LastR = Cells(Application.Rows.Count, "M").End(xlUp).Row
Companies = Application.unique(Range("M2:M" & LastR))
For i = UBound(Companies) To 1 Step -1
If WorksheetFunction.IsNA(Companies(i, 1)) Then
msg = "#N/A あり !" & vbLf
Else
Sheets.Add After:=Worksheets("加工")
Set newSh = ActiveSheet
newSh.Name = Companies(i, 1)
With Sheets("加工")
.AutoFilterMode = False
.Columns("A:M").AutoFilter Field:=13, Criteria1:=Companies(i, 1)
.Range("A1:M" & LastR).Copy newSh.Range("A1")
End With
additionalOrder newSh
End If
Next i
Sheets("加工").AutoFilterMode = False
Application.ScreenUpdating = True
MsgBox msg & "完了しました。"
End Sub
(半平太) 2021/04/04(日) 16:59
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.