Option Explicit
 
Declare Function GetTickCount Lib "kernel32" () As Long
 
Dim intI As Integer
 
Dim lngI As Long
Dim lngRow As Long
Dim lngCol As Long
Dim lngSTime As Long
Dim lngETime As Long
Dim lngRowsC As Long
Dim lngColsC As Long
Dim lngIndex As Long
Dim lngSelCellsR As Long
Dim lngSelCellsC As Long
 
Dim strAddress As String
Dim strAddressSec As String
 
Dim varI As Variant
Dim varData() As Variant
 
Dim objRange As Range
 
Const conC As String = ","
Const conRow As String = ",R"
Const conCol As String = "C"

 
Sub Speed_Test()
 
    With Excel.Application
 
        If TypeName(.Selection) <> "Range" Then Exit Sub
 
        .ScreenUpdating = False
 
        With .Selection
 
            If .Cells.Count = 1 Then
 
                MsgBox "単一セルではなく、セル範囲を選択してください。"
 
                Exit Sub
 
            End If
 
            If 1 < .Areas.Count Then
 
                MsgBox "一つのセル範囲を選択してください。"
 
                Exit Sub
 
            End If
 
            For intI = 1 To 10 'テスト回数
 
                Call Test_1
                Call Test_2
                Call Test_3
                Call Test_4
                Call Test_5
                Call Test_6
 
            Next intI
 
        End With
 
        .ScreenUpdating = True
 
    End With
 
End Sub

 
Private Sub Test_1()
 
    lngSTime = GetTickCount
 
    For Each objRange In Selection
 
        If objRange.Value = 1 Then objRange.Interior.ColorIndex = 6
 
    Next objRange
 
    lngETime = GetTickCount
    ActiveSheet.Cells(1 + intI, 1).Value = lngETime - lngSTime
    Selection.Interior.ColorIndex = xlNone
 
End Sub

 
Private Sub Test_2()
 
    lngSTime = GetTickCount
    lngIndex = 0
 
    With Selection
 
        lngRowsC = .Rows.Count  '選択範囲の行数
        varData = .Value        '選択範囲の値をバリアント変数に代入
 
        For Each varI In varData
 
            lngIndex = lngIndex + 1
 
            If varI = 1 Then
 
                lngRow = ((lngIndex - 1) Mod lngRowsC) + 1
                lngCol = (lngIndex + lngRowsC - 1) \ lngRowsC
                .Cells(lngRow, lngCol).Interior.ColorIndex = 6
 
            End If
 
        Next varI
 
        lngETime = GetTickCount
 
    End With
 
    ActiveSheet.Cells(1 + intI, 2).Value = lngETime - lngSTime
    Selection.Interior.ColorIndex = xlNone
 
End Sub

 
Private Sub Test_3()
 
    lngSTime = GetTickCount
 
    With Selection
 
        lngRowsC = .Rows.Count
        lngColsC = .Columns.Count
        varData = .Value
 
        For lngRow = 1 To lngRowsC
 
            For lngCol = 1 To lngColsC
 
                If varData(lngRow, lngCol) = 1 Then .Cells(lngRow, lngCol).Interior.ColorIndex = 6
 
            Next lngCol
 
        Next lngRow
 
    End With
 
    lngETime = GetTickCount
    ActiveSheet.Cells(1 + intI, 3).Value = lngETime - lngSTime
    Selection.Interior.ColorIndex = xlNone
 
End Sub

 
Private Sub Test_4()
 
    lngSTime = GetTickCount
    lngIndex = 0
    strAddress = vbNullString
 
    With Selection
 
        lngRowsC = .Rows.Count
        varData = .Value
 
        For Each varI In varData
 
            lngIndex = lngIndex + 1
 
            If varI = 1 Then
 
                lngRow = ((lngIndex - 1) Mod lngRowsC) + 1
                lngCol = (lngIndex + lngRowsC - 1) \ lngRowsC
                strAddress = .Cells(lngRow, lngCol).Address(FalseFalse)
                ActiveSheet.Range(strAddress).Interior.ColorIndex = 6
 
            End If
 
        Next varI
 
    End With
 
    lngETime = GetTickCount
    ActiveSheet.Cells(1 + intI, 4).Value = lngETime - lngSTime
    Selection.Interior.ColorIndex = xlNone
 
