VBA-36

(4).[Module1]の内容

実際のVBAの内容を次に説明します。VBAを枠で囲んだり調整をしていますが、[Module1]と同じ内容で約100行、説明は灰色の背景色の枠内に記述しています。

'Module1-1

Option Explicit

'変数の宣言を強制する

VBAで使う変数の宣言を強制する(省略させない)命令で、['](シングルクォーテーション)以降の文字列(変数の宣言・・・)は「コメント」になります。
[Option Explicit]・[コメント]については、次項(5)で説明します。

'Module1-2
'パブリック変数の宣言

Public pbKikanTop As Date
Public pbKikanEnd As Date
Public pbKaisya As String
Public pbSyuukeiTani As String
Public pbSheetName As String
Public pbChartName As String
Public pbError As Long

'表示期間の開始日
'表示期間の終了日
'表示する会社
'表示集計単位(日・週・月)
'株価データを集計するシート名
'株価チャートのシート名
'エラーの有無を判別 0:なし、1:あり

「株価チャートを表示する期間の開始日」、「終了日」、「会社」、「集計単位(日・週・月)」、「集計するシート名」、「株価チャートのシート名」、「エラーの有無を判別する項目」をパブリック変数として宣言します。

'Module1-3
Sub サンプル_ステップ1()

'変数の宣言

Dim wkYear As Long
Dim wkMonth As Long
Dim inGyou As Long
Dim outGyou As Long
Dim gyouSuu As Long

'年
'月
'入力シートの行
'出力シートの行
'行数

このプロシージャでは、「年」、「月」、「入力シートの行」、「出力シートの行」、「行数(データ件数)」を変数として宣言します。

'処理1:作成条件のチェック
'(1).処理開始のため、初期値[0](エラーなし)をセット
pbError = 0

処理開始時に、エラー判定項目に初期値[0](エラーなし)を格納します。

 

'(2).期間の開始年月のチェック
If Range("d6").Value = "" Then
 MsgBox "開始年月を指定してください"
 pbError = 1  'pbErrorに[1](エラーあり)をセット
 Exit Sub    'このプロシージャを抜ける(終了)
End If

[開始年月](セル[D6])に空白(値が入っていない)の場合はエラーとし、[pbError(エラー判定項目)]に[1](エラーあり)をセット後に、このプロシージャでの処理を[Exit Sub]で終了します。
[Exit Sub]は、それ以降のプロシージャ内の処理をしない場合に使います。

 

'(3).期間の終了年月のチェック
If Range("f6").Value = "" Then
 MsgBox "終了年月を指定してください"
 pbError = 1
 Exit Sub
End If

[開始年月]のチェックと同様に、[終了年月](セル[F6])が空白(値が入っていない)の場合はエラーとし処理を終了します。

 

'(4).期間のチェック
' 開始日のシリアル値算出
wkYear = Year(Range("d6").Value)
wkMonth = Month(Range("d6").Value)
pbKikanTop = DateSerial(wkYear, wkMonth, 1)

[開始年月](セル[D6])について、「年」を変数[wkYear]に格納、「月」を変数[wkMonth]に格納し、開始日(開始年月の1日)のシリアル値をパブリック変数[pbKikanTop]に格納します。

 

' 終了日のシリアル値算出
wkYear = Year(Range("f6").Value)
wkMonth = Month(Range("f6").Value)
pbKikanEnd = DateSerial(wkYear, wkMonth + 1, 1) - 1

[終了年月](セル[F6])について、「年」を変数[wkYear]に格納、「月」を変数[wkMonth]に格納し、終了日(終了年月の末日)のシリアル値をパブリック変数[pbKikanEnd]に格納します。

 

' 開始日と終了日の比較
If pbKikanTop > pbKikanEnd Then
 MsgBox "指定した期間のエラーですので、確認してください"
 pbError = 1
 Exit Sub
End If

[開始日]が[終了日]より大きい場合はエラーとし処理を終了します。

 

'(5).会社のチェック
If Range("d8").Value = "" Then
 MsgBox "会社を指定してください"
 pbError = 1
 Exit Sub
Else
 pbKaisya = Range("d8").Value
End If

[会社](セル[D8])が空白の場合はエラーとし処理を終了し、入力がある場合はセル[D8]の値をパブリック変数[pbKaisya]に格納します。

 

'(6).集計単位のチェック
If Range("d10").Value = "" Then
 MsgBox "集計単位を指定してください"
 pbError = 1
 Exit Sub
Else
 pbSyuukeiTani = Range("d10").Value
End If

[集計単位](セル[D10])が空白の場合はエラーとし処理を終了し、入力がある場合はセル[D10]の値をパブリック変数[pbSyuukeiTani]に格納します。

 

'(7).株価データを集計するシート名、株価チャートのシート名をセット
pbSheetName = "グラフデータ(" & pbKaisya & ")"
pbChartName = "グラフ(" & pbKaisya & ")"

株価チャート用集計データを格納するシート名[グラフデータ(x会社)]をパブリック変数[pbSheetName]に、株価チャートを表示(描画)するシート名[グラフ(x会社)]をパブリック変数pbChartNam]に格納します。

