[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ピボットグラフ』(てんてん)
どなたかお教えいただきたいのですが
ピボットテーブルからピボットグラフにて職員の人事考課のデータ報告書
の作成を考えているのですが、部署ごとに可変式するとした場合に
人数分のレーダーパラメータ形式のグラフを一枚の紙に部署ごとに配置して
部署が変わればグラフの数も変更するようなデータを作りたいと思っております
その様なことは可能でしょうか? 一つのグラフですと今のところレーダデータは複数作成できない為、グラフ自体を参照セルあるいはスライサーで増減コントロールしたいです
< 使用 Excel:Office365、使用 OS:unknown >
ピボットテーブルだと、 一つのレーダーチャートに複数人のデータを系列として含む、 一つのレーダーチャートが作られるはずです。
仮に対象を一人に絞ったとしても、 レーダーチャートを複数枚並列的に自動作成することはできないのでは?
また、スライサーは一つのグラフの視点を変えていくもののようなので、 あくまでもグラフは一つでしょう。
人数分のレーダーチャートを作るなら、ピボットグラフを忘れたほうがいいかもしれませんね。 (γ) 2022/09/30(金) 16:11
(マナ) 2022/09/30(金) 17:20
.ChartObjects.Add
でやってみたのですが、初期化[前回の作成した画像化グラフ等削除]時
少しトラブっています。ごり押しで、解決は出来るのですが
心のどこかに不安が残っています。( ̄▽ ̄)
ごり押し=エラーが出て削除出来ないのですが、出来るまで
エラーを無視して繰り返し削除出来るまで、頑張るよ〜な
ロジックになっています。。。^^;
m(_ _)m
Err.Description=指定したコレクションに対するインデックスが境界を超えています。
Err.Number=-2147024809
Option Explicit
Sub OneInstanceMain()
Const zProgramID As String = "IJ00500.xlsm"
Dim ztb As Workbook
Dim urr As Range
Dim v() As Variant
Dim i As Long
Dim j As Long
Dim x As Long
Dim y As Long
Dim r As Range
Dim crr As Range
Dim prr As Range
Dim pc As Object
Dim ch As Object
Dim zD As Object
Dim mk() As Variant
Dim t As Double
t = Timer
Set ztb = Workbooks(zProgramID)
With ztb.Worksheets("Sheet1")
Do
i = i + 1
If sHapesDelete(ztb) Then Exit Do
If i Mod 32 = 0 Then DoEvents
Loop
i = 0
Do
i = i + 1
If cHartObjectsDelete(ztb) Then Exit Do
If i Mod 32 = 0 Then DoEvents
Loop
i = 0
Set zD = CreateObject("Scripting.Dictionary")
Set r = .Cells(1).CurrentRegion
v = r.Value
For i = 2 To UBound(v, 1)
zD(v(i, 2)) = Empty
Next
If zD.Count = 0 Then End
mk = zD.keys
y = 15: x = 1
For i = 0 To UBound(mk)
Set urr = r.Rows(1)
Set crr = .Cells(1, 11).Resize(10, 6)
Set ch = .ChartObjects.Add(crr.Left, crr.Top, crr.Width, crr.Height)
For j = 2 To UBound(v, 1)
If v(j, 2) = mk(i) Then
Set urr = Union(urr, r.Rows(j))
End If
If j Mod 8 = 0 Then DoEvents
Next
With ch
With .Chart
.SetSourceData urr
.ChartType = xlRadar
.HasTitle = True
.ChartTitle.Text = "賞与査定"
End With
.CopyPicture
.Delete
End With
Application.Goto .Cells(y, x)
.Paste
Set prr = .Cells(y, x).Resize(10, 6)
Set pc = .Shapes(i + 1)
With pc
.Left = prr.Left
.Top = prr.Top
.Width = prr.Width
.Height = prr.Height
End With
x = x + 6
Set urr = Nothing
If i Mod 8 = 0 Then DoEvents
Next
End With
If Not zD Is Nothing Then zD.RemoveAll
Erase v, mk
MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
Private Function sHapesDelete(ByVal ztb As Object) As Boolean
sHapesDelete = False
Dim i As Long
On Error Resume Next
With ztb.Worksheets("Sheet1")
For i = 1 To .Shapes.Count
.Shapes(i).Delete
Next
If .Shapes.Count = 0 Then
sHapesDelete = True
End If
End With
On Error GoTo 0
End Function
Private Function cHartObjectsDelete(ByVal ztb As Object) As Boolean
cHartObjectsDelete = False
Dim i As Long
On Error Resume Next
With ztb.Worksheets("Sheet1")
For i = 1 To .ChartObjects.Count
.ChartObjects(i).Delete
Next
If .ChartObjects.Count = 0 Then
cHartObjectsDelete = True
End If
End With
On Error GoTo 0
End Function
(隠居Z) 2022/10/01(土) 23:22
|[A] |[B] |[C] |[D] |[E] |[F] |[G] |[H] |[I]
[1] |氏名 |部署 |役職 |販売力|統率力|説明|協調性|貢献度|勤務評価
[2] |名前7|部署4|アルバイト| 2| 9| 10| 1| 5| 3
[3] |名前3|部署1|係長 | 8| 9| 6| 7| 1| 6
[4] |名前4|部署1|課長 | 5| 2| 4| 6| 1| 1
[5] |名前1|部署1|主任 | 2| 1| 1| 3| 9| 8
[6] |名前6|部署3|嘱託 | 1| 1| 5| 7| 8| 4
[7] |名前5|部署2|正社員 | 7| 2| 2| 8| 1| 7
[8] |名前9|部署4|正社員 | 5| 9| 8| 1| 10| 1
[9] |名前2|部署1|部長 | 2| 6| 8| 10| 5| 2
[10]|名前8|部署4|臨時 | 5| 1| 5| 3| 6| 5
(隠居Z) 2022/10/01(土) 23:25
私のコーディングに問題ありでせうか?。。。(T.T)
(隠居Z) 2022/10/02(日) 07:39
.Shapes(i).Delete
Next
こうしないと、いけなかったよ〜です。。。( ̄▽ ̄)
お騒がせ致しました。すみません。すみません。
おおお。はずかし〜〜〜〜\(◎o◎)/!
m(__)m
(隠居Z) 2022/10/02(日) 07:47
レーダーチャートを実務で使ったことがありませんので、 どんなピボットなのかイメージできないのですが
部署と氏名を、ページフィールドに配置し ピボットグラフも予め作成しておき マクロでは
1)部署と氏名を入れ替え 2)グラフを画像としてコピー 3)場所をずらしながら貼り付け
といった感じで考えていました。
通常のグラフであれば、画像にしなくてもよいのですが、 隠居Zさんのコードで、グラフは1個だけ用意しソース範囲を入れ替えていくイメージです。
(マナ) 2022/10/02(日) 08:23
おはようございます。^^
という事で、作り直して見ました。^^; ...
m(_ _)m
Option Explicit
Sub OneInstanceMain()
Dim urr As Range
Dim v() As Variant
Dim i As Long
Dim j As Long
Dim x As Long
Dim y As Long
Dim r As Range
Dim crr As Range
Dim prr As Range
Dim pc As Object
Dim ch As Object
Dim zD As Object
Dim mk() As Variant
Dim t As Double
t = Timer
With Worksheets("Sheet1")
For i = .Shapes.Count To 1 Step -1
.Shapes(i).Delete
Next
Set zD = CreateObject("Scripting.Dictionary")
Set r = .Cells(1).CurrentRegion
v = r.Value
For i = 2 To UBound(v, 1)
zD(v(i, 2)) = Empty
Next
If zD.Count = 0 Then End
mk = zD.keys
y = 15
x = 1
Set crr = .Cells(1, 12).Resize(10, 6)
Set ch = .ChartObjects.Add(crr.Left, crr.Top, crr.Width, crr.Height)
For i = 0 To UBound(mk)
Set urr = r.Rows(1)
For j = 2 To UBound(v, 1)
If v(j, 2) = mk(i) Then
Set urr = Union(urr, r.Rows(j))
End If
If j Mod 8 = 0 Then DoEvents
Next
With ch
With .Chart
.SetSourceData urr
.ChartType = xlRadar
.HasTitle = True
.ChartTitle.Text = "調査室査定"
End With
.CopyPicture
End With
Application.Goto .Cells(y, x)
.Paste
Set prr = .Cells(y, x).Resize(10, 6)
'シェイプズの一個目はグラフエリアなので2枚目[画像]から
Set pc = .Shapes(i + 2)
With pc
.Left = prr.Left
.Top = prr.Top
.Width = prr.Width
.Height = prr.Height
End With
x = x + 6
Set urr = Nothing
If i Mod 8 = 0 Then DoEvents
ch.Chart.ChartArea.ClearContents
Next
Application.Goto .Cells(1)
ch.Delete
End With
If Not zD Is Nothing Then zD.RemoveAll
Erase v, mk
MsgBox "終了 " & Format(Int(Timer - t) / 24 / 60 / 60, "hh : mm : ss") & _
Format((Timer - t) - Int(Timer - t), ".000") & " 秒"
End Sub
(隠居Z) 2022/10/02(日) 09:43
・シートPivotに、元データ、ピボットテーブル、ピボットグラフを用意
部署 部署4 氏名 名前8
値 販売力 5 統率力 1 説明 5 協調性 3 貢献度 6 勤務評価 5
・ピボットグラフのサイズや書式を設定 ・各部署の名前のシートを作成 ・下記コードを、シートモジュールにコピペ
Sub test()
Dim ws As Worksheet
Dim pvt As PivotTable, cho As ChartObject
Dim v, hdr, m1 As Long, m2 As Long
Dim k As Long, n As Long, y As Long, x As Long
Dim 部署 As String, 氏名 As String
On Error Resume Next
For Each ws In Worksheets
If ws.Name <> Me.Name Then
ws.DrawingObjects.Delete
End If
Next
On Error GoTo 0
Set pvt = PivotTables(1)
Set cho = ChartObjects(1)
v = Range(Application.ConvertFormula(pvt.SourceData, xlR1C1, xlA1)).Value
hdr = Application.Index(v, 1)
m1 = Application.Match("部署", hdr, 0)
m2 = Application.Match("氏名", hdr, 0)
For k = 2 To UBound(v)
部署 = v(k, m1)
氏名 = v(k, m2)
Set ws = Worksheets(部署)
pvt.PivotFields(m1).CurrentPage = 部署
pvt.PivotFields(m2).CurrentPage = 氏名
cho.Chart.ChartTitle.Text = 氏名
cho.CopyPicture
ws.Paste
n = ws.Shapes.Count
y = (n - 1) \ 8
x = (n - 1) Mod 8
ws.Shapes(n).Top = y * (cho.Height + 5) + ws.Rows(2).Top
ws.Shapes(n).Left = x * (cho.Width + 5) + ws.Columns(2).Left
Next
End Sub
(マナ) 2022/10/02(日) 13:34
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.