• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA ボタンに登録すると挙動が変わってしまう)

Excel VBAボタンに登録すると挙動が変わってしまう

このQ&Aのポイント
  • Excel VBAを使用して、棒グラフの棒の色を半自動で変えるマクロを作成しています。テストの結果は成功し、ボタンに登録したところ、動作しなくなってしまいました。
  • VBエディタ上では正常に動作していましたが、ボタンに登録した途端にサンプルが表示されなくなりました。
  • サンプルを削除する部分をコメントアウトすると、全ての処理が終わった後にサンプルが表示されることがわかりました。しかし、ボタンに登録した場合はリアルタイムで表示されなくなってしまいます。対処法を教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

私自身が使うのは専らAccess VBAばかりなのですが・・・(汗) こちらで確認した結果、どうにかそれらしい動作をさせることができました。 【Point】  ・複製したChartObjectをSelectしてやることで、VBEからF5キー経由で   実行させたのと同じ動作にさせることができる  ・但し、ChartObjectのDuplicateの戻り値のデータ型は、複製元と同じ   データ型ではなくObject型のため、そのままSelectを行うとエラーとなる。   これを回避するため、Withの対象には「戻り値そのもの」ではなく「Chart   Objectsコレクションから取得したChartObjectオブジェクト」を使用する 上記のポイントに加えて、コードの整理(?)を若干したものが、以下のコード になります。 なお、末尾に「New」をつけてサブの名前を変えていますので、貼り付けて 使用する場合はご注意下さい。 Sub callGraphItemColorChangeNew() On Error GoTo エラー処理   Dim c As Integer   c = 1   '◆変数はできるだけ型を指定した方が、入力支援機能が有効になるなど、利点が大です◆   Dim Wks As Worksheet, Objs As ChartObjects, myChart As ChartObject   Dim Dpl1 As ChartObject, Dpl2 As ChartObject   Dim sample1 As Long, sample2 As Long   Dim a As VbMsgBoxResult, f As Integer, i As Long   Dim LPosition As Long, TPosition As Long, WPosition As Long, HPosition As Long   'ActiveSheetから順に変数に格納(後で、確実にメモリを解放するため)   Set Wks = ActiveSheet   Set Objs = Wks.ChartObjects   Set myChart = Objs(c)   '原本チャートから取得が必要な値などを予め取得   With myChart     LPosition = .Left     TPosition = .Top     WPosition = .Width     HPosition = .Height     Call .Duplicate     sample1 = Objs.Count     Set Dpl1 = Objs(sample1)  '複製チャートを、Objs(=ChartObjects)経由で変数に格納     Call .Duplicate     sample2 = Objs.Count     Set Dpl2 = Objs(sample2)  '複製チャートを、Objs(=ChartObjects)経由で変数に格納     Application.Goto Reference:=Range(.TopLeftCell.Address), Scroll:=True   End With   '複製チャートの書式設定   '◆Duplicateの戻り値ではなく、ChartObjectを使用◆   With Dpl1     f = 1     ' Call graphItemColorChange(sample1, f)     .Chart.ChartArea.Border.ColorIndex = 3     .Chart.ChartArea.Border.Weight = xlThick     .Left = LPosition + WPosition     .Top = TPosition     .Select   End With   With Dpl2     f = 2     ' Call graphItemColorChange(sample2, f)     .Chart.ChartArea.Border.ColorIndex = 5     .Chart.ChartArea.Border.Weight = xlThick     .Left = LPosition     .Top = TPosition + HPosition     .Select   End With   a = MsgBox("マクロ使用後に[戻る]で使用前には戻れません" & vbCrLf _       & "なるべく一度保存してから使用してください" & vbCrLf _       & " (一旦戻って保存するなら[キャンセル])" & vbCrLf _       & vbCrLf _       & "下の色(青枠)に塗り替えようとしています" & vbCrLf _       & "下のものでいいなら[はい(Y)]" & vbCrLf _       & "右のもの(赤枠)なら[いいえ(N)]" & vbCrLf _       & "中止するなら[キャンセル]", vbYesNoCancel)   Debug.Print sample1   Debug.Print sample2   Debug.Print c   Dpl2.Delete   Dpl1.Delete   If a = vbYes Then     f = 2   ElseIf a = vbNo Then     f = 1   Else     GoTo 終了処理   End If   ' Call graphItemColorChange(c, f) 終了処理:   '念のため、明示的にメモリを解放して終了   Set Dpl1 = Nothing   Set Dpl2 = Nothing   Set myChart = Nothing   Set Objs = Nothing   Set Wks = Nothing   Exit Sub エラー処理:   'エラー発生時はMsgBoxを表示   '(既定の『デバッグ』ボタンなどの表示が必要になった場合は、   ' 冒頭の「On Error Goto エラー処理」をコメントアウト)   MsgBox Err.Number & ":" & Err.Description   Resume 終了処理 End Sub ・・・以上です。

WatchGoo
質問者

お礼

遅くなって申し訳ありません Application.ScreenUpdating = True を先頭に足したところ解決したのですが、自己解決したことを書き込む方法が分からずそのままになっていました。 解決はしていたのですが オブジェクトの宣言時のコツや値の習得を一か所でやる等かなり参考になります わかりやすいソースありがとうございました

関連するQ&A

専門家に質問してみよう