• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォームの配置(EXCEL2003と2010))

フォームの配置(EXCEL2003と2010)

このQ&Aのポイント
  • EXCELで、マクロを使用してチャートのグラフエリア上にチェックボックスを配置しようとしています。
  • excel2003とexcel2010の両方で同じように配置をしたいのですが、どうすればいいでしょうか。
  • excel2010では凡例エリアにチェックボックスが重なるようになってしまいました。

質問者が選んだベストアンサー

  • ベストアンサー
  • end-u
  • ベストアンサー率79% (496/625)
回答No.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%に設定すれば良いだけでした。

mokichi3216
質問者

お礼

ありがとうございます。実際に動かして確認していただいたようで大変ありがたいです。 Zoomを100%にしたところうまく動くようになりました。 一度ファイルを閉じて開きなおすと配置がずれるのですが、マクロの無効がアナウンスされたときに「コンテンツを有効にする」を選ぶと、自動的に復帰しました。 問題は解決しました。ありがとうございました。

その他の回答 (1)

  • end-u
  • ベストアンサー率79% (496/625)
回答No.1

シート上のチャートではなくて、グラフシートの場合ですね? >凡例の座標を基準にして、プロットエリアと凡例エリアの間におこうと思っています。 >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

関連するQ&A