[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ピポットテーブルを使ったマクロについて』(JIN)
エクセルのマクロを使用したピポットテーブルについて
これは、マクロの記録で取得したコードになります。
ピポットテーブルを使用すること自体ほぼ初めてです。
範囲の設定:"Sheet1!R1C1:R44143C10"
この範囲が毎回違います。範囲を指定しない方法はありますか?
そして、ハショれるところがあれば省きたいです。
純粋な記録のみのコード記述なのでどれが無駄な場所か分かりません。
省かないでも使えると思いますが、今後の為にも省ける(無駄な場所)があれば教えてください。
Sub Macro2()
Application.ScreenUpdating = False
Sheets.Add ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ "Sheet1!R1C1:R44143C10", Version:=6).CreatePivotTable TableDestination:= _ "Sheet2!R3C1", TableName:="ピボットテーブル3", DefaultVersion:=6 Sheets("Sheet2").Select Cells(3, 1).Select With ActiveSheet.PivotTables("ピボットテーブル3") .ColumnGrand = True .HasAutoFormat = True .DisplayErrorString = False .DisplayNullString = True .EnableDrilldown = True .ErrorString = "" .MergeLabels = False .NullString = "" .PageFieldOrder = 2 .PageFieldWrapCount = 0 .PreserveFormatting = True .RowGrand = True .SaveData = True .PrintTitles = False .RepeatItemsOnEachPrintedPage = True .TotalsAnnotation = False .CompactRowIndent = 1 .InGridDropZones = False .DisplayFieldCaptions = True .DisplayMemberPropertyTooltips = False .DisplayContextTooltips = True .ShowDrillIndicators = True .PrintDrillIndicators = False .AllowMultipleFilters = False .SortUsingCustomLists = True .FieldListSortAscending = False .ShowValuesRow = False .CalculatedMembersInFilters = False .RowAxisLayout xlCompactRow End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotCache .RefreshOnFileOpen = False .MissingItemsLimit = xlMissingItemsDefault End With ActiveSheet.PivotTables("ピボットテーブル3").RepeatAllLabels xlRepeatLabels With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("管理番号") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("処理日") .Orientation = xlRowField .Position = 2 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("納期") .Orientation = xlRowField .Position = 3 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成日") .Orientation = xlRowField .Position = 4 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成者") .Orientation = xlRowField .Position = 5 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成者名") .Orientation = xlRowField .Position = 6 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("得意先") .Orientation = xlRowField .Position = 7 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("宛名") .Orientation = xlRowField .Position = 8 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("宛名名称") .Orientation = xlRowField .Position = 9 End With With ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("摘要") .Orientation = xlRowField .Position = 10 End With ActiveSheet.PivotTables("ピボットテーブル3").AddDataField ActiveSheet.PivotTables( _ "ピボットテーブル3").PivotFields("摘要"), "個数 / 摘要", xlCount ActiveSheet.PivotTables("ピボットテーブル3").RowAxisLayout xlTabularRow ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("管理番号").Subtotals = Array( _ False, False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("処理日").Subtotals = Array(False _ , False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("納期").Subtotals = Array(False, _ False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成日").Subtotals = Array(False _ , False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成者").Subtotals = Array(False _ , False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("作成者名").Subtotals = Array( _ False, False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("得意先").Subtotals = Array(False _ , False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("宛名").Subtotals = Array(False, _ False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("宛名名称").Subtotals = Array( _ False, False, False, False, False, False, False, False, False, False, False, False) ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("摘要").Subtotals = Array(False, _ False, False, False, False, False, False, False, False, False, False, False) End Sub
行いたいのは、「A列の管理番号」をキーにした個数のピポットです。
集計後に
処理日 |納期 |作成日 |作成者|作成者名|得意先|宛名|宛名名称|摘要|個数(←これは別途追加します)
で表を作成したのです。
元データのレイアウトは下記になります。
|[A] |[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I] |[J] [1] |管理番号|処理日 |納期 |作成日 |作成者|作成者名|得意先|宛名|宛名名称|摘要 [2] |1RAFL |20210831|20210901|20210831| 20908|山田 |MG112 | 42|企業1 |大至急 [3] |1RAFF |20210831|20210902|20210831| 19901|荒井 |M2111 | 56|企業2 | [4] |1RAFE |20210831|20210901|20210831| 41511|平井 |M9024 |JA |企業3 | [5] |1RAFC |20210831|20210907|20210831| 19901|荒井 |M2172 |7X |企業4 | [6] |1RAFB |20210831|20210902|20210831| 41303|吉村 |M2948 |YN |企業5 |9/2必着 [7] |1RAFA |20210831|20210901|20210831| 19902|安保 |M4163 |ZZ |企業6 | [8] |1RAFA |20210831|20210901|20210831| 19902|安保 |M4163 |ZZ |企業6 | [9] |1RAFA |20210831|20210901|20210831| 19902|安保 |M4163 |ZZ |企業6 | [10]|1RAF9 |20210831|20210902|20210831| 19901|荒井 |M2394 |ZZ |企業7 | [11]|1RAF8 |20210831|20210902|20210831| 20908|萩原 |M2366 |ZZ |企業8 | [12]|1RAF7 |20210831|20210902|20210831| 41511|平井 |M1685 |T6 |企業9 | [13]|1RAF6 |20210831|20210901|20210831| 19212|樋田 |M4172 |MB |企業10| [14]|1RAF5 |20210831|20210901|20210831| 19902|安保 |M4172 |MB |企業10| [15]|1RAF5 |20210831|20210901|20210831| 19902|安保 |M4172 |MB |企業10| [16]|1RAF5 |20210831|20210901|20210831| 19902|安保 |M4172 |MB |企業10| [17]|1RAF5 |20210831|20210901|20210831| 19902|安保 |M4172 |MB |企業10| [18]|1RAF4 |20210831|20210901|20210831| 19507|中村 |M1654 |ZZ |企業11| [19]|1RAF4 |20210831|20210901|20210831| 19507|中村 |M1654 |ZZ |企業11|
どうぞ良い方法があれば教えてください。
< 使用 Excel:unknown、使用 OS:unknown >
毎回、新規にピボットを作成するのでしょうか。
だとしたら、作成場所は、新規シートで間違いないですか?
(マナ) 2021/10/04(月) 17:46
>範囲の設定:"Sheet1!R1C1:R44143C10"
>この範囲が毎回違います。
行数(レコード数)が変動するという意味ですか。
それとも、シート(or ブック)も変わるのでしょうか。
(マナ) 2021/10/04(月) 19:35
できるならば、別に名前を付けたシート「元データ貼付場所」などにして
「Sheet1」にピポッドの結果を表示する方法にしたいと思っています。
>範囲の設定:"Sheet1!R1C1:R44143C10"
>この範囲が毎回違います。
シート(or ブック)は、変わりません。
レコード数のみの変動です。
4万以上のデータになるので…
御返信ありがとうございます、よろしくお願い致します。
(JIN) 2021/10/05(火) 14:46
>シート「元データ貼付場所」などにして
>「Sheet1」にピポッドの結果を表示する
ということは、大元のデータは他の場所にあるのでしょうか
ピボットのデータソースを、その外部データにできないですか。
そうできれば、データソースを変更するだけで
毎回、ピボットを作成しなくても
Sheet1に作成したピボットは自動で更新されるはずですが。
(マナ) 2021/10/05(火) 17:02
会社の環境で別の場所からデータをダウンロードしてきます。
毎回新しいエクセルにデータがDLされます。
そのデータを「元データ貼付場所」に張り付けてからピポッドするイメージです。
ピポッドを作成しといて、データのみを張り付けて反映させる事が出来るのでしょうか?
(JIN) 2021/10/06(水) 14:24
>ピポッドを作成しといて、データのみを張り付けて反映させる事が出来るのでしょうか? できますね 試してみたらいいですよ
PowerQuery使えば貼り付けの作業も不要になると思いますけど (´・ω・`) 2021/10/06(水) 14:30
こんにちわ ^^ 別案です。。。連想配列を使った、集計です。5万行、10列くらいなら お時間も、そんなに、ピボットと変わらないかも。。。^^; m(_ _)m Sub OneInstanceMain() Dim i As Long Dim j As Long Dim zD As Object Dim v() As Variant Dim w() As Variant Dim md() As Variant Dim r As Range Dim t As Double t = Timer Set zD = CreateObject("Scripting.Dictionary") With Worksheets("Sheet1") v = .Cells(1).CurrentRegion.Value End With For i = 2 To UBound(v, 1) If v(i, 1) <> "" Then ReDim w(1 To UBound(v, 2)) If Not zD.Exists(v(i, 1)) Then For j = 1 To UBound(v, 2) w(j) = v(i, j) Next w(UBound(w)) = 1 zD(v(i, 1)) = w Else w = zD(v(i, 1)) w(UBound(w)) = w(UBound(w)) + 1 zD(v(i, 1)) = w End If End If Next md = Array("管理番号", "処理日", "納期", "作成日", "作成者", _ "作成者名", "得意先", "宛名", "宛名名称", "個数") With Worksheets("Sheet2") .UsedRange.Delete .Cells(1, 1).Resize(, UBound(md) + 1) = md .Cells(2, 1).Resize(zD.Count, UBound(md) + 1) = Application.Index(zD.items, 0, 0) Set r = .Cells(1).CurrentRegion r.Sort key1:=r.Columns(1), order1:=xlAscending, Header:=xlYes End With Erase v, w, md zD.RemoveAll MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _ Format((Timer - t) - Int(Timer - t), ".000") & " 秒" End Sub (隠居Z) 2021/10/06(水) 14:56
小計でやった時は処理が止まりました…
ピポッドは初めて使ったので迷宮に突入している状態でした…
自分では全く理解できませんがありがとうございました。
「連想配列」この言葉も初めて聞きました…
本当にありがとうございました。
(JIN) 2021/10/06(水) 16:22
ピポッドを作成しといて、データのみを張り付けて反映させる まずはこれを行ってみます。
(JIN) 2021/10/06(水) 16:24
ピポッドに慣れる意味でも、それがよいと思います。
以下は、その次のステップに進む際の、参考まで。 ピボットを作成するときに、 元データに、「外部データソース」を指定できます。 この場合、ダウンロードしたエクセルファイルを指定します。 http://www4.synapse.ne.jp/yone/excel2010/excel2010_pivot_gaibu.html そうすれば、ピボットを更新するだけで、 最新のデータが反映されます。 更新操作しなくても、起動時に自動で更新という設定も可能。 (たぶんデフォルトの設定が、そうなっています) ただし元データファイルは、フォルダを固定にし、 ファイル名も固定にする必要があります。 つまり、ファイルを差し替えるという運用です。 Power Queryでも、同様にできます。 \ファイル名は固定にしなくても フォルダ内の最新ファイルを元データにする といったこともPower Queryなら可能になります。
(マナ) 2021/10/06(水) 20:34
これ良いですね…
試してみます。
本当に色々とありがとうございました。
勉強します。
(JIN) 2021/10/07(木) 17:51
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.