Excel VBA質問箱 IV

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

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


2455 / 13645 ツリー ←次へ | 前へ→

【67876】埋め込みグラフにおいて選択したpointのindexの取得方法 ゆたか 11/1/14(金) 15:42 質問[未読]
【67881】Re:埋め込みグラフにおいて選択したpointの... momo 11/1/14(金) 16:50 発言[未読]
【67885】Re:埋め込みグラフにおいて選択したpointの... ゆたか 11/1/14(金) 17:28 発言[未読]
【67887】Re:埋め込みグラフにおいて選択したpointの... momo 11/1/14(金) 17:36 発言[未読]
【67920】Re:埋め込みグラフにおいて選択したpointの... ゆたか 11/1/17(月) 10:36 お礼[未読]
【67891】Re:埋め込みグラフにおいて選択したpointの... ichinose 11/1/14(金) 18:17 発言[未読]
【67921】Re:埋め込みグラフにおいて選択したpointの... momo 11/1/17(月) 11:16 発言[未読]
【67922】Re:埋め込みグラフにおいて選択したpointの... ゆたか 11/1/17(月) 11:30 お礼[未読]
【67934】Re:埋め込みグラフにおいて選択したpointの... ゆたか 11/1/17(月) 19:52 質問[未読]

【67876】埋め込みグラフにおいて選択したpointの...
質問  ゆたか  - 11/1/14(金) 15:42 -

引用なし
パスワード
   埋め込みグラフにおいて選択した要素(point)の番号(index?)を取得するにはどうすればよいのでしょうか?
最終的に私が作りたいのは選択した要素のデータのセルを取得するというマクロです。

「グラフの要素を選択する」という作業を「マクロの記録」すると
ActiveChart.SeriesCollection(1).Points(3).select
となりますよね。

この3という数字を取得したいのですが、このときのselectionをウォッチウィンドウでほじくっても、それらしいプロパティは見当たりませんでした。

そこでネットでいろいろ検索をかけたところ、ラベルを貼って、その.nameから番号を取得するという方法は見つけることが出来ました。

最悪、この方法でもよいのですが、直接番号を取得する方法は無いのでしょうか?
(出来れば作業途中でこのマクロを動かしても「戻る」ボタンを押せるようにしておきたいので、この方法は都合が良くありません)

【67881】Re:埋め込みグラフにおいて選択したpoin...
発言  momo  - 11/1/14(金) 16:50 -

引用なし
パスワード
   ▼ゆたか さん:
>そこでネットでいろいろ検索をかけたところ、ラベルを貼って、その.nameから番号を取得するという方法は見つけることが出来ました。

むか〜しどこかで書いたコードですが
 Sub Get_Point()
 Dim myVar As Variant
 
 If TypeName(Selection) = "Point" Then
  With Selection
   .HasDataLabel = True
   myVar = Split(Mid(Split(.DataLabel.Name, " ")(1), 2), "P")
   .HasDataLabel = False
  End With
  MsgBox "系列:" & myVar(0) & vbCr & "要素:" & myVar(1)
 Else
  MsgBox "要素が選択されていません"
 End If
 End Sub

こんな感じの事ですよね?
でも

>(出来れば作業途中でこのマクロを動かしても「戻る」ボタンを押せるようにしておきたいので、この方法は都合が良くありません)
であれば不可能ですよね。

私はこれ以外の方法は知りません。

【67885】Re:埋め込みグラフにおいて選択したpoin...
発言  ゆたか  - 11/1/14(金) 17:28 -

引用なし
パスワード
   momoさん、返答ありがとうございます。
「検索して見つけたラベルを貼って〜」がまさしく、そのようなプログラムでした。

やはり直接番号を拾う方法は無いのですかね・・・。