End Sub

 
Private Sub Test_5()
 
    lngSTime = GetTickCount
    lngIndex = 0
    strAddress = vbNullString
    strAddressSec = vbNullString
 
    With Selection
 
        lngRowsC = .Rows.Count
        varData = .Value
 
        For Each varI In varData
 
            lngIndex = lngIndex + 1
 
            If varI = 1 Then
 
                lngRow = ((lngIndex - 1) Mod lngRowsC) + 1
                lngCol = (lngIndex + lngRowsC - 1) \ lngRowsC
                strAddressSec = conC & .Cells(lngRow, lngCol).Address(FalseFalse)
 
                If 255 < Len(strAddress) + Len(strAddressSec) Then
 
                    GoSub JoinString
 
                Else
 
                    strAddress = strAddress & strAddressSec
 
                End If
 
            End If
 
        Next varI
 
        If 0 < Len(strAddress) Then GoSub JoinString
 
    End With
 
 
    lngETime = GetTickCount
    ActiveSheet.Cells(1 + intI, 5).Value = lngETime - lngSTime
    Selection.Interior.ColorIndex = xlNone
 
Exit Sub
 
JoinString:
    strAddress = Mid$(strAddress, 2)
    ActiveSheet.Range(strAddress).Interior.ColorIndex = 6
    strAddress = vbNullString
 
    Return
 
End Sub

 
Private Sub Test_6()
 
    lngSTime = GetTickCount
    lngIndex = 0
    strAddress = vbNullString
 
    With Selection
 
        lngRowsC = .Rows.Count
        varData = .Value
        strAddress = .Cells(1, 1).Address(ReferenceStyle:=xlR1C1) '選択範囲の左上アドレスをR1C1で取得
        strAddress = Mid$(strAddress, 2)
        lngI = InStr(1, strAddress, conCol, vbTextCompare)
        lngSelCellsR = CLng(Left$(strAddress, lngI - 1)) - 1  '行を取り出し
        lngSelCellsC = CLng(Mid$(strAddress, lngI + 1)) - 1   '列を取り出し
        strAddress = vbNullString
        strAddressSec = vbNullString
 
        For Each varI In varData
 
            lngIndex = lngIndex + 1
 
            If varI = 1 Then
 
                'シート上での行番号
                lngRow = ((lngIndex - 1) Mod lngRowsC) + 1 + lngSelCellsR
                'シート上での列番号
                lngCol = (lngIndex + lngRowsC - 1) \ lngRowsC + lngSelCellsC
                'R1C1参照として書き出し
                strAddressSec = conRow & lngRow & conCol & lngCol
 
                If 255 < Len(strAddress) + Len(strAddressSec) Then
 
                    GoSub JoinAddress
 
                Else
 
                    strAddress = strAddress & strAddressSec
 
                End If
 
            End If
 
        Next varI
 
        If 0 < Len(strAddress) Then GoSub JoinAddress
 
    End With
 
    lngETime = GetTickCount
    ActiveSheet.Cells(1 + intI, 6).Value = lngETime - lngSTime
'    Selection.Interior.ColorIndex = xlNone
 
Exit Sub
 
JoinAddress:
 
    strAddress = Mid$(strAddress, 2)
    strAddress = Application.ConvertFormula(strAddress, xlR1C1, xlA1, xlRelative)
    ActiveSheet.Range(strAddress).Interior.ColorIndex = 6
    strAddress = strAddressSec
 
    Return
 
End Sub