Excel VBA質問箱 IV

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

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


2382 / 13646 ツリー ←次へ | 前へ→

【68365】指定位置のグラフ要素を取得するが2007で動かない eyuka 11/2/27(日) 13:25 質問[未読]
【68366】Re:指定位置のグラフ要素を取得するが2007... kanabun 11/2/27(日) 20:27 発言[未読]
【68367】Re:指定位置のグラフ要素を取得するが2007... eyuka 11/2/27(日) 21:34 質問[未読]
【68368】Re:指定位置のグラフ要素を取得するが2007... kanabun 11/2/27(日) 21:56 発言[未読]
【68369】Re:指定位置のグラフ要素を取得するが2007... n 11/2/27(日) 22:24 発言[未読]
【68370】Re:指定位置のグラフ要素を取得するが2007... kanabun 11/2/28(月) 9:20 発言[未読]
【68376】Re:指定位置のグラフ要素を取得するが2007... eyuka 11/2/28(月) 15:45 お礼[未読]

【68365】指定位置のグラフ要素を取得するが2007で...
質問  eyuka  - 11/2/27(日) 13:25 -

引用なし
パスワード
   こちらの以前のトピック
『指定位置のグラフ要素を取得する』
を参考にさせていただいて、2002で使っていたクラスモジュールの以下のコードが、
2007に変えたところ(OSもXPからwindows7に変えました)、動かなくなってしまいました。
アクティブシート上にある、横軸が時刻、縦軸が値のグラフ上のポイントをクリックするとそのポイントの時刻を取得してK列に記述させるというものです。
2002では動いていたのですが、2007に変えたところ、反応が無くなってしまいました。(グラフ上のポイントをクリックしても、変化がない)

もし、原因がお分かりになる方がいらっしゃいましたら、教えてください。

クラスモジュールclass1のコード

Public WithEvents cht As Chart

Private Sub cht_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
  Dim ElemID As Long, Arg1 As Long, Arg2 As Long
  Dim Var As Variant
  Dim Msg As String


  cht.GetChartElement x, y, ElemID, Arg1, Arg2
'  ↑このオブジェクト変数の変更
   Select Case ElemID '定数値の詳細はヘルプを参照

   Case xlSeries 'データ系列
     Var = cht.SeriesCollection(Arg1).XValues

     Msg = Var(Arg2)
 
     Var = cht.SeriesCollection(Arg1).Values
     Msg2 = CDate(Msg) & vbCrLf & "値:" & Var(Arg2)
    
   Dim intRet As Integer
   Dim strMsg1 As String
   Dim strMsg2 As String
   Dim strMsgX As String

strMsg1 = Msg2 & vbCrLf & "削除始まりの時刻ならyes、終わりならNoをクリック"
intRet = MsgBox(strMsg1, _
     vbYesNoCancel + vbInformation + vbDefaultButton3, strMsg2)
Range("K1").Value = "追加削除"
If intRet = vbYes Then
  If Range("K2").Value = "" Then
   Range("K2").Value = Msg
  Else
   Range("K1").End(xlDown).Offset(1, 0).Value = Msg
  End If
 
ElseIf intRet = vbNo Then
        Range("K1").End(xlDown).Offset(0, 1).Value = Msg
      
    
     MsgBox prompt:=Msg2 & vbCrLf & "削除始まりの時刻ならyes、終わりならNoをクリック", Buttons:=vbYesNoCancel
    
   
     End If

   Case Else
    MsgBox "dataを指定してください"

   End Select
       On Error Resume Next
   Range("K2").CurrentRegion.Offset(1).Resize(, 2).NumberFormat = "h:mm:ss"

End Sub

標準モジュールには、
Sub 追加削除時刻取得()

  ActiveSheet.ChartObjects.Select
  
  Set cht_class = New Class1
  Set cht_class.cht = ActiveChart
End Sub

【68366】Re:指定位置のグラフ要素を取得するが20...
発言  kanabun  - 11/2/27(日) 20:27 -

引用なし
パスワード
   ▼eyuka さん:
こんにちは〜

>2002で使っていたクラスモジュールの以下のコードが、
>2007に変えたところ(OSもXPからwindows7に変えました)、動かなくなってしまいました。

ほんとに2002で動きましたか?
こうしたらどうでしょう?
Class2を以下のように作って、
標準モジュールの Chartクラスのセット()
を実行しします。


'------------------------ クラスモジュール Class2
Option Explicit
Private WithEvents Chart0 As Chart

Public Property Set Chart(ThisChart As Chart)
  Set Chart0 = ThisChart
End Property

Private Sub Class_Terminate()
  Set Chart0 = Nothing
End Sub

Private Sub Chart0_Select(ByVal ElementID As Long, _
          ByVal nSeries As Long, ByVal iPoint As Long)
 Dim VarX, VarY
 Dim t1 As Date
 Dim ss As String
 Dim Msg As String

 Select Case ElementID
  Case xlSeries   '--- データ系列が選択されたとき
   If iPoint > 0 Then ' --特定の要素が選択されたとき
     With Chart0.SeriesCollection(nSeries)
       VarX = .XValues
       VarY = .Values
       t1 = CDate(VarX(iPoint))
       ss = t1 & " 値:" & VarY(iPoint)
     End With
     Msg = ss & vbCrLf & _
      "削除始まりなら<Yes> 終わりなら<No>"
     '----------------------------------- 分岐処理 (要、再検討)
     Select Case MsgBox(Msg, vbYesNoCancel Or _
       vbInformation Or vbDefaultButton3)
      Case vbYes
       If IsEmpty(Range("K2").Value) Then
        Range("K2").Value = t1
       Else
        Range("K1").End(xlDown).Offset(1).Value = t1
       End If
      Case vbNo
        Range("K1").End(xlDown).Offset(, 1).Value = t1
     End Select
   End If
 End Select

