VBA Step2 2

(6).[Module2]の内容

実際のVBAの内容を説明しますが、「マクロの記録」を変更した部分は次の通り分けています。
 変更前:赤枠・黄色の背景
 変更後:オレンジ枠・背景色なし
VBAを枠で囲んだり調整をしていますが、[Module2]と同じ内容で約130行、説明は灰色の背景色の枠内に記述しています。

'Module2-1

Option Explicit

'変数の宣言を強制する

 

'Module2-2
Sub サンプル_ステップ2()

'変数の宣言

Dim inGyou As Long
Dim outGyou As Long
Dim gyouSuu As Long
Dim kikanKey As Variant
Dim kikanHiduke As Date
Dim kikanDekidaka As Long
Dim kikanHajimene As Long
Dim kikanTakane As Long
Dim kikanYasune As Long
Dim kikanOwarine As Long

'入力シートの行
'出力シートの行
'行数
'集計用キー
'同一期間最初の日
'同一期間内の出来高合計
'同一期間最初の日の始値
'同一期間内の高値
'同一期間内の安値
'同一期間最後の日の終値

このプロシージャで使う変数を宣言しています。

'処理1:シート[検索結果]の行数(データ数)をカウント
gyouSuu = Sheets("検索結果").Range("a1").CurrentRegion.Rows.Count
If gyouSuu = 1 Then
 MsgBox "株価データがありませんので、確認してください"
 pbError = 1
 Sheets("メニュー").Select
 Exit Sub
End If

シート[検索結果]の[gyouSuu](行数)をカウントし、データ数が[1](一行目の項目のタイトルのみ)の場合、ダイアログボックスに「株価データがありませんので、確認してください」と表示、[pbError(エラー判定項目)]に[1](エラーあり)をセット後に処理を終了します。

次の[処理2]は、「(4).処理2:[並び替え]の処理のマクロの記録」を流用しています。

'処理2:シート[検索結果]のデータを古い日付順に並び替え
'Module6のマクロの記録を流用し、データの範囲のみ変更
Sheets("検索結果").Select
Cells.Select
ActiveWorkbook.Worksheets("検索結果").Sort.SortFields.Clear

'ActiveWorkbook.Worksheets("検索結果").Sort.SortFields.Add Key:=Range("A2:A42"), _
'SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

ActiveWorkbook.Worksheets("検索結果").Sort.SortFields.Add Key:=Range(Cells(2, 1), Cells(gyouSuu, 1)), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

セル[A2]をCells(2, 1)、セル[A42]の[A]を[1]・[42]を変数[gyouSuu]に変更
※.二行目の「Key:=Range("A2:A42"), _」の[_](アンダースコア)は、一つのステートメントを複数の行に分ける場合に使用します。

With ActiveWorkbook.Worksheets("検索結果").Sort

' .SetRange Range("A1:H42")

 .SetRange Range(Cells(1, 1), Cells(gyouSuu, 8))

セル[A1]をCells(1, 1)、セル[H42]の[H]を[8]・[42]を変数[gyouSuu]に変更

 .Header = xlYes
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
End With

'処理3:前回作成したグラフ・グラフデータを削除
On Error Resume Next
Application.DisplayAlerts = False
Sheets(pbSheetName).Delete
Sheets(pbChartName).Delete
Application.DisplayAlerts = True

・On Error Resume Next:この命令は、発生したエラーを無視し処理を続行します。
削除に該当するシートがない状態で、そのシートを削除しようとするとエラーになりVBAが異常終了しますので、この異常終了の状態を避けるためにこの命令を入れています。

・DisplayAlerts:削除の確認メッセージの非表示/表示を行います。

・このプログラムでは、
1).株価チャート作成時は常に「グラフ」と「グラフの元のデータ」を新規に作成
2).三(A・B・C)社分の株価チャートは別々に表示可能
とするために、作成条件に該当する会社のシート[グラフ(x社)]とシート[グラフデータ(x社)]は、この処理3で前回分を削除し、今回分は次の処理4以降で新規作成します。

'処理4:集計結果(グラフデータ)用シートを新規に作成
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = pbSheetName
ActiveSheet.Cells.Clear
Columns("A").NumberFormatLocal = "yyyy/m/d"
Range("a1").Value = "日付"
Range("b1").Value = "出来高"
Range("c1").Value = "始値"
Range("d1").Value = "高値"
Range("e1").Value = "安値"
Range("f1").Value = "終値"

集計結果を出力するシート[グラフデータ(x社)]を準備します。
シートは左から右に1から始まる「インデックス番号」(カウント数)を持っていますので、Sheets.Count で末尾(右端)のシートのインデックス番号を取得し、 [After]で最後(末尾の右) にシートを追加します。(このVBAは、シートの追加処理をマクロで記録すれば確認できます。)
シート追加後に、シート名を[グラフデータ(X社)]に変更し、シート全体(数式・文字・書式等)をクリアし、1行目に項目名を格納します。

次の[処理5]は、「(5).処理5:集計処理のフローチャート」通りです。

'処理5:集計処理
'(1).シート[検索結果]のH列を[集計用キー]用の項目に設定
Sheets("検索結果").Select
Columns("H").NumberFormatLocal = "G/標準"
Range("h1").Value = "集計用キー"

