
縦積上グラフの合計値をデータラベルの形で既存のグラフに表示するマクロを作成しました。
現状では行方向に県名(要素)、列方向に男/女人口(系列)を並べ、女人口の隣の列に各県の男女の合算人口を並べて”1”で参照させています(データラベルにしたいのでValueをTEXT値にしています)。
マクロでは、既存グラフの要素数を取得して、同数の要素(値は全てゼロ)をもつ配列を新系列に加え、上でTEXT化した合計値をデータラベルの.TEXTに設定するという方法をとっています。
現状の行列の配置の場合には下のマクロが期待通りの実行結果を返してくれますが、既存グラフのデータ範囲の設定で行/列の向きを逆にし、性別毎の合計値を①で参照させた場合には”2”のように要素数と”1”で取得したデータ数が一致しないという結果が返ります。
”3”付近で間違いをしている気もするのですが、どなたかご指摘いただけますと幸甚です。
Sub Test()
Dim newRange As Range
Dim newSC As Variant ' Σ系列の配列変数
Dim SCcnt As Integer ' SeriesCollectionの変数
Dim SC1Value As Variant ' SeriesCollection(1)の配列
Dim i As Integer
Dim A1 As String 'A1形式→R1C1形式の変換に使用
Dim R1 As String 'A1形式→R1C1形式の変換に使用
Dim R1withSheetname As String 'A1形式→R1C1形式の変換に使用
Set newRange = Application.InputBox(Prompt:="合計欄の参照を選択してください。", Type:=8) '”1”
newSC = newRange
With ActiveChart
SCcnt = .SeriesCollection.Count
SC1Value = .SeriesCollection(1).Values '要素数を取得 '”3”
If UBound(newSC) <> UBound(SC1Value) Then
'”2”
MsgBox ("(注意)選択したデータの個数が系列1のデータ個数と不一致。" & vbCr & vbCr & _
"選択範囲のデータ個数:" & (UBound(newSC) - LBound(newSC)) & vbCr & vbCr & _
"系列1のデータ個数:" & UBound(SC1Value))
End If
.SeriesCollection.NewSeries
SCcnt = SCcnt + 1
With .SeriesCollection(SCcnt)
.Values = newSC
.Name = "Σ"
End With
.PlotArea.Select
.ApplyDataLabels AutoText:=True, ShowValue:=True
For i = 1 To UBound(newSC) '系列数を取得
'R1C1形式に変換
A1 = newRange(i).Address
R1 = Application.ConvertFormula(Formula:=A1, _
fromReferenceStyle:=xlA1, _
toReferenceStyle:=xlR1C1, ToAbsolute:=xlAbsolute)
R1withSheetname = "=" & ActiveSheet.Name & "!" & R1
With .SeriesCollection(SCcnt)
.DataLabels.Select
.Points(i).DataLabel.Select
With Selection
.Text = R1withSheetname
.Position = xlLabelPositionInsideBase
End With
End With
Next i
End With
End Sub
No.2ベストアンサー
- 回答日時:
>(データラベルにしたいのでValueをTEXT値にしています)。
newSC = newRange
で、値化していることを言っているのですか?
>マクロでは、既存グラフの要素数を取得して、
>同数の要素(値は全てゼロ)をもつ配列を新系列に加え、
>上でTEXT化した合計値をデータラベルの.TEXTに設定する
提示されたコードと一致していないと思います。
追加した系列(NewSeries)の値(Values)には、InputBoxで指定した合計値セルデータ(newSC)をセットされています。
ということで、(値は全てゼロ)にはならないですね。
>現状の行列の配置の場合には下のマクロが期待通りの実行結果を返してくれますが、
>既存グラフのデータ範囲の設定で行/列の向きを逆にし、
>性別毎の合計値を①で参照させた場合には
>”2”のように要素数と”1”で取得したデータ数が一致しない
>という結果が返ります。
配列の次元数の問題ではないでしょうか。
UBoundの第2引数に次元番号を指定すればどうなるでしょうか。
例えば
If UBound(newSC, 2) <> UBound(SC1Value) Then
あるいは
If newRange.Count <> UBound(SC1Value) Then
としても良いかも知れません。
Excel VBAメモ:UBound関数と多次元配列
http://note.phyllo.net/?eid=539332
Selectしなくても可能です。
R1C1変換もしなくても可能です。
Dim newRange As Range
Dim dd As Variant
Dim n As Integer
Dim i As Integer
Set newRange = Application.InputBox(Prompt:="合計欄の参照を選択してください。", Type:=8) '”1”
With ActiveChart
n = .SeriesCollection(1).Points.Count '要素数を取得 '”3”
If n <> newRange.Count Then
MsgBox ("合計値データ個数が、系列1のデータ個数と不一致。")
Exit Sub
End If
'//0値ダミーデータ
For i = 1 To n
dd = dd & "," & 0
Next i
dd = Replace(dd, ",", "", 1, 1)
'//ダミー系列の追加とデータラベル表示
With .SeriesCollection.NewSeries
.Values = "{" & dd & "}"
.Name = "Σ"
.ApplyDataLabels
.DataLabels.Position = xlLabelPositionInsideBase
For i = 1 To n
With .Points(i).DataLabel
.Text = "=" & ActiveSheet.Name & "!" & newRange(i).Address
End With
Next i
End With
End With
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelでNA()を使わずにプロット...
-
Excel ピボットテーブル フィ...
-
illustrator でのグラフ作成 ...
-
パワポに張り込まれたグラフか...
-
EXEL 要素数の異なる複数データ...
-
エクセル(EXCEL)で、データを3...
-
図のような散布図の作り方を教...
-
エクセルでこのようなヒステリ...
-
Excelで数値→文字列変換で指数...
-
Excelの関数について、特定の文...
-
Excelで行ごとコピー、同じ行を...
-
たくさん作った同じ設定のグラ...
-
日付が1年以内になると他のセル...
-
エクセルにおける、グラフの指...
-
テキストボックス内の文字のふ...
-
エクセルでグラフタイトルが折...
-
エクセル 指定した文字列を含...
-
エクセル(Excel)の目盛りの一...
-
C+vのvは英語で何の頭文字...
-
塗りつぶしの色をコピーするには
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel ピボットテーブル フィ...
-
ExcelでNA()を使わずにプロット...
-
エクセル(EXCEL)で、データを3...
-
EXEL 要素数の異なる複数データ...
-
Excelでバイナリデータを読み込...
-
エクセルでこのようなヒステリ...
-
Excelで扱えるデータ数を超える...
-
Excelで数直線の作り方
-
エクセルの棒グラフ、データの...
-
エクセル 日ごとにデータを追...
-
excelのグラフで,ある範囲の色...
-
パワポに張り込まれたグラフか...
-
図のような散布図の作り方を教...
-
エクセル2010でグラフのリンク...
-
エクセルデータの集計、一つの...
-
Sma4
-
excelで減衰定数について
-
エクセルの円グラフ。こんなの...
-
CSVからエクセル・クロマト...
-
Excel2003 標準のグラフの種類...
おすすめ情報