Excel VBA質問箱 IV

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

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


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

【46769】インプットボックス 210 07/2/14(水) 18:59 質問[未読]
【46770】Re:インプットボックス とおりすがり 07/2/14(水) 19:03 発言[未読]
【46790】Re:インプットボックス 210 07/2/15(木) 13:56 質問[未読]
【46795】Re:インプットボックス りん 07/2/15(木) 15:27 回答[未読]
【46798】Re:インプットボックス 210 07/2/15(木) 16:09 お礼[未読]
【46800】Re:インプットボックス りん 07/2/15(木) 16:18 発言[未読]
【46805】Re:インプットボックス 210 07/2/15(木) 18:07 質問[未読]
【46806】Re:インプットボックス りん 07/2/15(木) 18:52 発言[未読]
【46820】Re:インプットボックス りん 07/2/16(金) 11:45 回答[未読]
【46854】Re:インプットボックス 210 07/2/19(月) 8:46 お礼[未読]
【46856】Re:インプットボックス りん 07/2/19(月) 9:32 発言[未読]
【46862】Re:インプットボックス 210 07/2/19(月) 11:02 お礼[未読]
【46796】Re:インプットボックス Kein 07/2/15(木) 15:27 発言[未読]
【46799】Re:インプットボックス 210 07/2/15(木) 16:11 お礼[未読]

【46769】インプットボックス
質問  210  - 07/2/14(水) 18:59 -

引用なし
パスワード
   複数のシート上にある表のグラフ要素を、インプットBOXを使って選択し、
グラフを作成するプログラムを作成しているのですが、インプットBOXで
インプットBOXを選択する前にアクティブになっているシート以外を選択
するとエラーになります。インプットボックスの使い方が悪いのか、
複数のシートに対応する命令が足らないのか・・・困っております。。

【46770】Re:インプットボックス
発言  とおりすがり  - 07/2/14(水) 19:03 -

引用なし
パスワード
   現在どんなコードを書いているのか、どこでなんちゅーエラーがでているのか
分からなくて困っております。

【46790】Re:インプットボックス
質問  210  - 07/2/15(木) 13:56 -

引用なし
パスワード
   すいません。。。コードは以下の通りです

Sub Program1()

Dim ThisSheet_Name As String
Dim a As Long
 ThisSheet_Name = ActiveSheet.Name 'アクティブシート名を取得
  With Charts.Add '空のグラフをに作成する
   .Location Where:=xlLocationAsObject, Name:=ThisSheet_Name
  End With
For a = 1 To 10
  ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Activate '常に最新のグラフを選択する
  ActiveChart.ChartType = xlLine
  ActiveChart.SeriesCollection.NewSeries
With ActiveChart.SeriesCollection(a)
 'X軸を選択
 Dim xCell As Range
 Set xCell = Application.InputBox(Prompt:="X軸DATAの先頭を選択してください。", Default:="A1", Type:=8)
 xCell.Select
 b = xCell.Address
 c = Range(b).End(xlDown).Address(False, False)
'Y軸を選択
 Dim yCell As Range
 Set yCell = Application.InputBox(Prompt:="y軸DATAの先頭を選択してください。", Default:="A1", Type:=8)
 yCell.Select
 d = yCell.Address
 e = Range(d).End(xlDown).Address(False, False)
'要素名を選択
 Dim nameCell As Range
 Set nameCell = Application.InputBox(Prompt:="y軸項目名を選択してください。", Default:="A1", Type:=8)
 nameCell.Select
 f = nameCell.Address
'グラフを書く
  .ChartType = xlLine
  .XValues = Range(b, c)
  .Values = Range(d, e)
  .Name = Range(f)
 End With
'追加
 n% = MsgBox("波形を追加しますか?", vbYesNo + vbQuestion, "")
 If n% = vbNo Then End
Next a

End Sub

これのData選択時、シートをまたがって選択できるようにしたいと思っております。
宜しくお願いします。

【46795】Re:インプットボックス
回答  りん E-MAIL  - 07/2/15(木) 15:27 -

引用なし
パスワード
   整理したらこんな感じです。

