みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

エクセルVBAのMultipageの使い方について

MultipageにそれぞれImagecontrolを張り付けて
エクセルで自動作成したマーカー付折れ線グラフを
表示させるマクロを書いてみたんですが
2Pageまでは、上手く動作するんですが3page目をクリックしても
全く反応しません。何がおかしいのかどなたかお分かりの方
ご教授下さい。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Private Sub MultiPage1_Change()
Application.ScreenUpdating = False
Dim chartrange As Range
Me.MultiPage1.Value = 0
ActiveSheet.Range("a8").CurrentRegion.Select
Set chartrange = Selection
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=chartrange, PlotBy:=xlRows
ActiveChart.Location where:=xlLocationAsObject, Name:="記録"
Const graphimage2 As String = "C:\Users\user\Pictures\Graph.bmp"
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
ActiveSheet.ChartObjects(1).Chart.Export graphimage2
If Len(Dir(graphimage2)) > 0 Then
With Image1
.PictureSizeMode = fmPictureSizeModeStretch
.PictureAlignment = fmPictureAlignmentCenter
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture(graphimage2)
End With
Kill graphimage2
End If
ActiveSheet.ChartObjects.Delete
Me.MultiPage1.Value = 1
ActiveSheet.Range("a11").CurrentRegion.Select
Set chartrange = Selection
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=chartrange, PlotBy:=xlRows
ActiveChart.Location where:=xlLocationAsObject, Name:="記録"
Const graphimage3 As String = "C:\Users\user\Pictures\Graph.bmp"
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
ActiveSheet.ChartObjects(1).Chart.Export graphimage2
If Len(Dir(graphimage3)) > 0 Then
With Image2
.PictureSizeMode = fmPictureSizeModeStretch
.PictureAlignment = fmPictureAlignmentCenter
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture(graphimage3)
End With
Kill graphimage3
ActiveSheet.ChartObjects.Delete
End If
Me.MultiPage1.Value = 2
ActiveSheet.Range("a14").CurrentRegion.Select
Set chartrange = Selection
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=chartrange, PlotBy:=xlRows
ActiveChart.Location where:=xlLocationAsObject, Name:="記録"
Const graphimage4 As String = "C:\Users\user\Pictures\Graph.bmp"
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
ActiveSheet.ChartObjects(1).Chart.Export graphimage4
If Len(Dir(graphimage4)) > 0 Then
With Image3
.PictureSizeMode = fmPictureSizeModeStretch
.PictureAlignment = fmpictueralignmentcenter
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture(grphimage4)
End With
Kill graphimage4
End If
ActiveSheet.ChartObjects.Delete
Application.ScreenUpdating = True



End Sub

投稿日時 - 2014-03-09 06:34:15

QNo.8506000

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

こんにちは。

まず、
fmPictureAlignmentCenter  と書くべきところを  fmpictueralignmentcenter
graphimage4  と書くべきところを  grphimage4
2カ所、これはコンパイルエラーで弾かれますね。

ActiveSheet.ChartObjects(1).Chart.Export graphimage2
が2カ所にありますが、2つめは、
ActiveSheet.ChartObjects(1).Chart.Export graphimage3
という意図で書かれたものとお察しします。
もっとも、定数に設定する値が共通ならば、
3種類の定数を宣言する必要はなく、ひとつの定数にした方が解り易いと思います。
指定したファイルパスでエクスポートして、処理後に毎度Killステートメントで削除している訳ですから、
パスを共通のものにしておいて問題ないです。

///

コードを読めば、どんな動作をするかはだいたい理解できるものですが、
どんなことがやりたいのか、こちらに伝わってくるかどうかは、また別の問題です。

MultiPage1_Change イベントって、UserForm上で手動で【ページを切り替えた時】、
という意味ですから、
3ページめを表示中に、3ページめ(のタブ)を、クリックしたとしても。
MultiPage1_Change イベントは呼び出されません。

クリックした時、ということなら、
Private Sub MultiPage1_Click(ByVal Index As Long) イベント
もありますが、
これは、タブ以外の所(ページ下部)をクリックしても発生しますから、
処理内容から考えて、案外扱い難いものになるでしょう。

///

3ページ分のグラフイメージなら、一気に読込・表示してしまってもいいと思いますが、
如何でしょう。
例えば、Private Sub UserForm_Activate() や Private Sub UserForm_Initialize() イベントで一気に、とか、
専用のボタンを設けておいて、Private Sub CommandButton1_Click() イベントで一気に、とか、
そういう感じの例示をひとつ挙げておきます。※1

次に、
MultiPage1_Change イベントの意味を理解して貰った上で、
「現在表示されていないページを表示しようとするタイミングで」
都度都度、新たに表示しようとしているページの分だけ、読込・表示する例を挙げておきます。※2

ただ、ページを切り替える度に忙しくグラフを更新する必要がある、とは思えないので、
今想像できる範囲では、※2は、そちらのニーズに応えるものではないと考えてはいます。

