アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。
Excelマクロ初心者です。
現在、Excelのグラフの凡例の位置を変更するマクロが作れなくて困っております。

=前提条件=
    ・マクロを記録するbook(1)とグラフを含むbook(2)は別のファイル
    ・book(1)よりマクロを実行し、book(2)を開き、グラフの凡例の位置を変えたい
=book(2)の構成=
    ・複数のシートが存在(Hiddenも存在)
    ・各シートにグラフが複数存在
=現時点で作成したマクロ=
Sub graph()
  Workbooks.open "C:\********\book(2).xls"
  Workbooks("book(2).xls").Active
  Dim i AS Integer, wsCnt AS Integer
i = 0
wsCnt = Worksheets.Count
  For i = 0 To wsCnt
Worksheets(i).Active
If ActiveSheet.Visible = -1 - xlSheetVisibe Then

For Each ChartObject In ActiveSheet.ChartObjects
     With ActiveChart
ActiveChart.ChartArea.Select
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlBottom
End With
Next ChartObject
End If
Next i
End Sub

現在、各シートがActiveになることまでは確認できています。
各グラフを掴めているかは確認できておりません。

以上となります。
ご多忙とは思いますが、ご教授いただけると幸いです。
宜しくお願い致します。

A 回答 (6件)

手動操作できて、コードも得られるのですから、普通なら回答番号:No.2のマクロが効くはずだと思います。


知識不足で、何故効かないのかよく解りません。

「マクロの記録」したシートで下記マクロを試してみてください。
Sub testグラフ凡例3()
  Dim mycht As Variant
  Dim i As Integer
  
  mycht = Array("グラフ 2", "グラフ 7", "グラフ 12")
  For i = LBound(mycht) To UBound(mycht)
    With ActiveSheet.ChartObjects(mycht(i)).Chart
      .HasLegend = True
      .Legend.Position = xlBottom
    End With
  Next i
End Sub

グラフ名の連番が、5飛びになっているのは他の種類のオブジェクトが描画挿入されていると思います。
オートシェイプとかも含めて、オブジェクトが描画挿入された順に連番が振られるようです。
    • good
    • 1
この回答へのお礼

xls88さん

返答が大変遅くなり申し訳ございませんでした。
当方、仕事の関係で頂いたソースを試すことができませんでした。

さて、頂いたマクロの実行結果ですが、
どうやら対象となるxlsファイルを生成しているアプリケーション側に問題があるようで、
>    With ActiveSheet.ChartObjects(mycht(i)).Chart

にてエラーが生じてしまい、実行が止まってしまいました。

xls88さんには何度も知恵を貸して頂き、
真に感謝しております。
今回のxlsファイルへのマクロの作成は一度保留とし、
アプリケーション側から何か有効な情報を得次第、
再度挑戦したいと考えております。
私自身もマクロを勉強し、困っている方を助けられるよう努めたいと思います。
今後とも宜しくお願い致します。

ありがとうございました。

お礼日時:2009/03/23 09:53

≪グラフの名前の件≫


>新規グラフを作成したところ、このグラフも「グラフエリア」と表示されました。
>このBook自体に何か設定がなされているのでしょうか。
新規グラフで、何故「グラフエリア」という名前になるのか理解できません。
デフォルトで、そのような設定が出来るとは聞いたことがありません。
グラフウイザードとかで、普通にグラフを作成した場合、「グラフ 1」のように連番付きの名前になります。
ただ、この名前は自由に変えることができます。
もしかして、マクロでグラフを作成しているとかで、コード内で名前を付けているとか
あるいは、名前を変更された「元のグラフ」をコピーして使っているとかはないでしょうか?

≪マクロが動作しないシートの件≫
マクロが動作しないシートで、グラフを選択する作業を「マクロの記録」してみてください。
得られたコードを拝見したいのですが、提示していただけないでしょうか。
    • good
    • 0
この回答へのお礼

xls88さん

早速のご対応ありがとうございます。

>≪グラフの名前の件≫
>もしかして、マクロでグラフを作成しているとかで、コード内で名前を付けているとか
>あるいは、名前を変更された「元のグラフ」をコピーして使っているとかはないでしょうか?

