Sub Process6ASheet()
Dim ws5A As Worksheet
Dim ws6A As Worksheet
Dim wsInput As Worksheet
Dim writeRow As Integer
Dim currentRow As Integer
Dim baValue As String
Dim bfValue As String
Dim boValue As String
Dim idName As String
Dim av10Range As String
Dim av11Range As String
Dim av12Range As String
Dim copyRange As Range
Dim pasteRange As Range
Dim rangeAddress As String
Dim rangeParts As Variant
Dim col2 As Integer, col4 As Integer
Dim foundRow As Range
Dim lastRow As Long
' ワークシートを取得
On Error Resume Next
Set ws5A = ThisWorkbook.Worksheets("5A_フロー")
Set ws6A = ThisWorkbook.Worksheets("6A")
Set wsInput = ThisWorkbook.Worksheets("★入力★授受物情報")
On Error GoTo 0
' シートの存在確認
If ws5A Is Nothing Then
MsgBox "シート『5A_フロー』が見つかりません。", vbCritical
Exit Sub
End If
If ws6A Is Nothing Then
MsgBox "シート『6A』が見つかりません。", vbCritical
Exit Sub
End If
If wsInput Is Nothing Then
MsgBox "シート『★入力★授受物情報』が見つかりません。", vbCritical
Exit Sub
End If
' 6Aシートの参照範囲を取得
av10Range = ws6A.Range("AV10").Value
av11Range = ws6A.Range("AV11").Value
av12Range = ws6A.Range("AV12").Value
' 範囲が空の場合はエラー
If av10Range = "" Or av11Range = "" Or av12Range = "" Then
MsgBox "AV10、AV11、AV12のいずれかが空です。", vbCritical
Exit Sub
End If
' 初期書き込み行数を16にセット
writeRow = 16
' 5A_フローシートのBA列の最終行を取得
lastRow = ws5A.Cells(ws5A.Rows.Count, 53).End(xlUp).Row ' BA列 = 53列目
' BA列を順次処理(21行目から開始)
For currentRow = 21 To lastRow
baValue = ws5A.Cells(currentRow, 53).Value ' BA列
bfValue = ws5A.Cells(currentRow, 58).Value ' BF列
boValue = ws5A.Cells(currentRow, 67).Value ' BO列
' BA列が空でない場合のみ処理
If baValue <> "" Then
' AV10の範囲をコピーして書き込み行に貼り付け
On Error Resume Next
Set copyRange = ws6A.Range(av10Range)
On Error GoTo 0
If Not copyRange Is Nothing Then
Set pasteRange = ws6A.Range(copyRange.Address).Offset(writeRow - copyRange.Row, 0)
copyRange.Copy
pasteRange.PasteSpecial xlPasteValues
Application.CutCopyMode = False
' AV10範囲の2番目と4番目の列番号を取得
rangeAddress = copyRange.Address(False, False)
col2 = GetNthColumnFromRange(rangeAddress, 2)
col4 = GetNthColumnFromRange(rangeAddress, 4)
' BA列とBF列の値を該当列位置に値貼り付け
If col2 > 0 Then ws6A.Cells(writeRow, col2).Value = baValue
If col4 > 0 Then ws6A.Cells(writeRow, col4).Value = bfValue
' 書き込み行を2行加算
writeRow = writeRow + 2
End If
' BO列が空白でない場合の処理
If boValue <> "" Then
' BA列の値でID名を検索
idName = ""
Set foundRow = wsInput.Columns(9).Find(baValue, LookIn:=xlValues, LookAt:=xlWhole) ' I列 = 9列目
If Not foundRow Is Nothing Then
idName = foundRow.Value
End If
' AV11の範囲をコピーして書き込み行に貼り付け
On Error Resume Next
Set copyRange = ws6A.Range(av11Range)
On Error GoTo 0
If Not copyRange Is Nothing Then
Set pasteRange = ws6A.Range(copyRange.Address).Offset(writeRow - copyRange.Row, 0)
copyRange.Copy
pasteRange.PasteSpecial xlPasteValues
Application.CutCopyMode = False
' AV11範囲の2番目の列番号を取得
rangeAddress = copyRange.Address(False, False)
col2 = GetNthColumnFromRange(rangeAddress, 2)
' IDコード名を連結して元の列位置に貼り付け
If col2 > 0 Then
Dim currentValue As String
currentValue = ws6A.Cells(writeRow, col2).Value
If idName <> "" Then
ws6A.Cells(writeRow, col2).Value = currentValue & idName
Else
ws6A.Cells(writeRow, col2).Value = currentValue
End If
End If
' 書き込み行を2行加算
writeRow = writeRow + 2
End If
' AV12の範囲をコピーして書き込み行に貼り付け
On Error Resume Next
Set copyRange = ws6A.Range(av12Range)
On Error GoTo 0
If Not copyRange Is Nothing Then
Set pasteRange = ws6A.Range(copyRange.Address).Offset(writeRow - copyRange.Row, 0)
copyRange.Copy
pasteRange.PasteSpecial xlPasteValues
Application.CutCopyMode = False
' 書き込み行を2行加算
writeRow = writeRow + 2
End If
End If
End If
Next currentRow
MsgBox "処理が完了しました。", vbInformation
End Sub
' 範囲文字列からN番目の列番号を取得する関数
Private Function GetNthColumnFromRange(rangeAddr As String, n As Integer) As Integer
Dim rangeParts As Variant
Dim startCell As String
Dim endCell As String
Dim startCol As Integer
Dim endCol As Integer
Dim colCount As Integer
GetNthColumnFromRange = 0
' 範囲が ":" を含む場合(例:A1:D1)
If InStr(rangeAddr, ":") > 0 Then
rangeParts = Split(rangeAddr, ":")
startCell = rangeParts(0)
endCell = rangeParts(1)
' 開始列と終了列を取得
startCol = Range(startCell).Column
endCol = Range(endCell).Column
' 列数をカウント
colCount = endCol - startCol + 1
' N番目の列が存在する場合
If n <= colCount Then
GetNthColumnFromRange = startCol + n - 1
End If
Else
' 単一セルの場合
If n = 1 Then
GetNthColumnFromRange = Range(rangeAddr).Column
End If
End If
End Function