'処理2:シート[検索結果]への出力
'(1).シート[検索結果]の内容をクリアし、1行目に項目名をセット
Sheets("検索結果").Select
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 = "終値"

株価チャート作成条件で株価データを検索・出力するため、出力用シート[検索結果]全体(数式・文字・書式等)をクリア、1行目に項目名を格納します。

 

'(2).指定された会社・期間に該当する株価データをシート[検索結果]に出力
' 指定された会社のシートを選択、A列(日付)の書式を念のため再設定
Sheets(pbKaisya).Select
Columns("A").NumberFormatLocal = "yyyy/m/d"

期間で検索するため、期間(開始日・終了日)と株価データの書式を合わせます。

 

' データ件数をカウント
gyouSuu = Range("a1").CurrentRegion.Rows.Count

指定された会社の株価データ件数をカウントし、変数[gyouSuu]に格納します。

 

' 該当する株価データをシート[検索結果]に出力
outGyou = 2
For inGyou = 2 To gyouSuu
 If Cells(inGyou, 1) > = pbKikanTop And Cells(inGyou, 1) < = pbKikanEnd Then
  Sheets("検索結果").Cells(outGyou, 1).Value = Cells(inGyou, 1).Value
  Sheets("検索結果").Cells(outGyou, 2).Value = Cells(inGyou, 2).Value
  Sheets("検索結果").Cells(outGyou, 3).Value = Cells(inGyou, 3).Value
  Sheets("検索結果").Cells(outGyou, 4).Value = Cells(inGyou, 4).Value
  Sheets("検索結果").Cells(outGyou, 5).Value = Cells(inGyou, 5).Value
  Sheets("検索結果").Cells(outGyou, 6).Value = Cells(inGyou, 6).Value
' 出力行(outGyou)は出力した時のみ、次の出力行を算出する
  outGyou = outGyou + 1
End If
Next inGyou

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

End Sub

 

上記処理フロー図を基にVBAを記述しましたが、いかがでしたか?
理解が不十分でも構いませんので、[標準モジュール]・[実習用_ステップ1]を使い実習を行いましょう。

[実習用_ステップ1]の実習方法

実習方法は次の通りで、ステップ2・3・株価チャート作成でも共通です。

1).[標準モジュール]・[実習用_ステップ1]のプロシージャを表示する。(参照:7-(2).[標準モジュール]・[Module1]の表示)

  1. Sub ステップ1()
  2.  MsgBox "ステップ1の処理は設定されていません"
  3. End Sub

2).2行目から[Module1]の内容を記述後、[文法のチェック]を行う。(参照:6 .説明1-1 Range [文法のチェック])
3).シート[メニュー]上の[ステップ1]ボタンをクリックし、正常に動作したかを確認する。(実行時のエラー 参照:6 .説明1-1 Range [実行時のエラーへの対処])

 

次に「Module1-1」の[Option Explicit]・[コメント]について説明します。

 

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

 

スポンサーリンク