Sub Program1()
  Dim a As Long
  '
  Dim co As ChartObject, ns As Series
  Dim cc(1 To 3) As Range, II As Integer, tf As Boolean, ss(1 To 3) As String
  'プロンプト内容
  ss(1) = "X軸DATAの先頭を選択してください。"
  ss(2) = "y軸DATAの先頭を選択してください。"
  ss(3) = "y軸項目名を選択してください。"
  '埋め込みグラフ追加
  With Application.ActiveSheet.Range("A1:E10") 'A1:E10の範囲に作る場合
   Set co = Application.ActiveSheet.ChartObjects.Add(.Left, .Top, .Width, .Height)
  End With
  'グラフタイプ
  co.Chart.ChartType = xlLine
  For a = 1 To 10
   '各種セルを選択
   tf = True
   For II = 1 To 3
     Set cc(II) = Nothing '念のため初期化
     'InputBoxでセット(キャンセルするとエラーになるのでエラースキップ)
     On Error Resume Next
      Set cc(II) = Application.InputBox(Prompt:=ss(II), Default:="A1", Type:=8)
     On Error GoTo 0
     If cc(II) Is Nothing Then
      MsgBox "キャンセルを押しました", vbExclamation
      tf = False: Exit For
     End If
   Next
   '無事に3つともセットしていたら、
   If tf = True Then
     'X,Y系列データは範囲を拡張
     For II = 1 To 2
      With cc(II).Parent
        Set cc(II) = .Range(cc(II), cc(II).End(xlDown)) '拡張
      End With
     Next
     Set ns = co.Chart.SeriesCollection.NewSeries
     'グラフを書く
     With ns
      .XValues = cc(1)
      .Values = cc(2)
      .Name = "=" & cc(3).Address(ReferenceStyle:=xlR1C1, External:=True)
     End With
   End If
   'グラフ描画
   DoEvents
   '系列を追加
   If MsgBox("波形を追加しますか?", vbYesNo + vbQuestion, "") = vbNo Then Exit For
  Next a
  '終了
  Set ns = Nothing: Set co = Nothing
  Erase cc, ss
End Sub

【46796】Re:インプットボックス
発言  Kein  - 07/2/15(木) 15:27 -

引用なし
パスワード
   複数の系列をプロットするグラフを作るとき、原則としてX項目軸は一つに
しないといけません。Excel2002以降では、項目軸も第二軸まで作れる
ようですが、それはあくまで特例でしょう。
で「ブック内のどのシートのデータでも、A列を項目軸とし他の任意の列を
複数選択してグラフを作る」ということがしたければ、全く違うアプローチ
を考えます。即ち ThisWorkbookモジュールに入れるブックレベルの
右クリックイベントを使うのです。グラフはその都度、独立したグラフシート
を挿入して作るようにします。その方が処理しやすいからです。
いずれにせよ、やりたいことの説明をもっと詳しく具体的に、言葉で説明
してもらわないとサンプルは提示できませんが。

【46798】Re:インプットボックス
お礼  210  - 07/2/15(木) 16:09 -

引用なし
パスワード
   ▼りん さん:
ありがとうございます。記載していただいたソースでの動作をやりたかったのです。

ソースをぱっと見ても、ちょっと私のような初心者には理解できないのですが、
それだけ難しい・・という事でしょうか。

【46799】Re:インプットボックス
お礼  210  - 07/2/15(木) 16:11 -

引用なし
パスワード
   ▼Kein さん:
説明不足ですいませんでした。
やりたい事は『りん』さんの御回答例のような事です。

【46800】Re:インプットボックス
発言  りん E-MAIL  - 07/2/15(木) 16:18 -

引用なし
パスワード
   210 さん、こんにちわ。
>ソースをぱっと見ても、ちょっと私のような初心者には理解できないのですが、
>それだけ難しい・・という事でしょうか。
基本的な動作内容は前のままです。わからないところは訊いてください。

動作としてはこんな感じ。
・Application.InputBoxで3つのセルを選択、ただし1度でもキャンセルを押したらそこで中断(元のコードだとキャンセルの時点でエラー中断)
・系列のデータはセルの範囲で、名前はアドレスで設定
設定したらまた最初に戻る(最大10回)

【46805】Re:インプットボックス
質問  210  - 07/2/15(木) 18:07 -

