• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのグラフの不動化(3))

エクセルのグラフで発生した不具合について

このQ&Aのポイント
  • エクセルのグラフで発生した不具合の詳細を検証しようとファイルを開いたところ、同じエラーが再度発生しました。
  • 原因は、ファイル保存時に空白セル以外に保護がかかるVBAの影響だと考えられます。
  • VBAの削除やシート操作時の無効化は検討外なので、他の方法で対策を考えています。

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/692)
回答No.1

>「指定された値は境界を越えています」 このエラーが起きるのは、 Private Sub Workbook_BeforeSave このイベント、つまり、 ブックを保存するときにシートを保護している一方で、 その後、保存したブックを開き、グラフの配置されたシート選び 適当なセルを選択すると、 Worksheet_SelectionChange このイベントが走り、グラフの表示位置を変更しようとします。 つまり、シートが保護されているにもかかわらず シート上のグラフの表示位置を変更しようとしているからです。 シートが保護されている場合であっても、 グラフの表示位置の変更など、 オブジェクトの変更を許す対応が考えられます。 ソースコードで言えば、以下です。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)   Sheets("成績表(提出)").Select   Range("A1").Select   Selection.ClearContents   Sheets("入力表").Select   Range("D2:L2").Select   Selection.ClearContents   Const MyPassword = "" 'パスワード(省略可)   Dim sh As Worksheet   On Error Resume Next   For Each sh In Worksheets     sh.Unprotect Password:=MyPassword     With sh.Cells       '全セルのロックを外す       .Locked = False       '定数が含まれているセルにロックを掛ける       .SpecialCells(xlCellTypeConstants).Locked = True       '数式が含まれているセルにロックを掛ける       .SpecialCells(xlCellTypeFormulas).Locked = True     End With '    sh.Protect DrawingObjects:=True, Contents:=True, _ '      Scenarios:=True, Password:=MyPassword     sh.Protect DrawingObjects:=False, Contents:=True, _       Scenarios:=True, Password:=MyPassword   Next   On Error GoTo 0   Sheets("入力表").Select End Sub

akira0723
質問者

お礼

