'--------------------------------------------------
'プロシージャの概要:
'処理名:prc参照式自動入力
'概要:Sheet1のI列データ行をループし参照数式を配列に格納後、
' Sheet2のA列へSTEP間隔で数式を入力する
' 途中に空白セルが存在する場合はメッセージを表示して処理終了
'--------------------------------------------------
Sub prc参照式自動入力()
' 定数定義(参照元)
Const C_SRC_SHEET As String = "Sheet1" ' 参照元シート名
Const C_SRC_COL As Long = 9 ' 参照元列番号(I列=9)
Const C_SRC_START As Long = 3 ' 参照元データ開始行
' 定数定義(書き込み先)
Const C_DST_SHEET As String = "Sheet2" ' 書き込み先シート名
Const C_DST_COL As Long = 1 ' 書き込み先列番号(A列=1)
Const C_DST_START As Long = 2 ' 書き込み先開始行
Const C_DST_STEP As Long = 3 ' 書き込み先の行間隔
' 変数定義
Dim wsSrc As Worksheet ' 参照元シート(Sheet1)
Dim wsDst As Worksheet ' 書き込み先シート(Sheet2)
Dim lngLastRow As Long ' 参照元I列の終端行番号
Dim lngSrcRow As Long ' 参照元ループカウンタ
Dim lngDstRow As Long ' 書き込み先の現在行番号
Dim lngIdx As Long ' 配列インデックス
Dim strCellAddr As String ' 空白検出時のセル番地
Dim arrStrFormula() As String ' 参照数式文字列の格納配列
' シートオブジェクト取得
Set wsSrc = ThisWorkbook.Worksheets(C_SRC_SHEET)
Set wsDst = ThisWorkbook.Worksheets(C_DST_SHEET)
' I列の終端行取得(最終行から上方向に検索)
lngLastRow = wsSrc.Cells(wsSrc.Rows.Count, C_SRC_COL).End(xlUp).Row
' データ存在チェック
If lngLastRow < C_SRC_START Then
MsgBox "参照元データが存在しない。", vbExclamation
Exit Sub
End If
' データ件数分の配列を確保(0始まり)
ReDim arrStrFormula(0 To lngLastRow - C_SRC_START)
' I列をループして参照数式文字列を配列に格納
' 空白セルが存在する場合はセル番地を表示して処理終了
lngIdx = 0
For lngSrcRow = C_SRC_START To lngLastRow
' 空白セルチェック
If wsSrc.Cells(lngSrcRow, C_SRC_COL).Value = "" Then
strCellAddr = wsSrc.Cells(lngSrcRow, C_SRC_COL).Address(False, False)
MsgBox "セル" & strCellAddr & "が空白です。", vbExclamation
Exit Sub
End If
' 参照数式文字列を生成して配列に格納(例:"=Sheet1!I3")
arrStrFormula(lngIdx) = "=" & C_SRC_SHEET & "!" & _
wsSrc.Cells(lngSrcRow, C_SRC_COL).Address(False, False)
lngIdx = lngIdx + 1
Next lngSrcRow
' 配列の数式をSheet2のA列へSTEP間隔で入力(A2→A5→A8...)
lngIdx = 0
lngDstRow = C_DST_START
Do While lngIdx <= UBound(arrStrFormula)
wsDst.Cells(lngDstRow, C_DST_COL).Formula = arrStrFormula(lngIdx)
lngIdx = lngIdx + 1
lngDstRow = lngDstRow + C_DST_STEP
Loop
MsgBox "数式の入力が完了した。", vbInformation
End Sub