【最大10000ポイント】当たる!!質問投稿キャンペーン!

質問させていただきます。

同じようなグラフが埋め込まれたシートが15前後存在する
ブックが多数あります。
グラフの色変更をマクロで一括実行していたのですが、
エラーで停止、原因はグラフのインデックスが一部違っているためでした。(ほとんどは”グラフ 2”ですが、2のほかに4や6、1028なんかもある)
そこで、グラフのインデックスを参照するコードを追加したいのですが、ご教示いただけるでしょうか。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

>”グラフ 4”の場合、


>ChartObjects(2)を
>ChartObjects(4)にすると正常に動きます。
グラフ名の数字は、オートシェイプ等も含まれた数字になります。
例えば、同じシートで
グラフ
オートシェイプ
オートシェイプ
グラフ
といった順で作成(コピーも含む)されると
("グラフ 1")
("オートシェイプ名 2")
("オートシェイプ名 3")
("グラフ 4")
といったように、出現した順番になります。
在る時点で、どれかが削除されてもその数字がつかわれる事はありません。
("グラフ 4")
を削除して、新たにグラフを作成すれば
("グラフ 5")
となります。

Shapesは、すべての図形が返されます。グラフオブジェクト、オートシェイプ、画像、その他、が含まれます。
ChartObjectsは、埋め込みグラフを返します。

ですから
>ChartObjects(2)を
>ChartObjects(4)にすると正常に動きます。
ということは、グラフオブジェクトが最低4つはそのシート上に在ることになります。
もしかすると、非表示状態でシート上に存在しているというようなことはないでしょうか。。

Msgbox Activesheet.ChartObjects.Count
でグラフが何個あるか確認してください。
    • good
    • 0
この回答へのお礼

お蔭様で進展がありました。

ご指摘の通り、線のようになったグラフが
罫線に重なって隠れていたので、削除しました。
(作成当時、グラフを削除せずに列削除をしたと思われます。)

ただ、例えば、”グラフ 14”の場合、
Msgbox Activesheet.ChartObjects.Count
は「2」になりましたが、

マクロの自動記録で、
ActiveSheet.ChartObjects("グラフ 14").Activate
ActiveSheet.Shapes("Chart 14").Select
となります。

また、このシートだけをを新規ファイルにコピーして調べると、
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveSheet.Shapes("Chart 1").Select
になります。

ブックに共存する他のシートが影響するのでしょうか。

お礼日時:2010/04/05 20:40

>いろいろやってみましたが、難しいですね。


どんな事をいろいろ試されたのか解りませんが、難しいことはないと思いますよ。
コードを提示して頂けないので推測ですが、Indexの使い方は理解されたと認識します。

あとは、回答番号:No.5 この回答へのお礼 で明らかになったような阻害要因を排除してやれば上手く回せると思います。
シート上には2個のグラフということですから
Msgbox Activesheet.ChartObjects.Count
で、答えが2以上ならグラフの残骸があるので、それを見つけて削除すれば良いわけです。
グラフをひとつ選択して、Tabキーを押せば次のグラフ(含む他の図形)が選択されます。
姿の見えないグラフも選択されるので、容易に見つけることが出来、削除できます。

余談ですが
回答番号:No.3 で、「お礼の欄を使って、レス出来ると思います。」とコメントしました。
これは、捕捉と合わせて、ひとつの回答に2回レス出来るという意味です。
あと、これ以上の応答を望まれないのなら、締め切り処理をよろしくお願いします。
継続をお望みなら、遠慮なく捕捉で質問してください。
    • good
    • 0

既に、これまでの回答で、Indexの取り方、使い方は書いています。



一意の名前の付け方
ActiveChart.Parent.Name = "ABC1"

手動でやるなら
グラフを選択すれば「名前ボックス」にグラフ名が表示されます。
Excel2007以前なら、「名前ボックス」をクリックし、例えば ABC1 と打ち込み、Enter、で新しい名前になります。
Excel2007ではこの機能が使えなくなっています。
    • good
    • 0
この回答へのお礼

いろいろやってみましたが、難しいですね。
タイムリミットなので、結局エラーだけ手動でやりました。
アドバイスいただきありがとうございました。

お礼日時:2010/04/08 14:33

>ただ、例えば、”グラフ 14”の場合、


>Msgbox Activesheet.ChartObjects.Count
>は「2」になりましたが、