※1と※2の共存は不要です。どちらかひとつを選んで使うことになります。

///

グラフ作成手順、書き換えています。
すべて、Sheets("記録")に対して処理します。
.Cells(5 + i * 3, "A") という記述で、A8,A11,A14を参照しています。
.ChartObjects.Count でグラフの有無を確認する意味が解らなかったので外しています。

///


' ' ※1 ///

Private Sub UserForm_Activate()  '  8506000
' ' Private Sub UserForm_Initialize()
' ' Private Sub CommandButton1_Click()

  Dim i As Long
  Const graphimage As String = "C:\Users\user\Pictures\Graph.bmp"

  Application.ScreenUpdating = False
  With Sheets("記録")
    .Select
    For i = 1 To 3
      .Shapes.AddChart(xlLineMarkers).Select
      On Error Resume Next
      ActiveChart.SetSourceData Source:=.Cells(5 + i * 3, "A").CurrentRegion, PlotBy:=xlRows
      On Error GoTo 0
      ActiveChart.Export graphimage
      If Dir(graphimage) <> "" Then
        With Controls("Image" & i)
          .PictureSizeMode = fmPictureSizeModeStretch
          .PictureAlignment = fmPictureAlignmentCenter
          .BorderStyle = fmBorderStyleNone
          .Picture = LoadPicture(graphimage)
        End With
        Kill graphimage
      End If
    Next i
    .ChartObjects.Delete
  End With
  MultiPage1.Value = 0
  Application.ScreenUpdating = True
End Sub

' ' ///


' ' ※2 ///
Private Sub MultiPage1_Change()  '  8506000

  Dim nIdx As Long
  Const graphimage As String = "C:\Users\user\Pictures\Graph.bmp"

  nIdx = MultiPage1.Value + 1
  Application.ScreenUpdating = False
  With Sheets("記録")
    .Select
    .Shapes.AddChart(xlLineMarkers).Select
    On Error Resume Next
    ActiveChart.SetSourceData Source:=.Cells(5 + nIdx * 3, "A").CurrentRegion, PlotBy:=xlRows
    On Error GoTo 0
    ActiveChart.Export graphimage
    If Dir(graphimage) <> "" Then
      With Controls("Image" & nIdx)
        .PictureSizeMode = fmPictureSizeModeStretch
        .PictureAlignment = fmPictureAlignmentCenter
        .BorderStyle = fmBorderStyleNone
        .Picture = LoadPicture(graphimage)
      End With
      Kill graphimage
    End If
    .ChartObjects.Delete
  End With
'  MultiPage1.Value = 0
  Application.ScreenUpdating = True
End Sub

' ' ///

投稿日時 - 2014-03-10 00:28:10

お礼

回答いただきましてありがとうございます。
Private Sub MultiPage1_Change()
Application.ScreenUpdating = False
Dim chartrange As Range
Select Case Me.MultiPage1.Value
Case Is = 0
ActiveSheet.Range("a8").CurrentRegion.Select
Set chartrange = Selection
Call makegraph(chartrange, Image1)
Case Is = 1
ActiveSheet.Range("a11").CurrentRegion.Select
Set chartrange = Selection
Call makegraph(chartrange, Image2)
Case Is = 2
ActiveSheet.Range("a14").CurrentRegion.Select
Set chartrange = Selection
Call makegraph(chartrange, Image3)
Case Is = 3
ActiveSheet.Range("a17").CurrentRegion.Select
Set chartrange = Selection
Call makegraph(chartrange, Image4)
End Select
Application.ScreenUpdating = True


End Sub
Private Sub makegraph(a As Range, b As Control)
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=a, PlotBy:=xlRows
ActiveChart.Location where:=xlLocationAsObject, Name:="記録"
Const graphimage2 As String = "C:\Users\user\Pictures\Graph.bmp"
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub
ActiveSheet.ChartObjects(1).Chart.Export graphimage2
If Len(Dir(graphimage2)) > 0 Then
With b
.PictureSizeMode = fmPictureSizeModeStretch
.PictureAlignment = fmPictureAlignmentCenter
.BorderStyle = fmBorderStyleNone
.Picture = LoadPicture(graphimage2)
End With
Kill graphimage2
End If
ActiveSheet.ChartObjects.Delete
ActiveSheet.Range("a1").Select

End Sub
これで何とかなりました。
全部のパーツ箱の消費量を一つのグラフで表示すると
単位が違い過ぎて、比較にならないので、此処のパーツ箱につき
其々グラフを作成してMultipageで表示しようとしたんです。
パーツ箱の1日当たりの消費量や実稼働日数の計算は
問題なくできたのですが、まぁ プレゼン?の一環として
グラフもつけたかったんです。お騒がせしました。

投稿日時 - 2014-03-11 21:38:37

あなたにオススメの質問