Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4895 / 13644 ツリー ←次へ | 前へ→

【53688】外部エクセルファイルの特定のグラフからパーセントの値を取得する方法 かおり 08/2/1(金) 14:47 質問[未読]
【53691】Re:外部エクセルファイルの特定のグラフか... りん 08/2/1(金) 19:51 発言[未読]
【53718】Re:外部エクセルファイルの特定のグラフか... かおり 08/2/4(月) 17:00 質問[未読]
【53724】Re:外部エクセルファイルの特定のグラフか... りん 08/2/5(火) 8:20 回答[未読]
【53740】Re:外部エクセルファイルの特定のグラフか... かおり 08/2/5(火) 14:28 お礼[未読]

【53688】外部エクセルファイルの特定のグラフから...
質問  かおり  - 08/2/1(金) 14:47 -

引用なし
パスワード
   VBA超初心者です。

特定のフォルダに入っている複数のエクセルファイル内の、特定のシートには複数のグラフが存在しています。
そのグラフは円グラフで、パーセント表示に設定されています。

仮に

特定のフォルダへのパス:「C:\Documents and Settings\Macro」
格納されているエクセルファイル(参照先):A.xls、B.xls、C.xls、…
シート名(全てのエクセルファイルに共通):「グラフ」
情報を取得したいグラフ名:「1.」(グラフの種類は円グラフ、パーセント表示)

だとして、カレントexcelファイルに、参照元の円グラフ「1.」で表示されているパーセントの値のみを分類別にVBAで取得することはできますでしょうか?
たとえば、円グラフの区分「4月」が10%という表示だった場合、「10」という値を取得したいと考えています。
区分が「4月」「5月」「6月」「7月」とあって、それぞれ全ての%の値を取得したいと考えています。

見よう見まねでVBを書いてみましたが、
どうしても「グラフのパーセントの値を取得して」コードの書き方が分かりません。


Sub パーセントの値取得()

Dim MyPath As String
Dim MyName As String
Dim OpenFileName As String
Dim n As Long
 
 MyPath = "C:\Documents and Settings\Macro" 'xlsの格納先フォルダ名の指定
 MyName = Dir(MyPath & "\*.xls") 'xlsファイルすべてを選択対象に
 Do While MyName <> "" 'フォルダ内の全てのファイルを参照するまで処理
  OpenFileName = MyPath & "\" & MyName '参照元のエクセルファイルのフルパス
  n = FreeFile 'ファイル番号の値を宣言
  Open OpenFileName For Input As #n '参照先ファイルを開く
  
    'ここにシート"グラフ"の特定のグラフ「1.」を選択し、
    '表示されているパーセンテージの値を取得するコードが書きたい

  Close #n 'ファイルを閉じる
    
    'ここにカレントエクセルファイルの指定のセル内に、
    '取得した値を入れるコードを書く

  MyName = Dir '参照先ファイルをnullに戻す
 Loop ’処理を繰り返す
End Sub


(見よう見まねでVBを書いているのでファイル参照のコードも間違っているのかもしれません。。。すみません)

グラフの表示のパーセントから直接値を取得することは不可能なのでしょうか?
自分なりにいろいろ検索してみましたが、グラフの値を直接取得するコードが見当たりませんでした。

かなり説明不足なのかもしれませんが、ご教授のほどよろしくお願いいたします。

【53691】Re:外部エクセルファイルの特定のグラフ...
発言  りん E-MAIL  - 08/2/1(金) 19:51 -

引用なし
パスワード
   かおり さん、こんばんわ。

>区分が「4月」「5月」「6月」「7月」とあって、それぞれ全ての%の値を取得したいと考えています。

>グラフの表示のパーセントから直接値を取得することは不可能なのでしょうか?
>自分なりにいろいろ検索してみましたが、グラフの値を直接取得するコードが見当たりませんでした。
直接取得する方法は私も知りませんが、よそのブックを処理するということなので、保存せずに閉じるなら、データラベルを設定してその値を読み取ってみてはいかがでしょうか。