集計処理に使用する[集計用キー]用の列として、H列の書式を標準、セル[H1]に項目名を格納します。

 

'(2).集計処理の準備
kikanKey = 0
kikanHiduke = 0
kikanDekidaka = 0
kikanHajimene = 0
kikanTakane = 0
kikanYasune = 0
kikanOwarine = 0
outGyou = 2

[集計用キー]、及び関連する変数をゼロクリア、集計結果を出力する[グラフデータ(X社)]の出力を開始する行を[2]にセットします。

 

'(3).シート[検索結果]の2行目から最終行までの繰り返し処理
For inGyou = 2 To gyouSuu

集計結果を出力するシート[グラフデータ(x社)]は1行目に項目名がセットされているため、2行目を最初のデータ出力行とし、入力用シート[検索結果]の2行目から最終行まで下記(4)・(5)の処理を繰り返します。

 

'(4). 指定された[集計単位]による[集計用キー]をH列に作成
 Select Case pbSyuukeiTani
  Case "日"
   Cells(inGyou, 8) = Cells(inGyou, 1).Value
  Case "週"
   Cells(inGyou, 8) = Year(Cells(inGyou, 1).Value) & _
    WorksheetFunction.WeekNum(Cells(inGyou, 1).Value)
  Case "月"
   Cells(inGyou, 8) = Year(Cells(inGyou, 1).Value) & _
    Month(Cells(inGyou, 1).Value)
 End Select

集計単位によって、次のように[集計用キー]を[H列]に作成します。
 日:[A列の日付]
 週:[A列の年]と[A列の週目]を結合
 月:[A列の年]と[A列の月]を結合

 

'(5). 「H列に作成した集計用キー」と変数[kikanKey]に格納した集計用キー」の比較による処理
'入力行の[集計用キー]と変数に格納した[集計用キー]が異なる場合
 If Cells(inGyou, 8) < > kikanKey Then
'入力行が2行目以外の時に、集計結果をシート[グラフデータ(x社)]に出力する
  If inGyou < > 2 Then
   Sheets(pbSheetName).Cells(outGyou, 1).Value = kikanHiduke
   Sheets(pbSheetName).Cells(outGyou, 2).Value = kikanDekidaka
   Sheets(pbSheetName).Cells(outGyou, 3).Value = kikanHajimene
   Sheets(pbSheetName).Cells(outGyou, 4).Value = kikanTakane
   Sheets(pbSheetName).Cells(outGyou, 5).Value = kikanYasune
   Sheets(pbSheetName).Cells(outGyou, 6).Value = kikanOwarine
   outGyou = outGyou + 1
  End If
'入力行の各値を変数の各値(kikan・・・)に格納する
  kikanKey = Cells(inGyou, 8).Value
  kikanHiduke = Cells(inGyou, 1).Value
  kikanDekidaka = Cells(inGyou, 2).Value
  kikanHajimene = Cells(inGyou, 3).Value
  kikanTakane = Cells(inGyou, 4).Value
  kikanYasune = Cells(inGyou, 5).Value
  kikanOwarine = Cells(inGyou, 6).Value
'入力行の[集計用キー]と変数に格納した[集計用キー]が同じ場合
 Else
'変数の出来高に、入力行の出来高を加算する
  kikanDekidaka = kikanDekidaka + Cells(inGyou, 2).Value
'入力行の高値より変数の高値が高い場合、入力行の高値を変数の高値にセットする
  If Cells(inGyou, 4).Value > kikanTakane Then
   kikanTakane = Cells(inGyou, 4).Value
  End If
'入力行の安値が変数の安値より安い場合、入力行の安値を変数の安値にセットする
  If Cells(inGyou, 5).Value < kikanYasune Then
   kikanYasune = Cells(inGyou, 5).Value
  End If
' 入力行の終値を変数の終値にセットする
  kikanOwarine = Cells(inGyou, 6).Value
 End If
Next inGyou
'最後に変数に残っている集計結果をシート[グラフデータ(x社)]に出力する
Sheets(pbSheetName).Cells(outGyou, 1).Value = kikanHiduke
Sheets(pbSheetName).Cells(outGyou, 2).Value = kikanDekidaka
Sheets(pbSheetName).Cells(outGyou, 3).Value = kikanHajimene
Sheets(pbSheetName).Cells(outGyou, 4).Value = kikanTakane
Sheets(pbSheetName).Cells(outGyou, 5).Value = kikanYasune
Sheets(pbSheetName).Cells(outGyou, 6).Value = kikanOwarine

入力用シート[検索結果]・出力用シート[グラフデータ(x社)]とも1行目は項目名のため、2行目から最終行(=行数[gyouSuu])まで、集計処理を繰り返します。
入力行[inGyou]は「For ~ Next」のカウンタ変数のため自動で増分されますが、出力行[inGyou]は出力した時のみ、[1]を加算し次の出力行を算出しておきます。

End Sub

 

それでは、[標準モジュール]・[実習用_ステップ2]を使い実習を行いましょう。
以上で、ステップ2に関する説明を終り、次章からステップ3の説明をします。

 

 

 
  このエントリーをはてなブックマークに追加

 

スポンサーリンク