>マクロの自動記録で、
>ActiveSheet.ChartObjects("グラフ 14").Activate
>ActiveSheet.Shapes("Chart 14").Select
>となります。
回答番号:No.5でもコメントしましたが
名前の通し番号と、ChartObjectのインデックスは別物です。
名前の通し番号には不確定要素があります。決め打ちで使う事は難しいと思います。
ChartObjectのIndexを使った方が良いと思います。
あるいは、一意の名前を付けて対処したほうが良いかもしれません。

>また、このシートだけをを新規ファイルにコピーして調べると、
>ActiveSheet.ChartObjects("グラフ 1").Activate
>ActiveSheet.Shapes("Chart 1").Select
>になります。

>ブックに共存する他のシートが影響するのでしょうか。
シートその物をコピーすると、通し番号がリセットされます。
通し番号はそのシートに付随しているもので、他のシートの影響はありません。
    • good
    • 0
この回答へのお礼

>ChartObjectのIndexを使った方が良いと思います。
>あるいは、一意の名前を付けて対処したほうが良いかもしれません。

長時間お付き合いいただいて恐縮ですが、
この辺りのテクニックをもう少しアドバイスいただけるでしょうか。

ご指摘の通り、決め打ちができないので、
「グラフのインデックスを取得したい」と思ったのですが、
これまでの回答から、それは不可能なので、
代替手法を使うのだと思っていました。

よろしくお願いします。

お礼日時:2010/04/06 13:28

>「邪魔そうな図」とは、加工したいグラフ以外に別のグラフがあります


>(同一シート上にグラフが2つ、その他ラインが複数本ちらばっている)。
各シートにはグラフが2つ在るということですか?
必ず2つですか?
2つ以上は無いのですか?
「その他ラインが複数本」とはオートシェイプの直線があるという事ですか?
たとえ、オートシェイプの直線が存在していても、無問題です。

回答番号:No.2 で示したコードは、全てのグラフの系列6に対して加工操作します。
加工したいグラフのインデックス(名前に付けられる番号ではありません)が、2(そのシート上で2番目に作成されたグラフというような意味です)とするなら

Dim ws As Worksheet
Dim cht As ChartObject

For Each ws In ActiveWorkbook.Worksheets
With ws.ChartObjects(2).Chart.SeriesCollection(6)
.Border.ColorIndex = 14
End With
Next ws

とすれば、
全てのシートで、インデックスが 2 のグラフの、系列番号6 の折れ線の色が、ColorIndex値 14 の色に設定されます。
    • good
    • 0
この回答へのお礼

お世話になります。

”グラフ 4”の場合、
ChartObjects(2)を
ChartObjects(4)にすると正常に動きます。

グラフは必ず2つしかないのですが、
確認できたものとしては2、4、6、14、1028があります。

マクロの自動記録では、
普通に選択した場合の”グラフ 4”は、
ActiveSheet.ChartObjects("グラフ 4").Activate
オートシェイプで選択した場合
ActiveSheet.Shapes("Chart 4").Select
です。

1028個もグラフを作るはずはないので、
なぜ”グラフ 1028”が存在するかは不明です。

(加工しない方のグラフも5や15などがあり、一定ではありません。)
(ラインはオートシェイプの直線です。)

お礼日時:2010/04/05 10:34

>前回、書き込みの途中で送信してしまい、修正もできず、


>失礼しました。
なんのことか解りませんが、お礼の欄を使って、レス出来ると思います。

>実行時エラー '1004':
>'SeriesCollection' メソッドは失敗しました: '_Chart' オブジェクト
こちらでは無問題なので解りかねます。
シートの保護とかは関係ないでしょうか?

>元の図から系列7と8を削除したり、
>邪魔そうな図を削除したりしながら試しましたが
「元の図」とはグラフのことですか?
「邪魔そうな図」とはグラフに図形を描画しているという事ですか?
いずれにしても。結果がでているように、無関係だと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。

特に保護はかけていません。
「元の図」とはグラフです。
「邪魔そうな図」とは、加工したいグラフ以外に別のグラフがあります(同一シート上にグラフが2つ、その他ラインが複数本ちらばっている)。

提示していただいたコードで、
ChartObjectがどういう状態ならエラーがでないか、
もう少し試して見ます。

お礼日時:2010/04/04 16:02

全グラフの、系列6、に対して操作すればよいのですか?


下記のようでどうでしょうか?