朝一で試そうとして、ご回答と現行のコードの違いが分からず、もしかして質問のコードを間違って貼り付けた?と思いワードに新旧をコピペして比べてビックリ! 保護シート上のグラフだけ保護解除が、2行で出来るとは! 実際のBookで動作確認も完了しました。 何でもダメ元で聞いてみるべき(人の迷惑顧みず)と再度実感しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルで2つのマクロを結合したい

    毎度お世話名なっております。 以前ここで教えてもらった保存時に全シートの入力済みセルに自動で保護がかかる<マクロ1>を教えてえもらって非常に多くのBookに採用しているのですが、今回同じBookの「計算表」シートの特定のいくつかのセルだけ保護がかからないようにしたく試行錯誤で2つのマクロをつなげてみたのですが情けないことに期待通りに動かず。 単に最初のマクロのEnd Subを削除しただけではうまくいかず。 どなたかHELPお願い致します。 <マクロ1> Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim sh As Worksheet On Error Resume Next For Each sh In Worksheets sh.Unprotect Password:=MyPassword With sh.Cells '全セルのロックを外す .Locked = False '定数が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeConstants).Locked = True '数式が含まれているセルにロックを掛ける .SpecialCells(xlCellTypeFormulas).Locked = True End With sh.Protect DrawingObjects:=True, Contents:=True, _ Scenarios:=True, Password:=MyPassword Next On Error GoTo 0 End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub 保護解除() <マクロ2> ' 保護解除 Macro '' Sheets("計算表").Select Range("C6:D6").Select ActiveSheet.Unprotect End Sub

  • エクセルグラフを別シートのグラフに連動させることはできますか?

    エクセルのグラフで教えてください。 下記のVBAを使って同じグラフを それぞれ別シートに作成しています。 VBAの3行目のActiveSheetはシート名(入力画面)を指します。 入力画面のセルで1または2を入力することで グラフの色が変わるようにしています。 そのグラフと同じものを別シート(印刷用画面)に作成したく 入力画面の入力で印刷用画面の入力も変わるようにしたつもりなのですが・・・ この方法だと、入力した際に 一瞬印刷用画面に移動して画面がちらついてしまいます。 このちらつきをなくしたいのですが なにかよい方法はありますでしょうか? よろしくお願いいたします。 Sub Sam1() Dim i, nColor As Integer ActiveSheet.ChartObjects("グラフ 8").Select i = 1 nColor = 2 '←「2」の時の色 If Cells(i, 13) = 1 Then nColor = 5 '←「1」の時の色 ActiveChart.SeriesCollection(1).Points(i).Interior.ColorIndex = nColor Sheets("印刷用画面").Select ActiveSheet.ChartObjects("グラフ 2").Select nColor = 2 '←「2」の時の色 If Sheets("入力画面").Cells(i, 13) = 1 Then nColor = 5 '←「1」の時の色 ActiveChart.SeriesCollection(1).Points(i).Interior.ColorIndex = nColor Sheets("入力画面").Select Range("H15").Select End Sub

  • エクセルで1つのマクロを複数のシートに適用したい

    いつもお世話になっております。 以前ここで入力セルはファイル保存時に自動で保護かかるように、下記のコードを教わって便利に使い始めたのでですが、同じBookの複数のシート、あるいは一括で全てのシートで有効にしたいのですが。(この機能をデフォルトで選択機能にしていないのはおかしい位に思い始めています。) シート毎に範囲名を指定して、This Workbookにマクロを登録する必要があるのでしょうか? Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const MyPassword = "" 'パスワード(省略可) Dim RowCnt As Long Dim ColCnt As Long Dim MyCell As Range With ThisWorkbook.Sheets(1) .Unprotect Password:=MyPassword For Each MyCell In Range("保護範囲") If MyCell.Value <> "" Then MyCell.Locked = True Else MyCell.Locked = False End If Next MyCell .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

  • Excelで、VBAを用いてのグラフ作成。1日ごとの範囲でグラフシート

    Excelで、VBAを用いてのグラフ作成。1日ごとの範囲でグラフシートを作成。それぞれのグラフのX軸の範囲を、グラフタイトル名とグラフシート名に設定したい。(使用環境 : Excel 2004 Mac 日本語版) Excel VBAに関して質問します。グラフの元になる「表1」シートには、次のように1分間隔でデータが入力されています。 #######ここから####### 日時 系列A 系列B 2010/3/1 12:00 0 5 2010/3/1 12:01 1 2 2010/3/1 12:02 1 5 2010/3/1 12:03 5 5 (中略) 2010/3/31 11:57 2 1 2010/3/31 11:58 5 1 2010/3/31 11:59 3 1 2010/3/31 12:00 5 100 #######ここまで####### この表を、2010年3月1日から2010年3月31日までの、1日ごとのグラフにしようと思います。 私は初め、「日時」セルから、最後の「100」セルまでを選択し、グラフウィザードからグラフシートを作成しました。このグラフシートを、すべてのグラフシートの大本になるグラフシートとして、「おおもと」と名付けました。 そうして次のVBAプログラムを書きました。 #######ここから####### Option Explicit Sub Macro1() ' ' Macro1 Macro '3月1日分 Sheets("おおもと").Select Sheets("おおもと").Copy Before:=Sheets(1) ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = #2010/3/1 12:00# .MaximumScale = #2010/3/2 12:00# .MinorUnit = 0.0416666667 .MajorUnit = 0.125 End With ActiveChart.Deselect '3月2日分 Sheets("おおもと").Select Sheets("おおもと").Copy Before:=Sheets(1) ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = #2010/3/2 12:00# .MaximumScale = #2010/3/3 12:00# .MinorUnit = 0.0416666667 .MajorUnit = 0.125 End With ActiveChart.Deselect (中略) '3月30日分 Sheets("おおもと").Select Sheets("おおもと").Copy Before:=Sheets(1) ActiveChart.Axes(xlCategory).Select With ActiveChart.Axes(xlCategory) .MinimumScale = #2010/3/30 12:00# .MaximumScale = #2010/3/31 12:00# .MinorUnit = 0.0416666667 .MajorUnit = 0.125 End With ActiveChart.Deselect End Sub #######ここまで####### 上記のVBAプログラムを実行し、一応グラフは描けたのですが、作成したそれぞれのグラフシートのシート名とグラフタイトル名が、それぞれのグラフの日時の範囲を反映したものとなっておらず、一見してどの日時範囲をグラフ化したものか読み取れず、難儀しています。 そこで、3月1日分から3月30日分までのグラフシートとグラフタイトル名を、それぞれの日付の範囲に即した物(たとえば3月1日分のグラフシートは、グラフシート名が「3月1日」、グラフタイトル名が「3月1日」)になる、VBAの書き方を教えて貰えないでしょうか。 長々とした質問ですが、どうぞ、よろしくお願いします。

  • エクセルでマクロを別のbookにコピペしたら不具合

    いつもお世話になっております。 先日ここで下記のマクロを教わって非常に感動して使い始めて、今日は他のbookへも展開しようとしたのですが、何故かコピペしたbookではエラーがでて動きません。 何度もの試行錯誤で、保護範囲に結合セルが入った場合エラーになることが分かって以降順調に使えていたのですが。 > With ThisWorkbook.Sheets(MySheet) が黄色にハイライトになります。 bookやシートを特定するようなコードは無いように思うのですが。 何が悪いのでしょう? 問題ないbookとどこが違うのでしょう? =================================== Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub =====================================

  • エクセルでシートを保護するマクロの関数化

    いつもお世話になっております。 先日ここで複数の人が使用するエクセル(Ver.2016)シートで、入力されたセルだけに保護をかける下記のコードを教わって使い始めたのですが、当方にとっては非常に有益な機能なので他のブック、シートでも簡単に使えるようにマクロ化して関数で使えるようにしたいと思ったのですが、シートにより保護対象の行数と列数がちがうのでこのままでは関数化しても意味がないことに気付きました。 また、特定のセルに適用する関数ではないのでどうやって使うのかもわからないことに気付きました。 やりたいことは、どこかのセルで 関数=HOGO(範囲)、もしくは=HOGO(範囲、パスワード :省略可)のような使い方ができれば理想なのですが。 当方マクロはほとんど使えないので上記のようなことができるのかどうかもわからないのですが、もしできれば非常に便利な関数ですのでお知恵を拝借したく。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Const RowS = 16 'ロック範囲開始行 Const RowE = 500 'ロック範囲終了行’ Const ColS = 1 'ロック開始列 Const ColE = 8 'ロック終了行 Const MyPassword = "" 'パスワード(省略可) Const MySheet = "入力表" '保護したいシート名 Dim RowCnt As Long Dim ColCnt As Long With ThisWorkbook.Sheets(MySheet) .Unprotect Password:=MyPassword For RowCnt = RowS To RowE For ColCnt = ColS To ColE If .Cells(RowCnt, ColCnt).Value <> "" Then .Cells(RowCnt, ColCnt).Locked = True Else .Cells(RowCnt, ColCnt).Locked = False End If Next ColCnt Next RowCnt .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, _ Password:=MyPassword End With End Sub

  • エクセルのグラフの不動化

    いつも大変お世話になっております。 先日ここで表題につき下記ご回答いただきいくつかのシートで使用を開始したのですが、下記の不具合が発生しました。 VBA(グラフが不動化)するのですが、Bookの保存でエラーが出て止まります。 このVBAは既にいくつかのシートに展開しており初めての不具合です。 よって、Book特有の不具合なら現象が再現出来ないと分からないかとも思いますが何かアイディアあればご教示お願いします。 ちなみに最初のTESTBook(シート)では問題なく動いて、上書き保存も普通にできます。このシートのVBAをコピペしているのですが、問題のBookでは上書き保存するとエラー表示で止まってしまいます。 エラーの箇所(黄色ハイライト)は > If .Chart.ChartTitle.Text = Cells(r, c).Text Then で「このオブジェクトにはタイトルがありません」 と表示されます。 最初にタイトルが数字のみの場合に対応していただいたのでタイトルを数字のみ、文字のみで試しましたがダメで、グラフを新しく作成し直してもダメでした。 尚、一番最初の動作確認では2つのグラフの内1つのみしか動かなくて、動かない方のグラフを新規で作成し直したら2つとも期待通りに動くようになったのですが、これで完成と 保存しようとしたら上記のところでエラーが発生して止まります。 VBAを中断してクローズして再度開くとVBAは正常に動きます。 そして保存しようとすると止まります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) '縦パターン Dim r As Long '行番号変数 Dim c As Long '列番号変数 Dim j As Long 'グラフカウンター Dim w As Long Dim d As Long r = 5 'グラフタイトル一覧開始行番号 c = 11 ' グラフタイトル一覧格納列番号 w = 600 d = 50 Do If Cells(r, c).Value = "" Then Exit Do For j = 1 To ActiveSheet.ChartObjects.Count With ActiveSheet.ChartObjects(j) If .Chart.ChartTitle.Text = Cells(r, c).Text Then .Top = ActiveWindow.VisibleRange.Top + d .Left = ActiveWindow.VisibleRange.Left + w d = d + .Height End If End With Next j r = r + 1 Loop End Sub

  • エクセル2000でのVBAについて

    下記のVBAを書いているのですが、3つのIF文を1つに まとめたいのですが教えてください。 If Range("E16") = "申請者" Then Sheets("ログイン").Select Sheets("報告票").Select ActiveSheet.Unprotect Range("M3:U7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("E16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("D3:L7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("F16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("BS3:CA7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select end if end if end if

  • オールクリアボタン VBA どこが間違ってるの?

    VBA初心者です。 設定、部品1、部品2、部品3、部品4と4つのシートがあります。 設定シートにオールクリアボタンを設置し各シートの値だけをクリアする ようにしたいのですが、「subまたはfunctionが定義されていません」という エラーが出てしまいます。 間違ってる箇所とうまくいく方法を教えていただけませんでしょうか? 記述は以下のとうりです。 ちなみにエクセルを開くと全シート保護という設定にしているので まずその解除をしてオールクリアしてまた保護といううふうにしたいです。 Private Sub CommandButton1_Click() '全シート保護解除 Dim sh As Worksheet For Each sh In Worksheets sh.Unprotect Next sh '範囲選択 With Worksheet("部品1").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品2").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品3").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '範囲選択 With Worksheet("部品4").Select Cells.Select 'シートの値だけをクリアする Selection.SpecialCells(xlConstants, 23).ClearContents End With '全シート保護 For Each sh In Worksheets sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True Next sh End Sub 以上です、よろしくお願いします。

  • 結合セルを含むロックしていないセルの値の削除を複数シートで行いたい

    エクセルのマクロ(VBA)に関して、ご質問いたします。 私のレベルは入門編で、いろんなサイトや本を見て、そのまま利用しているくらいのものです。 次のコードは、他人様のサイトで見つけたものです。 Sub 結合セルを含むロックしていないセルの値の削除() Dim c As Range With ActiveSheet .Unprotect For Each c In .UsedRange If Not (c.Locked) Then c.MergeArea.ClearContents Next .Protect UserInterfaceOnly:=True End With End Sub この処理を複数シートに行いたいので、次のコードを(これも他人様のサイトからお借りしています)、上のコードの「Dim c As Range」の後に追加しましたが、アクティブシートは処理されましたが、全部のシートとはいきませんでした。 Dim Sh As Object For Each Sh In Sheets 単純に足しただけでは、だめなのでしょうか。 参考になるかどうかわかりませんが、シートの中には、値を削除しなくてもいいものも含まれています。 シートが全部で40枚弱あるので、全部のシートをチェックして、ロックされていないセル(結合セル含む)に値が入っていたら、値を削除する処理を、マクロ(VBA)で出来たらいいなっと思っております。 教えていただけますでしょうか。 どうぞよろしくお願いいたします。

専門家に質問してみよう