アクティブなシートに円グラフを置いて試してみてください。
Sub Macro1()
  Dim co As ChartObject, pp As Point, DT As Variant
  For Each co In ActiveSheet.ChartObjects
   '単体の円グラフなら処理
   Select Case co.Chart.ChartType
     Case xlPie, xl3DPie, xlPieExploded, xl3DPieExploded
      'データラベルを表示 例)『4月;10%』
      co.Chart.SeriesCollection(1).ApplyDataLabels AutoText:=True, LegendKey:=False, _
         HasLeaderLines:=True, ShowSeriesName:=False, ShowCategoryName:=True, _
         ShowValue:=False, ShowPercentage:=True, ShowBubbleSize:=False, Separator:="; "
      'データラベルの内容を表示
      For Each pp In co.Chart.SeriesCollection(1).Points
        '分割
        DT = Split(pp.DataLabel.Characters.Text, ";")
        '結果
        MsgBox DT(1), vbInformation, DT(0)
      Next
      'データラベル非表示
      co.Chart.SeriesCollection(1).ApplyDataLabels AutoText:=True, LegendKey:=False, _
         HasLeaderLines:=True, ShowSeriesName:=False, ShowCategoryName:=False, _
         ShowValue:=False, ShowPercentage:=False, ShowBubbleSize:=False
   End Select
  Next
End Sub

こんな感じです。

【53718】Re:外部エクセルファイルの特定のグラフ...
質問  かおり  - 08/2/4(月) 17:00 -

引用なし
パスワード
   りん さん、丁寧なご回答ありがとうございます。

円グラフをアクティブなシートに用意し、
りんさんに教えていただいたスクリプトを試してみたのですが、
どうしても下記の部分で「実行時エラー'1004'アプリケーション定義またはオブジェクト定義のエラーです」と出て止まってしまいます。


>      'データラベルを表示 例)『4月;10%』
>      co.Chart.SeriesCollection(1).ApplyDataLabels AutoText:=True, LegendKey:=False, _
>         HasLeaderLines:=True, ShowSeriesName:=False, ShowCategoryName:=True, _
>         ShowValue:=False, ShowPercentage:=True, ShowBubbleSize:=False, Separator:="; "

対称オブジェクト不明のエラーということでしょうか?
一応シートは指定し、該当ChartObjectはSelect Caseで判断できてるような気がするんですが。。。

すみません、初心者ゆえのつまづきのような気がします。。


ちなみに環境はExcel2000です。

【53724】Re:外部エクセルファイルの特定のグラフ...
回答  りん E-MAIL  - 08/2/5(火) 8:20 -

引用なし
パスワード
   かおり さん、おはようございます。

>どうしても下記の部分で「実行時エラー'1004'アプリケーション定義またはオブジェクト定義のエラーです」と出て止まってしまいます。

>ちなみに環境はExcel2000です。
XL2KとXLXP(私の標準環境)でApplyDataLabelsの名前付き引数が変更になっているためでした、ついでに試したらXL2007でもうまくいかなかったので、いろいろと変更しました。

Sub Macro1()
  Dim co As ChartObject, pp As Point, DT As Variant, sc As Series
  For Each co In ActiveSheet.ChartObjects
   '単体の円グラフなら処理
   Select Case co.Chart.ChartType
     Case xlPie, xl3DPie, xlPieExploded, xl3DPieExploded
      'データラベルを表示 例)『4月;10%』
      '//////////////////////////////////////////////////////////////
      '共通で使える名前付き引数はこんな感じ
      co.Chart.SeriesCollection(1).ApplyDataLabels _
           Type:=xlDataLabelsShowLabelAndPercent, _
           AutoText:=True, _
           LegendKey:=False, _
           HasLeaderLines:=False
      'データラベルの内容を表示
      For Each pp In co.Chart.SeriesCollection(1).Points
        '分割(デフォルトはvbLf)
        DT = Split(pp.DataLabel.Caption, vbLf)
        '結果
        MsgBox DT(1), vbInformation, DT(0)
      Next
      co.Chart.SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowNone
   End Select
  Next
End Sub

こんな感じです。

ちなみに、
XL2000→引数が違ってて1004エラー(引数を絞って対応)
XL2007→ラベルをCharacters.Textで正しく取得できなくてエラー(Captionに変更)

ということで、前回のコードではXLXPでしかまともに動かないというおそまつw
遅くなって&ややこしくしてすみませんでした。

【53740】Re:外部エクセルファイルの特定のグラフ...
お礼  かおり  - 08/2/5(火) 14:28 -

引用なし
パスワード
   りん さん、こんばんわ。

引き続きとても丁寧に教えていただいてありがとうございます。
初心者でコードの理解に時間がかかってしまい、お返事が遅れてしまって申し訳ないです。

さっそくテストしてみましたら、MsgBoxで値を取得することができました!
値を文字列変換して左から2個目までの文字列を取得…などの支持が出来れば、
値のみ取得ができそうですね。

それにしてもやはりバージョンによってコードが動く・動かないがあるのですね。知りませんでした。。先にスペックを書き込まず二度手間になってしまい申し訳ありません。


また引き続き質問させていただくかもしれないですが、よろしくお願いいたします。

ほんとうにありがとうございました!!とても助かります。

4895 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free