無いとしたら、なんで無いんだろう・・・f(^^;

【67887】Re:埋め込みグラフにおいて選択したpoin...
発言  momo  - 11/1/14(金) 17:36 -

引用なし
パスワード
   ▼ゆたか さん:
そのコードを書く時にかなり色々検証した記憶があるので
無さそうですね。(無い事を証明するのは大変なので・・・)

>無いとしたら、なんで無いんだろう・・・f(^^;
そのようなプロパティというかインターフェースが用意されていないからです。

いわゆる、「仕様」という事ですかね?

【67891】Re:埋め込みグラフにおいて選択したpoin...
発言  ichinose  - 11/1/14(金) 18:17 -

引用なし
パスワード
   ▼ゆたか さん:
こんばんは。

>埋め込みグラフにおいて選択した要素(point)の番号(index?)を取得するにはどうすればよいのでしょうか?
>最終的に私が作りたいのは選択した要素のデータのセルを取得するというマクロです。

以前こんな質問に対して、投稿したことがありました。

www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=52055;id=excel

グラフのイベントを使った方法です
試してみてください




【67920】Re:埋め込みグラフにおいて選択したpoin...
お礼  ゆたか  - 11/1/17(月) 10:36 -

引用なし
パスワード
   ▼momo さん:

MSお得意の「仕様です」かね(笑)

momoさんも同じ疑問を持ったことがあるんですね。

「グラフの要素を選択する」という作業を「マクロの記録」すると
ActiveChart.SeriesCollection(1).Points(3).select
となり、3という数字を取得できているのだから、プロパティにあっていいと思うんですけどねぇ・・・。

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

【67921】Re:埋め込みグラフにおいて選択したpoin...
発言  momo  - 11/1/17(月) 11:16 -

引用なし
パスワード
   ▼ichinose さん:
なるほど、イベントでElementIDがxlSeriesの場合に
Arg1がSeriesのIndexで
Arg2がPointsのIndexが拾えるのですね。

ボタンか何かでイベント開始すれば簡単に使えそうですね。
私も勉強させて頂きました。ありがとうございます。

Private WithEvents cht As Chart

Private Sub CommandButton1_Click()
Set cht = Me.ChartObjects(1).Chart
End Sub

Private Sub cht_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
If ElementID = xlSeries Then
 If Arg2 > 0 Then
  MsgBox "SeriesIndex= " & Arg1 & vbLf & "PointIndex= " & Arg2
 End If
 Cancel = True
 Set cht = Nothing
End If
End Sub

【67922】Re:埋め込みグラフにおいて選択したpoin...
お礼  ゆたか  - 11/1/17(月) 11:30 -

引用なし
パスワード
   ▼ichinose さん:

おぉ!取得できていますね!!
ありがとうございます!

BeforeDoubleClickについてmsdnで調べてみて、その流れで「pointindex」を検索したところ、GetChartElementでも取得が可能なのですね。
(いままで「point index」と間に空白入れて検索してたので、全然見つけれなかった・・・。)

当初、「フォーム立ち上げ」「要素を選択」「フォーム内のボタンをクリック」⇒「データのセルへ飛ぶ(選択)」としようと考えていましたが(これならGetChartElement?)
ichinoseさんが示してくださった、ダブルクリックでの方法の方が使いが良さそうですね。

pointindexについてだけでなく、よりよい方法を知ることが出来、良かったです。
本当にありがとうございました!


っとここまで書いて気が付いたのですが、このマクロはアドイン化しようとしていたのです。(書き忘れていました・・・)
イベントプロシージャはクラスモジュールに書けばいいみたいですが、クラスモジュールを使用したことが無いもので、漠然とした不安が・・・。

とりあえずチャレンジしてみます!

【67934】Re:埋め込みグラフにおいて選択したpoin...
質問  ゆたか  - 11/1/17(月) 19:52 -

引用なし
パスワード
   ▼ichinose さん:
おかげさまで一応完成させることが出来ました。
フォームにボタンを2つ作り(1.グラフ選択2.そのグラフに戻れる)、
最終的にこのようなプログラムになりました。

Option Explicit
Private WithEvents cht As Chart

Private Sub CommandButton1_Click()
Dim obj As Object
  
  Set obj = Selection
  Do Until TypeName(obj) = "ChartObject"
    Set obj = obj.Parent
    If TypeName(obj) = "Workbook" Then 'グラフに関係しないものが選択されている場合
      Application.ScreenUpdating = True
      MsgBox "グラフが正しく選択されていません"
      Application.ScreenUpdating = True
      Exit Sub
    End If
  Loop
  Set cht = obj.Chart
  
  If cht.HasTitle = True Then
    chtName.Caption = cht.ChartTitle.Text
  Else
    chtName.Caption = "(" & cht.Name & ")"
  End If
  
End Sub

Private Sub cht_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
Dim a As Integer
Dim b As Integer
Dim aa As Integer
Dim bb As Integer
Dim x As Integer
Dim n As Long
Dim fml As String
Dim dCell As Range

  If ElementID = xlSeries Then
    If Arg2 > 0 Then
    With cht.SeriesCollection(Arg1)
      x = InStr(.Formula, "(") + 1
      'nameとcategory_labelsの後ろの","から、valuesの先頭を取得
      For n = 1 To 2
        a = InStr(x, .Formula, ",") + 1
        b = InStr(x, .Formula, "(")
        If a > b And b <> 0 Then
          x = InStr(x + 1, .Formula, ")") + 2
        Else
          x = a
        End If
      Next n
      'valuesの最後尾を取得
      aa = InStr(x, .Formula, ",")
      bb = InStr(x, .Formula, "(")
      If aa > bb And bb <> 0 Then
        aa = InStr(x, .Formula, ")")
        a = x + 1
      End If
      'valuesを取得(文字列)
      fml = Mid(.Formula, a, aa - a)
      n = 1
      For Each dCell In Range(fml)
        If n = Arg2 Then
          dCell.Parent.Activate
          dCell.Select
          Exit For
        End If
        n = n + 1
      Next dCell
    End With
    End If
    Cancel = True
  Else
    Cancel = True
  End If
End Sub

Private Sub CommandButton2_Click()
  cht.Parent.Select
  cht.Parent.Activate
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Set cht = Nothing
End Sub


ただ、気になるのが、

For Each dCell In Range(fml)
  If n = Arg2 Then
    dCell.Select
    Exit For
  End If
  n = n + 1
Next dCell

の部分です。

Valuesデータ(変数fml)が「Sheet1!$A$1:$A$10,Sheet1!$A$21:$A$30」のような複数の範囲の時に
range(fml).item(Arg2)
range(fml).cells(Arg2)
等とすると、「Arg2=15」だとAddressは「$A$15」が返ってきてしまうのです。(僕にとっては不思議なのですが)
色々試した結果、「これでいいのか?」迷いつつも上記のようなプログラムとしました。
問題点、もしくはもっとスマートな方法があれば後学のためにもご教示いただけないでしょうか?

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