カテゴリー
Microsoft

【Excel VBA】指定したブックのシートの列の値を 1 からの連番に置換した配列を生成するクラスコード

ポイント

  • 対象範囲セルが 1 セルのみの場合、Range.Value は配列にならない。よってこの場合だけ別に処理をする。

VBA コード

''' <summary>
''' 指定したブックのシートの列の値を 1 からの連番に置換した配列を生成するクラスです。
''' </summary>

Option Explicit

' 対象範囲 Range.Value の 2 次元配列
Private mvntValues As Variant
Private mlngRow As Long

''' <summary>
''' 初期化処理を実行します。
''' </summary>
''' <param name="strBook">対象ブック名</param>
''' <param name="strSheet">対象シート名</param>
''' <param name="strRange">対象範囲名</param>
''' <param name="lngRow">連番を開始する Range 内の行番号</param>
Public Sub Init( _
    ByVal strBook As String, _
    ByVal strSheet As String, _
    ByVal strRange As String, _
    ByVal lngRow As Long)

    ' 変数をセット
    mvntValues = Workbooks(strBook).Sheets(strSheet).range(strRange).Value
    mlngRow = lngRow
End Sub

''' <summary>
''' 対象列の要素を 1 からの連番に置換した 2 次元配列を返します。
''' </summary>
''' <returns>要素変換済みの 2 次元配列</returns>
Public Function SequencedValues() As Variant
    ' Range.Value 配列のコピーを用意し、元の配列はそのままの形で残す。
    Dim vntCopied As Variant: vntCopied = mvntValues
    ' 対象が 1 セルのみの場合
    If Not IsArray(mvntValues) Then
        SequencedValues = vntCopied
        If mlngRow <= 1 Then
            SequencedValues = 1
        End If
        Exit Function
    End If

    Dim count As Long: count = 1
    Dim i As Long
    Dim j As Long
    For i = LBound(mvntValues, 1) To UBound(mvntValues, 1)
        For j = LBound(mvntValues, 2) To UBound(mvntValues, 2)
            ' 連番を設定
            vntCopied(i, j) = count
        Next j
    Next i

    SequencedValues = vntCopied
End Function

確認用コード。A1:B4 までを対象とし、この範囲の 2 行目から (つまり 2 〜 4 行目) 連番をつけていきます。

Option Explicit
 
Public Sub Test()
    ' 対象定義
    Dim book As String: book = "Book.xlsm"
    Dim sheet As String: sheet = "Sheet1"
    Dim range As String: range = "A1:A" & Cells(Rows.count, 1).End(xlUp).row
 
    ' クラス生成
    Dim cs As CellSequencer: Set cs = New CellSequencer
    Call cs.Init(book, sheet, range, 2)
 
    ' 実行
     Workbooks(book).Sheets(sheet).range(range) = cs.SequencedValues
End Sub

確認用エクセル。

  • ブック名: Book1.xlsm
  • シート名: Sheet1
No カラム1
a1 b1
a2 b2
a3 b3

おわりに

No 列には本来数字が入ってほしいのに、全然異なった値が入っておりました><。

そのような列がいくつもありましたし、何度も入れ替える必要がございましたので、もういっそのこと VBA コードとして用意いたしました。

クラスにするか、モジュールにするか、実は少し迷いました。

結局クラスにしたのですけれども、クラスにすることで、ちょっと違う関数を作ってちょっと違う結果を得ることが簡単にできるようになるメリットがあると存じます。

最後に、参考ページです。ありがとう存じます!

以上です。

コメントを残す