こんにちは。
>コードを解読することもできないのですが
今度のものは、私でも、日にちが経てば、読めなくなる可能性が強いです。かなり入念に作りこみました。私は、グラフ作成のVBAは弱いので、下手くそなコードです。
「分析ツール」のアドインは、基本的には入れておいたほうがよいのですね。困ることが出てくるはずですから。その中の1つに、ヒストグラムはありますが、これに関しては、作った人は、QCのヒストグラムを一度も見ていないのかもしれないと思いました。
アドイン(分析ツール)のヒストグラムを真似、私のイメージで直したものを作ってみました。15年前ぐらいに、ヒストグラムを作った経験からすると、本格的なヒストグラムとは大幅に違いますが、一応使えるはずです。
私のほうでは、問題なく動きますが、もし不具合がありましたら、教えてください。
'標準モジュールに貼り付けてください。
'---------------------------------------
Sub FrequencyFunctionUsed()
'Frequency関数を使った方法
Dim InRng As Variant
Dim BinRng As Variant
Dim OutRng As Variant
'グラフが前もってあると誤動作が起こる。
On Error Resume Next
ActiveSheet.ChartObjects.Delete
On Error GoTo 0
On Error Resume Next
Set InRng = Application.InputBox("データの先頭にセルを置いてください。", "データ範囲", "$A$1", Type:=8)
On Error GoTo 0
If TypeName(InRng) = "Empty" Then Exit Sub
If TypeName(InRng) <> "Range" Then MsgBox "データはセルでなければなりません。", 16: Exit Sub
Set InRng = Range(InRng, InRng.End(xlDown))
On Error Resume Next
Set BinRng = Application.InputBox("区間の範囲を設定してください。", "区間範囲", Range("B1", Range("B1").End(xlDown)).Address, Type:=8)
On Error GoTo 0
If TypeName(BinRng) = "Empty" Then Exit Sub
If TypeName(BinRng) <> "Range" Then MsgBox "区間範囲はセルでなければなりません。", 16: Exit Sub
Set BinRng = BinRng.Columns(1)
If WorksheetFunction.CountBlank(BinRng) > 0 Then
Set BinRng = Range(BinRng.Cells(1, 1), BinRng.Cells(1, 1).End(xlDown))
End If
On Error Resume Next
Set OutRng = Application.InputBox("出力する場所の先頭にセルを置いてください。", "出力範囲", "$D$1", Type:=8)
On Error GoTo 0
If TypeName(OutRng) = "Empty" Then Exit Sub
If TypeName(OutRng) <> "Range" Then MsgBox "データはセルでなければなりません。", 16: Exit Sub
If WorksheetFunction.CountA(OutRng) > 0 Then
If MsgBox("元のデータは消去されます。", vbOKCancel) = vbCancel Then Exit Sub
End If
With OutRng
Range(.Cells(1, 1), .Cells(1, 2).End(xlDown)).ClearContents
.Cells(, 1).Value = "データ区間": OutRng.Cells(, 2).Value = "頻度"
.Resize(, 2).HorizontalAlignment = xlCenter
.Cells(2, 1).Resize(BinRng.Cells.Count).Value = BinRng.Value
.Cells(2, 2).Resize(BinRng.Cells.Count + 1).FormulaArray = "=FREQUENCY(" & InRng.Address & "," & BinRng.Resize(BinRng.Cells.Count + 1).Address & ")"
Range(.Cells(1, 1), Cells(1, 1).End(xlDown)).Resize(, 2).Value = Range(.Cells(1, 1), Cells(1, 1).End(xlDown)).Resize(, 2).Value
If MsgBox("グラフを作成しますか?", vbYesNo) = vbYes Then
Set OutRng = OutRng.Resize(BinRng.Cells.Count + 1, 2)
Call HistgramChartMaking(OutRng.Columns(2))
End If
End With
On Error Resume Next
Set InRng = Nothing: Set OutRng = Nothing: BinRng = Nothing
On Error GoTo 0
End Sub
Sub HistgramChartMaking(OutRng As Variant)
Dim myShName As String
Dim myRng As Variant
myShName = ActiveSheet.Name
Application.ScreenUpdating = False
If TypeName(OutRng) <> "Range" Then Exit Sub
On Error Resume Next
Set myRng = Application.InputBox("グラフの範囲を決めてください。", "グラフ範囲", "G1:L20", Type:=8)
If VarType(myRng) = vbEmpty Then Exit Sub
On Error Resume Next
If TypeName(myRng) <> "Range" Then Exit Sub
Set myRng = myRng.Resize(20, 6)
With Charts.Add
.ChartType = xlBarClustered
.SetSourceData Source:=OutRng, _
PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, _
Name:=myShName
End With
With ActiveChart
.ChartGroups(1).Overlap = 0
.ChartGroups(1).GapWidth = 0
.HasTitle = True
.Axes(xlCategory).ReversePlotOrder = True
.ChartTitle.Characters.Text = "ヒストグラム"
.Axes(xlCategory).ReversePlotOrder = True
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "データ区間"
.SeriesCollection(1).XValues = OutRng.Offset(1, -1)
End With
With ActiveSheet.Shapes(ActiveChart.Parent.Name)
.Left = myRng.Left
.Top = myRng.Top
.Width = myRng.Width
.Height = myRng.Height
End With
OutRng.Cells(1, 1).Select
Application.ScreenUpdating = True
Set myRng = Nothing
End Sub
お礼
ご回答ありがとうございます! とっても親身になっていただき、助かります!! コードはちょっとわからないですけど、結果は こーゆうのをイメージしてました♪ Frequency関数も組み込まれているようで、 ちょっとこれを見ながら改造してみます☆ いろいろほんとありがとうございます。 助かりました!