Dim ws As Worksheet
Dim cht As ChartObject

For Each ws In ActiveWorkbook.Worksheets
'ws.Select
For Each cht In ws.ChartObjects
With cht.Chart.SeriesCollection(6).Border
.ColorIndex = 14
.Weight = xlThin
.LineStyle = xlContinuous
End With
Next
Next ws

この回答への補足

引き続き回答いただきありがとうございます。

前回、書き込みの途中で送信してしまい、修正もできず、
失礼しました。

操作するのは系列6のほかに、7と8の三種あります。

アドバイスのコードを実行したところ、
With cht.Chart.SeriesCollection(6).Border
の箇所で、

実行時エラー '1004':
'SeriesCollection' メソッドは失敗しました: '_Chart' オブジェクト

が発生しました。

解決策がありそうなコードでしたので、
元の図から系列7と8を削除したり、
邪魔そうな図を削除したりしながら試しましたが、
うまくいきませんでした。

メッセージボックスの使用は避けたいので、
この方向で、もう少しアドバイスいただけるでしょうか。

よろしくお願いします。

補足日時:2010/04/04 10:42
    • good
    • 0

下記を試してください。



Dim cht As ChartObject
Dim n As Integer
Dim i As Integer

n = ActiveSheet.ChartObjects.Count
For Each cht In ActiveSheet.ChartObjects
i = i + 1
MsgBox i & "/" & n & vbCrLf & cht.Index & vbCrLf & cht.Name
Next

>グラフの色変更をマクロで一括実行していたのですが
そのコードを提示できないでしょうか。

この回答への補足

回答いただきありがとうございます。

実行しているのは、

Sub b_Chartライン太さ変え()
For shtNo = 1 To Sheets.Count
   Sheets(shtNo).Select
ActiveSheet.ChartObjects("グラフ 2").Activate
ActiveChart.SeriesCollection(6).Select
With Selection.Border
.ColorIndex = 14
.Weight = xlThin
.LineStyle = xlContinuous
End With
     (中略)
  Next shtNo
End Sub

補足日時:2010/04/02 22:04
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBAで現在選択しているグラフ名を取得したい

VBAで現在選択しているグラフ名を取得したいのですが、どうすれば良いでしょうか?

Aベストアンサー

こんな感じかな?

sStr = "アクティブなグラフなし"
If Not (ActiveChart Is Nothing) Then
  sStr = ActiveChart.Name
  sStr = Trim(Right(sStr, Len(sStr) - Len(ActiveSheet.Name)))
End If
MsgBox sStr

QエクセルVBAでグラフの線とマーカを設定したい

エクセルVBAでグラフの線とマーカを設定したいです。
グラフの線は無しでマーカの線が有りにしたいのですが、
マクロで記録したコードを見ると
グラフの線、マーカの線ともにFormat.Line.Visibleで指定しています。
実際にコードを記述しても、以下の様になり、グラフの線が表示されてしまいます。
ChartObjects("1").Chart.SeriesCollection(10).Format.Line.Visible = msoFalse

With ChartObjects("1").Chart.SeriesCollection(10).Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(255, 102, 0)
.Transparency = 0
End With
グラフの線は無しでマーカの線が有りに設定は出来ないのでしょうか?

Aベストアンサー

With ChartObjects("1").Chart.SeriesCollection(10)
.Format.Line.Visible = msoFalse
.MarkerForegroundColor = RGB(255, 102, 0)
End With

あるいは下記で折れ線のみ塗りつぶしなしになります。
Border.ColorIndex = xlNone

QExcelVBA:複数の特定のグラフを選択する方法

初心者です。ご指導をお願いします。

ブックに20枚程度のグラフシートがあります。
これらの設定をまとめて行いたいのですが、全てに同じではなく、このうちの一部のグラフシートを選んで設定したく思います。
例えば、1枚だけなら、

With Chart(5)
各種設定
End With

でいいかもしれませんが、決まった複数シートを、Withの後ろにどのように書くか分かりません。
無理だとは思いつつも以下のように書きましたが失敗です。

With Charts(5),Charts(9),Charts(12) とか
With Union(Charts(5),Charts(9),Charts(12)) とか。

説明が下手ですみません。イメージとしては上記のようなことです。

【質問1】このように複数の特定グラフシートを選択する方法をご存知の方、教えていただけませんか。

なお、今回は仕方が無いので以下のように処理しました。

