goo blog サービス終了のお知らせ 

半角チルダ

ExcelVBA、その他。
覚え書きや、補足資料などのスクラップブック。
end-u(1037781)

■透明グラフをクリックして直下セル選択

2009-04-30 21:00:00 | 雑記
#もう1ヶ月ですか。早いですね...(月刊チルダ)と化してきた感が...XD

さて、しばらく前のシート上のグラフに関してのお題です。
『グラフを透過させ、プロットエリアx軸y軸の目盛線をセル枠線にピッタリと合わせたい。
 また、そのグラフをクリックして、下にあるセルを編集できるようにしたい。』
...というのがありました。

サンプルコード提示はしませんでしたが、アドバイスとして
A)シート上にBuildFreeformメソッドを使って線を描画しグラフもどきに見立てる。
B)グラフ上に幾つかの透明のシェイプを被せ、セルへのハイパーリンクを設定する。
C)グラフ上に[コントロールツールボックス]のラベルを被せてMouseUpイベントを利用する。
D)グラフにマクロを登録し、クリック時のマウス座標から選択セルを導く。
など幾つかの案を提案しました。

実用的かどうかはさておき、(C)のセンで試したコードのメモ的アップ。
シート上のMSForms.Labelの透明化はちょっとクセがありそう。
コードでLabel自体を追加するとどうもうまくいかず、手動で作成してあげないとダメなん?...

'標準Module
Option Explicit

Sub try()
  '事前にActiveSheetにMSForms.Labelを1コ作成しておく _
   必要があります。配置は適当でok
  Dim r1 As Range 'Chart範囲
  Dim r2 As Range 'SourceData範囲
  Dim L As Double
  Dim T As Double

  With ActiveSheet
    'Chart範囲の設定とダミーデータセット
    Set r1 = .Range("B2").Resize(20, 20)
    r1.RowHeight = 15
    r1.ColumnWidth = 3
    Set r2 = r1.Offset(20).Resize(1)
    r2.Formula = "=INT(RAND()*100)"

    'チャート作成しセル枠線に合わせ、透明化
    With .ChartObjects.Add(r1.Left - 10, _
                r1.Top - 10, _
                r1.Width + 20, _
                r1.Height + 20)
      .ShapeRange.ZOrder msoSendToBack
      With .Chart
        .ChartType = xlLine
        .HasLegend = False
        .SetSourceData r2
        With .Axes(xlValue)
          .MinimumScale = 0
          .MaximumScale = 100
          .Delete
        End With
        .Axes(xlCategory).Delete
        With .ChartArea
          .Border.LineStyle = 0
          .Interior.ColorIndex = xlNone
          L = .Left
          T = .Top
        End With
        With .PlotArea
          .Left = 10 - L
          .Top = 10 - T
          .Width = r1.Width
          .Height = r1.Height
          .Interior.ColorIndex = xlNone
        End With
      End With
    End With

    'Labelを透明化し、PlotAreaに被せる
    With .Label1
      .Left = r1.Left
      .Top = r1.Top
      .Width = r1.Width
      .Height = r1.Height
      .Caption = ""
      .BackStyle = 0 'fmBackStyleTransparent
    End With
  End With

  Set r1 = Nothing
  Set r2 = Nothing
End Sub

(実行後)


シートモジュールには以下のコードを。
'Sheet Module
Option Explicit

Private Sub Label1_MouseUp(ByVal Button As Integer, _
              ByVal Shift As Integer, _
              ByVal X As Single, _
              ByVal Y As Single)
  Dim ix As Long
  Dim iy As Long

  With Me.Label1
    'fmButtonLeft
    If Button = 1 Then
      'マウス座標を元に起点セルからのOffset位置を算出
      ix = Int(X * 20 / .Width)
      iy = Int(Y * 20 / .Height)
      Me.Range("B2").Offset(iy, ix).Select
    End If
    'Visible = False/TrueでLabelのTransparentを有効化
    .Visible = False
    .Visible = True
  End With
End Sub

Comment    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ■WorkSheet.Copy時のイベント | TOP | ■ChartObjects.ChartのTextBo... »
最新の画像もっと見る

Recent Entries | 雑記