Excel VBA質問箱 IV

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

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


5758 / 13645 ツリー ←次へ | 前へ→

【49001】可変範囲のグラフ作成 tara 07/5/20(日) 16:07 質問[未読]
【49002】Re:可変範囲のグラフ作成 ponpon 07/5/20(日) 19:25 発言[未読]
【49007】Re:可変範囲のグラフ作成 tara 07/5/20(日) 22:57 お礼[未読]
【49012】Re:可変範囲のグラフ作成 ponpon 07/5/21(月) 1:51 発言[未読]
【49009】Re:可変範囲のグラフ作成 Kein 07/5/21(月) 0:19 回答[未読]
【49054】Re:可変範囲のグラフ作成 tara 07/5/21(月) 23:09 お礼[未読]

【49001】可変範囲のグラフ作成
質問  tara  - 07/5/20(日) 16:07 -

引用なし
パスワード
   お世話になります。マクロ初級者で可変範囲の設定で行き詰りました。アドバイス願います。

下記ような田中さんに関する表をもとにグラフを作成します。
(1)
    国語    理科    算数
田中    1    3    4

Range("A1:D2").Select
  Charts.Add
  ActiveChart.ChartType = xlColumnClustered
  ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D2")
  ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"

(2)
(1)の表に、新しい行と列が挿入されますが、田中さんだけの教科と得点を自動的に検索して、グラフ(1同様の棒グラフ)を作成できますでしょうか?

    国語    理科    算数    社会
佐藤    2    5    6    3
田中    1    3    4    5

【49002】Re:可変範囲のグラフ作成
発言  ponpon  - 07/5/20(日) 19:25 -

引用なし
パスワード
   ▼tara さん:
>お世話になります。マクロ初級者で可変範囲の設定で行き詰りました。アドバイス願います。
>
>下記ような田中さんに関する表をもとにグラフを作成します。
>(1)
>    国語    理科    算数
>田中    1    3    4
>
>Range("A1:D2").Select
>  Charts.Add
>  ActiveChart.ChartType = xlColumnClustered
>  ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("A1:D2")
>  ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
>
>(2)
>(1)の表に、新しい行と列が挿入されますが、田中さんだけの教科と得点を自動的に検索して、グラフ(1同様の棒グラフ)を作成できますでしょうか?
>
>    国語    理科    算数    社会
>佐藤    2    5    6    3
>田中    1    3    4    5

作ってみました。
参考になれば・・・・

Sub Macro1()
  Dim res As Variant
  Dim 項目行 As Range
  Dim 抽出行 As Range
  Dim myRange As Range
  Dim FR As Variant
  
  Set 項目行 = Range("A1").Resize(, 5)
  
  res = Application.InputBox("誰のグラフですか", Type:=2)
  If VarType(res) = vbBoolean Then Exit Sub
  
  FR = Application.Match(res, Range("A:A"), 0)
  
  If Not IsError(FR) Then
    Set 抽出行 = Cells(FR, "A").Resize(, 5)
    Set myRange = Union(項目行, 抽出行)
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=myRange, _
      PlotBy:=xlRows
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
   Else
    MsgBox "そんなやつおらんやろ"
  
   End If
End Sub

【49007】Re:可変範囲のグラフ作成
お礼  tara  - 07/5/20(日) 22:57 -

引用なし
パスワード
   ponpon さん:ありがとうございます。参考にさせていただき、いろいろ試したのですが、また質問よろしいでしょうか。

>Set 項目行 = Range("A1").Resize(, 5)

ですと、田中さんの”社会”の項目までが固定で参照されてしまいます。
列数も可変する場合はどのように設定すればよろしいのでしょうか?

【49009】Re:可変範囲のグラフ作成
回答  Kein  - 07/5/21(月) 0:19 -

引用なし
パスワード
   ↓これを全て、表のあるシートのシートモジュールへ、先頭から入れて下さい。

Private MyLst As String
Private Sh As Worksheet

