- ベストアンサー
フォームの配置(EXCEL2003と2010)
- EXCELで、マクロを使用してチャートのグラフエリア上にチェックボックスを配置しようとしています。
- excel2003とexcel2010の両方で同じように配置をしたいのですが、どうすればいいでしょうか。
- excel2010では凡例エリアにチェックボックスが重なるようになってしまいました。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ふむ..調整用の Sub cbChk() は下記でも良いようです。 Sub cbChk() Dim c As Chart Dim cb As CheckBox Dim lw As Double Dim b As Double Dim p As Double Dim i As Long If Val(Application.Version) = 14 Then p = -4 End If Set c = ActiveChart With c.Legend lw = .Width / 8 + p b = 2 + p For i = 1 To Application.Min(.LegendEntries.Count, c.CheckBoxes.Count) Set cb = c.CheckBoxes(i) cb.Left = .LegendEntries(i).Left - lw cb.Top = .LegendEntries(i).Top - b Next End With End Sub #つまりAdd後あらためてLeft,Top設定すると大丈夫。 ..っと思ったけど、そう言えばver2007出始めで同様の問題があったのを思い出しました。 その時と同様、Zoomが原因のよう。 Left,TopだけじゃなくてWidth,Heightも影響受けるからその対策も入れないといけないですね。 面倒なので Sub test() Dim z Application.ScreenUpdating = False With ActiveWindow z = .Zoom .Zoom = 100 Call Ckb_Add .Zoom = z End With Application.ScreenUpdating = True End Sub 結論としては、提示コード Sub Ckb_Add() の前にZoomを100%に設定すれば良いだけでした。
その他の回答 (1)
- end-u
- ベストアンサー率79% (496/625)
シート上のチャートではなくて、グラフシートの場合ですね? >凡例の座標を基準にして、プロットエリアと凡例エリアの間におこうと思っています。 >lw = ActiveChart.Legend.Width / 8 凡例の幅が狭い場合は..LegendEntries(i + 1).Left - lw これがうまくいかない可能性がありますよね。 それに凡例が2列になった場合はどうするのでしょう。 ..という懸念が残るにしても、取り敢えず2003と2010でほぼ同じ結果を出すには Private datacount Sub test() Dim c As Chart Dim w As Double Dim h As Double Dim i As Long 'datacount = 5 Set c = ActiveChart With c.PlotArea .Width = .Width * 0.95 End With With c.Legend .Height = .Height * 1.5 .Width = .Width * 1.1 .Left = .Left - 0.01 * c.ChartArea.Width End With w = 5 h = 3 For i = 1 To datacount With c.CheckBoxes.Add(0, 0, w, h) .Text = "" .Value = xlOn .OnAction = "CK" & i & "_Click" End With Next Call cbChk End Sub '------------------------------------------------- Sub cbChk() Dim c As Chart Dim s As Shape Dim lw As Double Dim b As Double Dim p As Double Dim i As Long Dim x As Long If Val(Application.Version) = 14 Then p = -4 End If Set c = ActiveChart With c.Legend lw = .Width / 8 + p b = 2 + p x = Application.Min(.LegendEntries.Count, c.CheckBoxes.Count) For i = 1 To x Set s = c.CheckBoxes(i).ShapeRange(1) s.Left = 0 s.Top = 0 s.IncrementLeft .LegendEntries(i).Left - lw s.IncrementTop .LegendEntries(i).Top - b Next End With End Sub こんな感じで、CheckBoxを一旦追加してから IncrementLeft|IncrementTop メソッドを使って配置すると良いかも。 どうも、CheckBoxes.Addの時のLeft,Top設定が上手くいかないですね。 それに作成後も、保存した後に異なるバージョンで開くと、CheckBoxesの位置がずれるようです。 その時はSub cbChk()を分割して単独実行できるようにしたので調整用として試してみてください。 >p = -4 ..というのは環境によって違うかもしれません。 都度チェックするなら、簡易的に下記コードでチェックできるかと思います。 Sub GapCheck() Dim b As Boolean With ActiveChart b = .HasTitle .HasTitle = True With .ChartTitle .Left = -100 .Top = -100 Debug.Print .Left, .Top End With .HasTitle = b End With End Sub
お礼
ありがとうございます。実際に動かして確認していただいたようで大変ありがたいです。 Zoomを100%にしたところうまく動くようになりました。 一度ファイルを閉じて開きなおすと配置がずれるのですが、マクロの無効がアナウンスされたときに「コンテンツを有効にする」を選ぶと、自動的に復帰しました。 問題は解決しました。ありがとうございました。