引用なし
パスワード
   ▼りん さん:
度々すいません
特に気になる点は、InputBoxを使い複数のシートをまたいで使う場合と、
自分の書いた『そうでない場合』の違いです。何が足りない又はダメで
複数のシートから情報を拾えなかったのかと・・

【46806】Re:インプットボックス
発言  りん E-MAIL  - 07/2/15(木) 18:52 -

引用なし
パスワード
   210 さん、こんばんわ。
>特に気になる点は、InputBoxを使い複数のシートをまたいで使う場合と、
>自分の書いた『そうでない場合』の違いです。何が足りない又はダメで
>複数のシートから情報を拾えなかったのかと・・
その時に出た、エラーメッセージの内容を書いてみてください。

【46820】Re:インプットボックス
回答  りん E-MAIL  - 07/2/16(金) 11:45 -

引用なし
パスワード
   210 さん、こんにちわ。

>特に気になる点は、InputBoxを使い複数のシートをまたいで使う場合と、
>自分の書いた『そうでない場合』の違いです。何が足りない又はダメで
>複数のシートから情報を拾えなかったのかと・・
この疑問について。
Sub test()
 Set r1 = Application.InputBox(Prompt:="違うシートのセルを選択してみてね", Default:="A1", Type:=8)
 MsgBox "Selectできるのは " & ActiveSheet.Name & "上のセル", _
     vbInformation, _
     "実際取得したのは" & r1.Parent.Name & "上のセル"
End Sub
↑で試してもらえばわかりますが、InputBoxでActiveSheet以外のシート上のセルを選択した場合でも、ActiveSheetがその取得セルのあるシートに切り替わらないため、Activeでないシート上のセルをSelectしようとしているのでエラーになります。

【46854】Re:インプットボックス
お礼  210  - 07/2/19(月) 8:46 -

引用なし
パスワード
   ▼りん さん:
ありがとうございます(風邪を引いて連休にしてしまいました・・)

正にそうなんです。インプットBOXで選択したシートになれば良いのですが、
プログラム前にアクティブだったシートから、『インプットBOXの選択が変えられない』という所が、ハマッテしまってどうにもならない所だったんです・・・未だに。。

【46856】Re:インプットボックス
発言  りん E-MAIL  - 07/2/19(月) 9:32 -

引用なし
パスワード
   210 さん、おはようございます。

>ありがとうございます(風邪を引いて連休にしてしまいました・・)
大変ですね。大丈夫でしたか?

>正にそうなんです。インプットBOXで選択したシートになれば良いのですが、
>プログラム前にアクティブだったシートから、『インプットBOXの選択が変えられない』という所が、ハマッテしまってどうにもならない所だったんです・・・未だに。。
私のコードをみていただけばわかりますが、ほとんどSelectはしていません。
大体の事はSelect→Selectionではなく直接の指定で出来るので、不要なSelect(Activate)をはずしていく事がポイントだと私は思っています。
なので、
Set xCell = Application.InputBox(Prompt:="X軸DATAの先頭を選択してください。", Default:="A1", Type:=8)
 xCell.Select
 b = xCell.Address
 c = Range(b).End(xlDown).Address(False, False)
 ↓
Set xCell = Application.InputBox(Prompt:="X軸DATAの先頭を選択してください。", Default:="A1", Type:=8)
 c = xCell.End(xlDown).Address(False, False)

アドレスを取得する部分は、これでエラーになりません(キャンセルの場合は必ずエラー)

ただし、
'グラフを書く
  .ChartType = xlLine
  .XValues = Range(b, c)←×
  .Values = Range(d, e)←×
  .Name = Range(f)←×
 End With

×の部分は、シートを指定していないので、InputBoxで違うシートを指定したとしても、設定される範囲はアクティブシート上の範囲になります。

【46862】Re:インプットボックス
お礼  210  - 07/2/19(月) 11:02 -

引用なし
パスワード
   ▼りん さん:
分かりやすく解説して頂き感謝しています。今回は大変勉強になりました。

*マニュアル等を見ても、親切な解説が中々無く苦戦の連続ですし、
他の人のソースを見てもまだまだ分からない事だらけでして・・・。

ありがとうございました。

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