■新規グラフの作成は新たに表を作成し、
 そこから手動でグラフを作成致しました。
■今回相談をさせて頂いておりますマクロの実行対象のファイルは、
 他の部署の方より受領しているファイルの為どの様なプロセスで
 作成されたのかは把握できておりませんが、
 恐らく何かのアプリケーションから自動で作成しているものと思われます。

≪マクロが動作しないシートの件≫
>マクロが動作しないシートで、グラフを選択する作業を「マクロの記録」してみてください。
>得られたコードを拝見したいのですが、提示していただけないでしょうか。

数か所名称等を伏せさせて頂きますが、以下の様になります。
(※対象シートは既にアクティヴな状態よりスタート)

Sub Macro1()
ActiveSheet.ChartObject("グラフ 2").Activate
AvtiveChart.ChartArea.Select
ActiveWindow.Visible = False
Windows("******************.xls").Activate
ActiveSheet.ChartObject("グラフ 7").Activate
AvtiveChart.ChartArea.Select
ActiveWindow.Visible = False
Windows("******************.xls").Activate
ActiveSheet.ChartObject("グラフ 12").Activate
AvtiveChart.ChartArea.Select
 ・・・・
End Sub

グラフ名が"グラフ *"と与えられているようです。
(なぜが等差で命名されておりますが…)

以上となります。
度々申し訳ございませんが、
お気づきの点など御座いましたらご教授頂けると幸いです。

お礼日時:2009/03/13 15:19

>名前ボックスとは、Excelの画面.左上部のウィンドウでしょうか。


>(ex. デフォルトのA1セルの場合、[A1]と表示されるウィンドウ)
その通りです。
グラフが選択されると、グラフオブジェクトの名前が表示されます。

>こちらには、各グラフ(全シートにおける)にて、
>「グラフ エリア] と表示されます。
普通「グラフ 1」とかなら解るのですが、「グラフ エリア」となりますか?
もしかするとグラフオブジェクトの名前が「グラフ エリア」ですか?
名前が?ですが、グラフオブジェクトの名前が表示されているようですから、掴めていると思います。

下記マクロをF8キーでステップ実行してみてください。
ステップ実行
http://hp.vector.co.jp/authors/VA016119/step/ste …

Sub testグラフ凡例2()
  Dim cht As ChartObject
  Dim i As Integer, wsCnt As Integer
  wsCnt = Worksheets.Count
  For i = 1 To wsCnt
    If Worksheets(i).Visible = True Then
      Worksheets(i).Select
      For Each cht In Worksheets(i).ChartObjects
        cht.Select
        Exit For
        'With cht.Chart
          '.HasLegend = True
          '.Legend.Position = xlBottom
          '.Legend.Position = xlLegendPositionBottom
        'End With
      Next cht
    End If
  Next i
End Sub

先のコメントで訂正があります。
.Legend.Position = xlBottom

.Legend.Position = xlLegendPositionBottom
どちらも、項目軸と重なる場合と項目軸の更に下方に配置される場合が確認されました。
どういう条件でそうなるのか解りません。
    • good
    • 0
この回答へのお礼

>xls88さん

見ず知らずの私の質問にも関わらず、
たびたびご対応頂き、ありがとうございます。

>その通りです。
>グラフが選択されると、グラフオブジェクトの名前が表示されます。
>普通「グラフ 1」とかなら解るのですが、「グラフ エリア」となりますか?
>もしかするとグラフオブジェクトの名前が「グラフ エリア」ですか?

現在マクロの実行対象となるExcelファイル内に、
新規グラフを作成したところ、このグラフも「グラフエリア」と表示されました。
このBook自体に何か設定がなされているのでしょうか。

>ステップ実行
参照まで添えてのご指示ありがとうございます。
大変助かりました。
さて、実行しての結果ですが、

■マクロが正常に動作するシートの場合
頂いたソースの中で、実行(黄色く反転)されたものを○
          実行されずスキップされたもの×
として記します。 
○If Worksheets(i).Visible = True Then
○  Worksheets(i).Select
○  For Each cht In Worksheets(i).ChartObjects
○    cht.Select
○    Exit For
   (省略)
