[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『生成されたシートにフィルターを最初から設置しておきたい。』(Lila)
いつもお世話になっております。
[[20151022153817]] 『別ブックを複数使用した部品交換率の表』(Lila)
こちらでβさんに頂いた以下のコード2つに、オートフィルターを設置するためのコード(Range("A4").AutoFilter)を追加したいのですが、何処に入れて良いのかが解りません・・・。
コード1の方はSheet2を生成しているこの箇所かなぁ・・・?とは思っているのですが・・・
【 Set shA = Workbooks("部品データベース.xlsm").Sheets("Sheet2") '商品別部品使用数(集約表)(★ブック名、シート名変更箇所)
Set shC = Workbooks("30-21 MTBF 機種別小分類.xlsx").Sheets("30-21 MTBF 機種別小分類") '稼働台数(★ブック名、シート名変更箇所) Set dicA = CreateObject("Scripting.Dictionary") Set dicC = CreateObject("Scripting.Dictionary") For Each c In shC.Range("A2", shC.Range("A" & Rows.Count).End(xlUp)) k = Format(c.Value, "yyyymm") & normalize(c.Offset(, 1).Value) '年月+集約コード dicC(k) = dicC(k) + c.Offset(, 2).Value '稼働台数 Next】
お手数ですが、ご教示ください。
よろしくお願い致します。
【コード1】
Function normalize(s As String) As String
normalize = WorksheetFunction.Clean(WorksheetFunction.Trim(s)) End Function
Sub 故障率2() Dim shA As Worksheet Dim shB As Worksheet Dim shC As Worksheet Dim c As Range Dim dicA As Object Dim dicC As Object Dim k As Variant Dim mCol As Long Dim mRow As Long Dim j As Long Dim sv As String Dim parts As String Dim yyyymm As String Dim n As Long Dim Sp As Shape
Application.ScreenUpdating = False Set shB = ThisWorkbook.Sheets("Sheet2") shB.Cells.Clear ThisWorkbook.Sheets("Sheet1").Cells.Copy shB.Range("A1") '故障部品データベース(★シート名変更箇所) For Each Sp In shB.Shapes Sp.Delete Next
Set shA = Workbooks("部品データベース.xlsm").Sheets("Sheet2") '商品別部品使用数(集約表)(★ブック名、シート名変更箇所) Set shC = Workbooks("30-21 MTBF 機種別小分類.xlsx").Sheets("30-21 MTBF 機種別小分類") '稼働台数(★ブック名、シート名変更箇所) Set dicA = CreateObject("Scripting.Dictionary") Set dicC = CreateObject("Scripting.Dictionary") For Each c In shC.Range("A2", shC.Range("A" & Rows.Count).End(xlUp)) k = Format(c.Value, "yyyymm") & normalize(c.Offset(, 1).Value) '年月+集約コード dicC(k) = dicC(k) + c.Offset(, 2).Value '稼働台数 Next With shA.Range("A1", shA.UsedRange) With .Offset(2, 1).Resize(.Rows.Count - 2, .Columns.Count - 1) For Each c In .Cells k = normalize(c.EntireRow.Cells(1).Value) & vbTab & normalize(c.EntireColumn.Cells(1).Value) '部品番号+集約コード dicA(k) = dicA(k) + c.Value '集約コード内部品数 Next End With End With With shB With .UsedRange mCol = .Columns.Count mRow = .Rows.Count End With For j = mCol - 11 To 5 Step -12 '最終ブロックの先頭列からE列まで 12列単位で処理 sv = normalize(.Cells(1, j).Value) '集約コード .Columns(j).Resize(, 6).Delete .Cells(1, j).Value = sv With .Range(.Cells(5, j), .Cells(mRow, j + 5)) For Each c In .Cells parts = normalize(c.EntireRow.Cells(1).Value) yyyymm = Format(c.EntireColumn.Cells(2).Value, "yyyymm") n = dicA(parts & vbTab & sv) * dicC(yyyymm & sv) If n = 0 Then c.Value = "" Else c.Value = c.Value / n End If Next .NumberFormatLocal = "0.00%" End With Next End With MsgBox "処理が完了しました。" End Sub
【コード2】
Sub 分割2()
Dim fSh As Worksheet Dim tSh As Worksheet Dim mCol As Long Dim mRow As Long Dim j As Long Dim x As Long Dim myCode As String Dim grpCode As String Dim grpList As Range Dim f As Range Dim dic As Object Dim shn As Variant Dim r As Range Dim d As Range Application.ScreenUpdating = False Set dic = CreateObject("Scripting.Dictionary") 'シート生成辞書 With Sheets("グループ").Range("A1").CurrentRegion Set grpList = .Offset(, 1).Resize(, .Columns.Count - 1) End With Set fSh = Sheets("Sheet2") '元シート With fSh.Range("A1", fSh.UsedRange) mCol = .Columns.Count mRow = .Rows.Count End With For j = 5 To mCol Step 6 '集約ブロックの先頭列を抽出 myCode = fSh.Cells(1, j).Value '集約コード Set f = grpList.Find(What:=myCode, LookAt:=xlWhole) If f Is Nothing Then MsgBox myCode & " のグループ登録がないので処理をスキップします" Else If WorksheetFunction.CountA(fSh.Cells(3, j).Resize(mRow - 2, 6)) > 0 Then '★ grpCode = f.EntireRow.Cells(1).Value 'グループコード If Not dic.exists(grpCode) Then Application.DisplayAlerts = False If IsObject(Evaluate("'" & grpCode & "'!A1")) Then Sheets(grpCode).Delete Application.DisplayAlerts = True Worksheets.Add After:=Worksheets(Worksheets.Count) Set tSh = ActiveSheet tSh.Name = grpCode fSh.Range("A1").Resize(mRow, Columns("P").Column).Copy 'セル幅コピー tSh.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False tSh.Cells.Clear fSh.Range("A1").Resize(mRow, 3).Copy tSh.Range("A1") dic(grpCode) = True Else Set tSh = Sheets(grpCode) End If With tSh.Range("A1", tSh.UsedRange) If .Columns.Count < 5 Then x = 5 Else x = .Columns.Count + 1 End If End With fSh.Cells(1, j).Resize(mRow, 6).Copy tSh.Cells(1, x) End If '★ End If Next '空白行の削除 For Each shn In dic With Sheets(shn).UsedRange Set d = Nothing For Each r In .Offset(4, 4).Resize(.Rows.Count - 4, .Columns.Count - 4).Rows If WorksheetFunction.CountA(r) = 0 Then If d Is Nothing Then Set d = r Else Set d = Union(d, r) End If End If Next If Not d Is Nothing Then d.EntireRow.Delete End With Next End Sub
< 使用 Excel:Excel2013、使用 OS:Windows7 >
オートフィルターを設定するのは、どのブックのどのシートですか?
(β) 2015/12/28(月) 13:32
例によって忘却の彼方なんですが、オートフィルターを設定するシートの、その設定イメージもアップいただけるとありがたいです。
関連のシート、タイトル行が複数行のケースもありますよね。 でもオートフィルターは、あくまでタイトル行が1行ですので、具体的には、どこにどのような▼を設定したいのかな?
(β) 2015/12/28(月) 16:20
どのブックかというと、故障部品のリストなので、Bブックですね。
そこで故障率の計算がされて、「Sheet2」が生成される、というコードを頂いたのですが、その生成されたシート「Sheet2」にオートフィルター(無設定)を付けたいのです。
もうひとつは、その「Sheet2」からグループ分けを行ったそれぞれのシートにも同じく無設定のオートフィルターを付けておきたいなと思っています。
すでに年末年始休暇に入ってしまい、実データのレイアウトはとれないのですが、以前UPしたものを編集してみました。
下記のレイアウトの4行目が空白なのですが、そこにオートフィルターを設定したいです。
「Sheet2」の方は、E列からの6行づつデータが、Sheet1に登録した機種分ずらっと並んでいます。
グループ分けしたものは、今の所1〜4機種ぐらいづつで分かれています。
よろしくお願いします。
【レイアウト】
|[A] |[B] |[C] |[D]|[E] |[F] |[G] |[H] |[I] |[J] | [1] |部品コード |品名 |英語品名 | | aaaaaa | [2] | | | | | | | | | | | [3] | | | | |2015/05|2015/06|2015/07|2015/08|2015/09|2015/10| [4] | | | | | | | | | | | [5] |MP-M015001|abcdeeeeessssa | | | 4.02%| 0.01%| 0.01%| 4.02%| 0.01%| 4.02%| [6] |MP-M015372|sdfhrlaaaaaa | | | 0.01%| 0.01%| 0.01%| 0.02%| 0.01%| 0.01%| [7] |MP-M603760|hsummmssann | | | 0.02%| 0.00%| 0.02%| 0.02%| 0.00%| 0.02%| [8] |MP-M905240|mmmmkkkjkiuuuuu | | | 0.02%| 0.02%| 0.02%| 0.02%| 0.02%| 0.02%| [9] |MP-1033477|lkuddsjoueeeeesa | | | 0.00%| 0.00%| 0.00%| 0.01%| 0.00%| 0.00%| [10]|MP-E000019|amsdbauiddddfvn | | | 0.01%| 0.01%| 0.01%| 0.01%| 0.01%| 0.01%| [11]|MP-E103961|dsuioeblvlsm,,,,,nn| | | 0.00%| 0.00%| 0.00%| 0.00%| 0.01%| 0.00%| (Lila) 2015/12/29(火) 08:46
オートフィルター設定部分だけですが、サンプルです。 (アップ後、ちょこっと訂正)
Sub Sample() With Sheets("Sheet2") .AutoFilterMode = False '念のためにオートフィルター解除 .UsedRange.Offset(3).Resize(.UsedRange.Rows.Count - 3).AutoFilter End With End Sub
追記)12/29 13:11
↑で生真面目に(?)Resizeで領域行数も指定しましたが、よく考えれば、UsedRangeの下は空白ですので
.UsedRange.Offset(3).AutoFilter
でよかったです。
(β) 2015/12/29(火) 08:57
ありがとうございます!
業務開始したらまた検証させて頂きます^o^!
(Lila) 2015/12/31(木) 17:31
頂いたコードを実行してみましたら、ちゃんと動作していました!
ありがとうございます。
ですが、計算時に、マクロを登録したボタンを押下のみで、計算から新規生成シート(Sheet2)へのオートフィルター付与までを行いたいのですが、このコードを何処に挿入すれば良いのでしょうか?
故障率2の方で、>MsgBox "処理が完了しました。" の前に挿入で大丈夫でしょうか?
また、分割の方ではシート名を指定するのではなく、「グループ」タブのA列に入った文字列を指定していく事は可能ですか?
よろしくお願い致します。
(Lila) 2016/01/06(水) 09:27
あけましておめでとうございます。
●故障率2
単一シート("Sheet2")で、かつ、そのシートは shB という変数で参照していますね。かつ、With shB とくくっています。 ですから、たとえば 最後の End With の直前に
.AutoFilterMode = False '念のためにオートフィルター解除 .UsedRange.Offset(3).AutoFilter
ここにいれてはいかがでしょうか。
●分割2
各シート名は Dic に格納されています。 で、最後の処理で、各シートの空白行を削除していますが、この処理ブロックは
With Sheets(shn).UsedRange ' ' ' End With
と、対象領域が With でくくられていますね。 ですから、End With の直前に
.Parent.AutoFilterMode = False '念のためにオートフィルター解除 .Offset(3).AutoFilter
こうしてはいかがでしょうか。
故障率2 と 分割2 は With でくくっているものが、一方はシート、一方は領域ですので コードもちょっと変えています。
(β) 2016/01/06(水) 10:21
二つとも、ばっちり動きました!
いつもいつも助けていただき、本当にありがとうございます!
また何かありましたら、よろしくお願いしますm(_ _)m
(Lila) 2016/01/06(水) 10:35
並び替えのVBAを調べて、以下のようなものを書いてみましたが、解らないことがあるので、ご教示ください。
.Parent.Sort.SortFields.Add _ Key:=Range("J5"), _ Order:=xlDescending
領域の指定は、βさんが先日のオートフィルターで教えてくださった「.Parent」にする事で恐らく出来たようですが、実行すると、オートフィルターの設定画面?というか、オートフィルターをクリックした状態になってしまい、自動で設定ができない(生成された全てのシートに有効になっていないような??)状態になっています。
又、一番優先されるキーはJ列ですが、その後のI列からE列の指定は同じようにこの後ろにどんどん追加していけばいいのでしょうか?
よろしくお願いします><。
(Lila) 2016/01/08(金) 09:37
オブジェクト参照をParentで戻したり、またその UsedRange としたりして、ちょっとわかりにくくなってしまいますが 以下で試してみてください。
With Sheets(shn).UsedRange Set d = Nothing For Each r In .Offset(4, 4).Resize(.Rows.Count - 4, .Columns.Count - 4).Rows If WorksheetFunction.CountA(r) = 0 Then If d Is Nothing Then Set d = r Else Set d = Union(d, r) End If End If Next If Not d Is Nothing Then d.EntireRow.Delete '並び替え With .Parent .Sort.SortFields.Clear .Sort.SortFields.Add Key:=.Range("J5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range("I5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range("H5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range("G5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range("F5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .Sort.SortFields.Add Key:=.Range("E5") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With .Sort .SetRange .Parent.UsedRange.Offset(3) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End With
.Parent.AutoFilterMode = False '念のためにオートフィルター解除 .Offset(3).AutoFilter
End With
(β) 2016/01/08(金) 13:50
Withを使用したコードなので、前回同様、End Withの前に挿入しました。
Parentだったり UsedRangeになったりで、まだ???の部分が多いですが、少しづつ何をしているのか見ていこうと思います。
本当にありがとうございます><
(Lila) 2016/01/08(金) 14:40
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.