End Sub

'------------------------ 標準モジュール
Option Explicit
Dim Cht As Class2

Sub Chartクラスのセット()
 Set Cht = New Class2
 Set Cht.Chart = ActiveSheet.ChartObjects(1).Chart
 
End Sub

Sub Chartクラスの解放()
 Set Cht = Nothing
End Sub

【68367】Re:指定位置のグラフ要素を取得するが20...
質問  eyuka  - 11/2/27(日) 21:34 -

引用なし
パスワード
   ▼kanabun さま:
ありがとうございます!

>ほんとに2002で動きましたか?
はい、2002では動いていました。。

>こうしたらどうでしょう?

コードを本当にありがとうございます。
早速、class2を作り、標準モジュールからtryしてみたのですが
うまくいきません。。
チャート内のポイントをクリックしても、メッセージボックスが出てきませんでした。
やり方がまずいのかもしれませんね。。

【68368】Re:指定位置のグラフ要素を取得するが20...
発言  kanabun  - 11/2/27(日) 21:56 -

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

>早速、class2を作り、標準モジュールからtryしてみたのですが
>うまくいきません。。
>チャート内のポイントをクリックしても、メッセージボックスが出てきませんでした。
>やり方がまずいのかもしれませんね。。

手動でグラフの系列のと特定の要素(ポイント)をSelectしようとするとき、
どうしますか?
まず、系列を選択して、それから特定の要素をクリックしないと
「系列内の要素」の選択になりませんよね?

そのようにして、2度クリックされましたか?

【68369】Re:指定位置のグラフ要素を取得するが20...
発言  n  - 11/2/27(日) 22:24 -

引用なし
パスワード
   2007は系列クリックでcht_MouseUpイベントが利かないようですね。
もし1クリックで済ませたい場合は変わりにcht_MouseDownイベントを使うと良いかもしれません。

標準モジュール側にPublic変数を設定して
Option Explicit
Public ElemID As Long, Arg1 As Long, Arg2 As Long

Sub test()
  Dim Var As Variant
  Dim Msg As String
  Dim Msg2 As String

  Var = cht_class.cht.SeriesCollection(Arg1).XValues
  Msg = Var(Arg2)
:(以下現在のcht_MouseUpイベント処理の中身)
End Sub

cht_MouseDownイベントには
Private Sub cht_MouseDown(ByVal Button As Long, _
             ByVal Shift As Long, _
             ByVal x As Long, _
             ByVal y As Long)
  cht.GetChartElement x, y, ElemID, Arg1, Arg2
  If ElemID = xlSeries Then
    Application.OnTime Now, "test"
  End If
End Sub

Application.OnTimeメソッドを使って標準モジュールの"test"プロシージャを呼び出すようにします。

【68370】Re:指定位置のグラフ要素を取得するが20...
発言  kanabun  - 11/2/28(月) 9:20 -

引用なし
パスワード
   > 標準モジュールには、
> Sub 追加削除時刻取得()
>
>  ActiveSheet.ChartObjects.Select
>  
>  Set cht_class = New Class1
>  Set cht_class.cht = ActiveChart
>End Sub

提示の標準モジュールコード、ぼくのVBEでは
モジュールの先頭に
Option Explicit
(変数はいつも宣言してから使う)が宣言してあったため
どのバージョンのExcelでも動きません。

とりあえず、次のように直したら、
'---------------------------標準モジュール
Option Explicit
Dim Cht_Class As Class1

Sub 追加削除時刻取得()
  'ActiveSheet.ChartObjects.Select
  Set Cht_Class = New Class1
  Set Cht_Class.Cht = ActiveSheet.ChartObjects(1).Chart 'ActiveChart
End Sub
'
Sub Release_ChtClass()
  Set Cht_Class = Nothing
End Sub
'----------------------------
XL2007を除いて走るようになりました。
      Class1
XL2002   ○
XL2003   ○
XL2007   ×
XL2010   ○

2007でダメなのは nさんのおっしゃるように、
> 2007は系列クリックでcht_MouseUpイベントが利かないようですね。
またも2007のバグですか!? もう、うんざりですね〜

こちらが提示した Class2 は上記どのバージョンでも動きます。
      Class2
XL2002   ○
XL2003   ○
XL2007   ○
XL2010   ○

ただ、Selectイベントを使ってるので、
系列全体を選択後、目的の要素をClickする2Action必要になります。

> もし1クリックで済ませたい場合は変わりに
> cht_MouseDownイベントを使うと良いかもしれません。

ということですね。

【68376】Re:指定位置のグラフ要素を取得するが20...
お礼  eyuka  - 11/2/28(月) 15:45 -

引用なし
パスワード
   ▼kanabun さま、nさま:

ありがとうございます!
お二人のおかげで、2007でもきちんと動くようになりました!
本当に助かりました。
一人で悩んでいたら、絶対に解決できませんでした。
とても感謝です。
ありがとうございました。

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