VBAで選択した可視セルのみに連番を振る方法

可視セルのみに連番を振る方法を紹介した動画を視聴した記事を書きました。

 

hfactory.hatenablog.com

最新のエクセルであれば動画で紹介されている方法が使えますが、2010年のエクセルでは使用できなかったので、VBAでコードを組んでみました。

使用方法:

1.まず任意の値でテーブルにフィルターをかけます。

2.連番を振りたい列のセルを選択します。(可視セルのみ選択ではなく普通の範囲選択で選択してください)

3.選択した状態のままスクリプトを実行すると連番を振ることができます。

Option Explicit

Sub NumberVisibleCells()
    
    '可視セルの行番号を格納する配列を作成
    Dim visibleCellsCount As Long
    visibleCellsCount = Selection.SpecialCells(xlCellTypeVisible).count
    ReDim visibleCellsRowNumbers(1 To visibleCellsCount) As Variant
    '選択範囲の可視セルの行番号を配列に格納
    Dim i As Long
    i = 1
    Dim cell As Range
    For Each cell In Selection.SpecialCells(xlCellTypeVisible)
       '可視セルの行番号を配列に格納
       visibleCellsRowNumbers(i) = cell.Row
        i = i + 1
    Next cell
    
    
    '選択したセルの値を取得
    Dim outputValues() As Variant
    outputValues = Selection.Value
    
    Dim count As Long
    count = 1  ' 連番の開始番号
    '配列をループして可視セルの行とマッチしたら連番を代入する
    Dim isVisibleCell As Boolean '現在の行が可視セルか判定結果を入れる
    isVisibleCell = False
    Dim visibleCellsRowNumber As Variant
    For i = 1 To Selection.count
       '現在のインデックスが可視セルのインデックスかどうかを判定する
       For Each visibleCellsRowNumber In visibleCellsRowNumbers
            If visibleCellsRowNumber = Selection.Row + i - 1 Then
                isVisibleCell = True
            End If
       Next visibleCellsRowNumber
       '現在の行が可視セルだった場合はカウンタの数字を代入してインクリメントする
       If isVisibleCell Then
            outputValues(i, 1) = count
            count = count + 1
            isVisibleCell = False
       End If
       
    Next i
    
    'アクティブシートのフィルターを解除してすべての値を表示させる
    ActiveSheet.ShowAllData
    ' 結果をセルに反映させる
    Selection.Value = outputValues
End Sub