LoginSignup
2
2

More than 3 years have passed since last update.

関数・プロシージャの利用を考える

Last updated at Posted at 2015-03-16

セル範囲から積み上げ棒グラフを作成し、追加のデータがあれば追加分グラフに適応するような場合を例に考えてみる。

ori.PNG

背景色のないセルが元のデータ
黄色の背景色があるところがもともとなかった追加されたデータ。

チャート作成。


Private Sub CreateChart()

  Dim origin As Range

  Range("a1").Activate
  Set origin = ActiveCell.CurrentRegion

  With Worksheets(1).ChartObjects.Add(400, 50, 300, 200)
    .Chart.ChartType = xlColumnStacked
    .Chart.SetSourceData origin
  End With

End Sub

元データ

cori.PNG

今回のRangeの取り方は追加データを見つければ同じプロシージャを呼ぶルーチンを書くだけ。

追加分

Capture.PNG

以前のチャートが・・・。

消す。


Private Sub CreateChart()

  Dim origin As Range

  Range("a1").Activate
  Set origin = ActiveCell.CurrentRegion

  With Worksheets(1).ChartObjects.Add(400, 50, 300, 200)
    .Chart.ChartType = xlColumnStacked
    .Chart.SetSourceData origin
  End With

End Sub

Private Sub DeleteChart()

  Worksheets(1).ChartObjects(1).Delete

End Sub

これだとチャートの無限増殖や存在しないチャートを消すかも。
呼び出しルーチンをつけ足す。


Private Sub Proc()

  Dim index as Long

  index = 1

  Call CreateChart(index)
  Call DeleteChart(index)
  index = index + 1

End Sub

Private Sub CreateChart(ByVal index as Long)

  If index > 1 Then
    Exit Sub
  End if

  Dim origin As Range

  Range("a1").Activate
  Set origin = ActiveCell.CurrentRegion

  With Worksheets(1).ChartObjects.Add(400, 50, 300, 200)
    .Chart.ChartType = xlColumnStacked
    .Chart.SetSourceData origin
  End With

End Sub

Private Sub DeleteChart(ByVal index as Long)

  Worksheets(1).ChartObjects(index).Delete

End Sub

CreateChart と DeleteChart に引数を付けたので Sub Proc() から呼び出すように制限できた。

もうちょっと気合入れて書いてみたけどこれたぶん、バグる・・。


Option Explicit

Private Type Rect

  dx As Long
  dy As Long
  width As Long
  height As Long

End Type

Private ChartCollection As New Collection
Private ChartName As String
Private ChartData As Range

Private Sub DeleteAllCharts()

  Dim w

  For Each w In Worksheets(1).ChartObjects
    w.Delete
  Next

End Sub

Private Sub Proc()

  Static count As Long

  If count = 0 Then
    Call CurrentTable
    Call CreateChart(ChartData)
  End If

  count = count + 1

  If Modified = True Then
    Call CurrentTable
    Call DeleteChart(ChartName)
    Call CreateChart(ChartData)
  End If

End Sub

Static Sub CurrentTable()

  Range("a1").Activate
  Set ChartData = ActiveCell.CurrentRegion

End Sub

Function Modified() As Boolean

  Range("a1").Activate

  If ActiveCell.CurrentRegion.address = ChartData.address Then

    Modified = False
    Exit Function

  End If

  Modified = True

End Function

Private Sub CreateChart(ByVal target As Range)

  Dim pos As Rect
  Dim chrt As ChartObject

  pos.dx = 400
  pos.dy = 50
  pos.height = 300
  pos.width = 200

  Set chrt = Worksheets("Sheet1").ChartObjects.Add(pos.dx, pos.dy, _
                                                   pos.height, pos.width)
  chrt.Chart.ChartType = xlColumnStacked
  chrt.Chart.SetSourceData target

  ChartCollection.Add Item:=chrt, Key:=chrt.name
  ChartName = chrt.name

  Debug.Print ChartName

End Sub

Private Sub DeleteChart(ByVal name As String)

  ChartCollection.Item(ChartName).Delete

End Sub

結論: On Error ステートメントは偉大だった。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2