Private Sub Worksheet_Activate()
  Dim Cnt As Long
    
  With WorksheetFunction
   Cnt = .CountA(Range("A:A"))
   Select Case Cnt
     Case 0: MyLst = "": Exit Sub
     Case 1: MyLst = Range("A:A").SpecialCells(2).Address
     Case Else
      MyLst = Range("A2", Range("A65536").End(xlUp)).Address
    End Select
  End With
  If MyLst <> "" Then
   On Error Resume Next
   With Range("A1").Validation
     .Delete
     .Add xlValidateList, , xlBetween, "=" & MyLst
     .InCellDropdown = True
   End With
   On Error GoTo 0
  End If
  Set Sh = ActiveSheet
  Application.Goto Range("A1"), True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim GetN As String
  Dim Ck As Variant
  Dim MyR As Range
  Dim Wp As Single, Hp As Single
 
  With Target
   If .Count > 1 Then Exit Sub
   If .Address <> "$A$1" Then Exit Sub
   If IsEmpty(.Value) Then Exit Sub
   If MyLst = "" Then Exit Sub
   If IsNumeric(.Value) Then Exit Sub
   GetN = .Text
   Application.EnableEvents = False
   .Value = Empty
  End With
  Ck = Application.Match(GetN, Range("A:A"), 0)
  If IsError(Ck) Then
   MsgBox "その氏名は見つかりません", 48: Exit Sub
  End If
  With Range("A1", Range("IV1").End(xlToLeft))
   Set MyR = Union(.Cells, Cells(Ck, 1).Resize(, .Count))
  End With
  With ActiveWindow.VisibleRange
   With .Resize(.Rows.Count - 2, .Columns.Count - 2)
     Wp = .Width: Hp = .Height
   End With
  End With
  With ActiveSheet.ChartObjects
   If .Count > 0 Then .Delete
   With .Add(0.1, 0.1, Wp, Hp).Chart
     .SetSourceData MyR, xlRows
     .ChartType = xlColumnClustered
     .HasLegend = False
     .HasTitle = True
     .ChartTitle.Text = GetN
   End With
  End With
  Set MyR = Nothing: Application.EnableEvents = True
End Sub

Private Sub Worksheet_Deactivate()
  If Not Sh Is Nothing Then
   With Sh.ChartObjects
     If .Count > 0 Then .Delete
   End With
   Set Sh = Nothing
  End If
End Sub

いったん他のシートを開いてから当該シートに戻ると、A1セルに入力規則の
ドロップダウン矢印が出ます。リストから氏名を選択すると、ほぼ画面一杯に
グラフが挿入されます。別の人のグラフを見たいときは、また他のシートを
開いてから戻ればリセットされます。

【49012】Re:可変範囲のグラフ作成
発言  ponpon  - 07/5/21(月) 1:51 -

引用なし
パスワード
   ▼tara さん:
>>Set 項目行 = Range("A1").Resize(, 5)
>
>ですと、田中さんの”社会”の項目までが固定で参照されてしまいます。
>列数も可変する場合はどのように設定すればよろしいのでしょうか?

keinさんが応えてますが、一応作ってみたんで

Sub Macro1()
  Dim res As Variant
  Dim res2 As Variant
  Dim 項目行 As Range
  Dim 抽出行 As Range
  Dim myRange As Range
  Dim myVal As Variant
  Dim FR As Variant
  
  
  res = Application.InputBox("誰のグラフですか", Type:=2)
  If VarType(res) = vbBoolean Then Exit Sub
  FR = Application.Match(res, Range("A:A"), 0)
  If IsError(FR) Then
    MsgBox "そんなやつおらんやろ"
    Exit Sub
  End If

  res2 = Application.InputBox("どの教科までですか", Type:=2)
  If VarType(res2) = vbBoolean Then Exit Sub
  myVal = Application.Match(res2, Array("国語", "理科", "算数", "社会"), 0)
  If IsError(myVal) Then
    MsgBox "そんな教科はチッチキチー"
    Exit Sub
  End If
  
  Set 項目行 = Range("A1").Resize(, myVal + 1)
  Set 抽出行 = Cells(FR, "A").Resize(, myVal + 1)
    Set myRange = Union(項目行, 抽出行)
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=myRange, _
      PlotBy:=xlRows
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
  
End Sub

【49054】Re:可変範囲のグラフ作成
お礼  tara  - 07/5/21(月) 23:09 -

引用なし
パスワード
   ponpon さん、kein さん、どうもありがとうございます。知らないコードばかりなので、じっくり研究させていただきます。とても参考になりました。またよろしくお願いします。

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