Dim k As Integer
For k=1 to Charts.Count
   Select Case k
      Case 5,9,12
         Charts(k).PlotArea.Interior.ColorIndex=5
   End Select
Next k

【質問2】お詳しい方から見て、上記の処理方法は望ましいですか。一応意図したとおりに作動しました。

いろいろと調べてみましたが分かりませんでした。なにとぞご教示をお願いいたします。

初心者です。ご指導をお願いします。

ブックに20枚程度のグラフシートがあります。
これらの設定をまとめて行いたいのですが、全てに同じではなく、このうちの一部のグラフシートを選んで設定したく思います。
例えば、1枚だけなら、

With Chart(5)
各種設定
End With

でいいかもしれませんが、決まった複数シートを、Withの後ろにどのように書くか分かりません。
無理だとは思いつつも以下のように書きましたが失敗です。

With Charts(5),Charts(9),Charts(12) とか
With Union(Charts(5),Cha...続きを読む

Aベストアンサー

Dim it As Chart
For Each it In Charts(Array(5, 9, 12))
it.PlotArea.Interior.ColorIndex = 5
Next

QExcelマクロ・グラフエリア・プロットエリアのサイズを変更及び綺麗に並べる

何方か、宜しくお願いします。

質問1
ワークシート上の複数のグラフを選択した状態でマクロを実効して
全てのグラフエリア・プロットエリアを同じサイズに変更するマクロを
教えて下さい。
(下記のコードでは、一つのグラフのプロットエリアのみ変更になります。)

Sub グラフサイズ()
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.PlotArea.Select 'プロットエリア
With Selection
.Top = 17
.Left = 27
.Width = 463
.Height = 330
End With
Range("A3").Select
End Sub
(参考:http://oshiete.nikkeibp.co.jp/qa780484.html)

質問2
質問1で修正したグラフを3列、行数は任意でワークシート上に綺麗に並べたい
のですが、どのようなコードでしょうか。?(グラフとグラフの間は5ポイント位
隙間を入れたいと思います。グラフ数は20~40位、Excel2000)

何方か、宜しくお願いします。

質問1
ワークシート上の複数のグラフを選択した状態でマクロを実効して
全てのグラフエリア・プロットエリアを同じサイズに変更するマクロを
教えて下さい。
(下記のコードでは、一つのグラフのプロットエリアのみ変更になります。)

Sub グラフサイズ()
ActiveSheet.ChartObjects("グラフ 1").Activate
ActiveChart.PlotArea.Select 'プロットエリア
With Selection
.Top = 17
.Left = 27
.W...続きを読む

Aベストアンサー

こんばんは。Wendy02です。

>プロットエリアサイズは固定出来ないのでしょうか?、私が探した所無いようでしたが?Excelの仕様かな?

ある程度は可能ですが、On Error トラップが必要ですね。つまり、そのまま実行してしまうと、物理的?な数値に合わないと、実行時エラーが発生してしまうのです。だいたい、プロットエリアの大きさは、グラフエリアの90%ぐらいだったかな? だから、理論的に、一旦、プロットエリアの大きさを取って、グラフエリアを変更してしまえば可能だと思うのです。その後で、並びの位置整理すればよいわけですね。でも、そうすると、今度は、グラフ全体の大きさがマチマチになる可能性があるわけです。

それで、最初の私のコードのように、グラフエリアは、余計なものだとして、私は、消してしまったのです。結構、見栄えが良いなって、自負したのですが……。^^;

QエクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ

エクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ化のエラー(1004)解消方法について。

予めWorkbook1のシートに6つの埋め込みグラフを用意してあります。
Workbook2のシート1に数値データがあり、シート2に先のWorkbook1のシートを
コピペして、数値の参照先をWorkbook2のシート1に変更して利用したいと考えております。
以下の処理を用いて、グラフ内の文字サイズが変わってしまうので、文字サイズを再設定しなおそうと、
埋め込みグラフを1つずつ選択し、文字サイズ設定を行おうとしているのですが、
chart 3を選択したところで、chartobjectクラスのactivateメソッドが失敗 (エラー 1004)
が出てしまいます。

ちなみに、Workbook1のシート上で、以下の処理を行ってもエラーは出ません。
Workbook2にコピペしたものに対して、chart 1、chart 2の処理が済み、
chart 3になった所でエラーが発生します。
解決方法のご教授をよろしくお願い致します。

grp_cnt = ActiveSheet.ChartObjects.Count
For j = 1 To grp_cnt
Workbooks(2).Worksheets(2).Activate

'シート上のチャート中より、指定した名前のチャートを探す。
Set obj = ThisWorkbook.ActiveSheet.ChartObjects(j)
crt_name = ThisWorkbook.ActiveSheet.ChartObjects(j).Name

'変更したいチャートをアクティブにする。
ActiveSheet.ChartObjects(crt_name).Activate
ActiveChart.ChartArea.Select
Selection.AutoScaleFont = True
With Selection.Font
.Size = 10
End With

Next j

エクセルVBAで埋め込みグラフ(ChartObjects)のアクティブ化のエラー(1004)解消方法について。

予めWorkbook1のシートに6つの埋め込みグラフを用意してあります。
Workbook2のシート1に数値データがあり、シート2に先のWorkbook1のシートを
コピペして、数値の参照先をWorkbook2のシート1に変更して利用したいと考えております。
以下の処理を用いて、グラフ内の文字サイズが変わってしまうので、文字サイズを再設定しなおそうと、
埋め込みグラフを1つずつ選択し、文字サイズ設定を行おうとしているのですが、
c...続きを読む

Aベストアンサー

>→  For Each ch In ActiveSheet.ChartObjects
ここで型不一致エラーが出るのも不可解ですが、とりあえず

>実行時エラー'1004 Objectクラスの Activate メソッドが失敗しました
>が発生する次第です。
>一体、何故なのでしょう?不可解です。
この原因について書きますと、
>ActiveChart.ChartArea.Select
これが原因ですね。解消するには
>crt_name = ThisWorkbook.ActiveSheet.ChartObjects(j).Name
Windows(Workbooks(2).Name).Activate '※
>'変更したいチャートをアクティブにする。
>ActiveSheet.ChartObjects(crt_name).Activate
※を追加してください。

『単純に考えてchart 3の名前を持つChartObjectが無いから
エラーになるのでしょう。』
なんて書きましたが、単純すぎました..orz
グラフウィンドウがアクティブになったままなので、エラーになってるかと。
Windows(ActiveWorkbook.Name).Activate
でもいいですので、WorkbookのWindowを明示的にActiveにしてあげる必要があります。

基本、ActivateやSelectを使わないコードにしたほうが良いです。

>→  For Each ch In ActiveSheet.ChartObjects
ここで型不一致エラーが出るのも不可解ですが、とりあえず

>実行時エラー'1004 Objectクラスの Activate メソッドが失敗しました
>が発生する次第です。
>一体、何故なのでしょう?不可解です。
この原因について書きますと、
>ActiveChart.ChartArea.Select
これが原因ですね。解消するには
>crt_name = ThisWorkbook.ActiveSheet.ChartObjects(j).Name
Windows(Workbooks(2).Name).Activate '※
>'変更したいチャートをアクティブにする。
>ActiveSheet.ChartOb...続きを読む

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Qエクセル 0や空白のセルをグラフに反映させない方法

以下の点でどなたかお教えください。

H18.1~H20.12までの毎月の売上高を表に記載し、その表を元にグラフを作成しています。グラフに反映させる表の範囲はH18.1~H20.12の全てです。
そのためまだ経過していない期間のセルが空白になり、そこがグラフに反映され見づらくなります。
データを入力する都度グラフの範囲を変更すればいいのですが、うまく算式や設定等で空白や0円となっているセルをグラフに反映させない方法はありますか?

お手数ですが、よろしくお願いいたします。

Aベストアンサー

売上高のセルは数式で求められているのですよね?
それなら
=IF(現在の数式=0,NA(),現在の数式)
としてみてください。
つまり、0の場合はN/Aエラーにしてしまうんです。N/Aエラーはグラフに反映されません。

QVBA グラフの存在の判定について

お世話になります。

現在VBAの勉強を行っているのですが、グラフについてどうぞ知恵をお貸しください。
エクセルの操作でグラフを作成した後、そのシートもしくはブックにグラフが存在するかどうかを確かめる判定式を作りたいと思っています。
グラフそのものが存在するかどうかの判定をしたい場合、どのような記述が必要になるのでしょうか?

Aベストアンサー

n = Workbooks("book1").Charts.Count

n=0ならグラフシートがない。
n>0ならグラフシートがある。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング