#もう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