×  Next cht
○End if

■マクロが動作しないシートの場合

頂いたソースの中で、実行されたものを○
          実行されずスキップされたもの×
として記します。 
○If Worksheets(i).Visible = True Then
○  Worksheets(i).Select
○  For Each cht In Worksheets(i).ChartObjects
×    cht.Select
×    Exit For
   (省略)
×  Next cht
○End if
どうやら>cht.Select<が動作していないようですね…


>.Legend.Position = xlBottom
>.Legend.Position = xlLegendPositionBottom
>どちらも、項目軸と重なる場合と項目軸の更に下方に配置される場合>が確認されました。
>どういう条件でそうなるのか解りません。
補足ありがとうございます。
今のところ、私の実行対象ファイルでは、
どちらでも意図する場所へ配置され、問題はないようで幸いです。

以上となります。
xls88さんに任せっきりになっているようで、
大変恐縮ではありますが、
上記報告で何かお気づきの点等ございましたら、
ご対応宜しくお願い申し上げます。

お礼日時:2009/03/12 16:00

>しかし、最初の1シート目は上記の様に動作をしてくれるのですが、


>2シート目以降はアクティヴになることは確認できたのですが、
>どうやらグラフを掴めていないようです。
おかしいです。該当シートにグラフは存在していますか?

試しに
Worksheets(i).Select
cht.Select
を入れてみてください。
名前ボックスにグラフ名が表示されるかどうか確認してください。

この回答への補足

xls88さん

たびたびサポート、ありがとうございます。
>If Worksheets(i).Visible = True Then
でHiddenシートがスキップされていれば、
該当する全てのシートにグラフが存在しております。

>試しに
>Worksheets(i).Select
>cht.Select
>を入れてみてください。

以下の位置へ挿入してみましたが、これで良いのでしょうか。

If Worksheets(i).Visible = True Then
>Worksheets(i).Select<
For Each cht In Worksheets(i).ChartObjects
>cht.Select<
    ・
    ・
    ・

名前ボックスとは、Excelの画面.左上部のウィンドウでしょうか。
(ex. デフォルトのA1セルの場合、[A1]と表示されるウィンドウ)
こちらには、各グラフ(全シートにおける)にて、
「グラフ エリア] と表示されます。

また、「マクロの記録」を用いた際もChartObjectsとして認識されております。

以上となります。
ご多忙とは思いますが、
お時間のある際にでもご確認宜しくお願いいたします。

補足日時:2009/03/10 11:06
    • good
    • 0

Sub testグラフ凡例1()


  Dim cht As ChartObject
  Dim i As Integer, wsCnt As Integer
  wsCnt = Worksheets.Count
  For i = 1 To wsCnt
    If Worksheets(i).Visible = True Then
      For Each cht In Worksheets(i).ChartObjects
        With cht.Chart
          .HasLegend = True
          .Legend.Position = xlLegendPositionBottom
        End With
      Next cht
    End If
  Next i
End Sub

.Legend.Position = xlBottom
↑の場合、項目軸と重なってしまいます。
.Legend.Position = xlLegendPositionBottom
↑の場合、項目軸の更に下方に配置されました。
    • good
    • 0
この回答へのお礼

>xls88さん
ご返答ありがとうございます。
頂いたソースにて動作させましたところ、
凡例の位置はしっかり下へ移動されており、
大変参考になりました。

しかし、最初の1シート目は上記の様に動作をしてくれるのですが、
2シート目以降はアクティヴになることは確認できたのですが、
どうやらグラフを掴めていないようです。

私自身で、どうにか対処できるよう努めますが、
度々、お手数をお掛け致しますが、
お気づきの点など御座いましたら宜しくお願い致します。

お礼日時:2009/03/09 10:50

対象のグラフを選択した状態で



ActiveChart.Legend.Left = 310
ActiveChart.Legend.Top = 18

参考までに
    • good
    • 0
この回答へのお礼

>hige_082さん
アドバイスありがとうございます。
LeftとTopで位置の指定ができるとは知りませんでした。
参考にさせていただきます。

お礼日時:2009/03/09 10:27

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