マクロはフリーズしていないので、完了までに十分な時間が与えられていないだけです。これは時間に関係します。 Excelには1,048,576行の行制限があり、各行のすべてのセルを他の行のすべての単一セルと比較しています。それは合計1,099,511,627,776のセル比較です。 1秒間に100,000回の比較を行うことができると仮定すると(でもの書式設定なし)、最終的にわずか127日間で完了します。
私はいくつかのことをお勧めします。だけでなく、使用されているもの - まず、あなたがこのような列の範囲を割り当てるときに...
Set rng1 = Worksheets("Main").Range("B:B")
...あなたはすべての可能セルを取得します。各列の最後の非空のセルを検索し、それに基づいて、あなたの範囲を設定します。
Dim LastRow As Long
Dim ColumnB As Range
With Worksheets("Main")
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
Set ColumnB = .Range("B1:B" + LastRow)
End With
あなたは巨大なデータセットを持っていない限り、これは分または秒の代わりの日のためにあなたの実行時間をいただく場合がございます。さらに、それらを改善するために、一度にワークシート1から個々の値を要求して停止し、アレイにそれらを引っ張る:
Dim BValues As Variant
BValues = ColumnB.Value
そして、単にループを介して、メモリ内の値を比較します。あなたのパフォーマンスは依然として低すぎる場合、私はまた、非常に少なくともScreenUpdatesをオフにしたい
Private Sub CommandButton4_Click()
Dim LastRow As Long, MainSheet As Worksheet, CsvSheet As Worksheet
Set MainSheet = Worksheets("Main")
Set CsvSheet = Worksheets("CSV Transfer")
Dim MainValues As Variant
With MainSheet
LastRow = .Cells(.Rows.Count, "B").End(xlUp).Row
MainValues = .Range("B1:B" & LastRow).Value
End With
Dim CsvValues As Variant
With CsvSheet
LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
CsvValues = .Range("D1:D" & LastRow).Value
End With
Dim MainRow As Long, CsvRow As Long
For MainRow = LBound(MainValues) To UBound(MainValues)
For CsvRow = LBound(CsvValues) To UBound(CsvValues)
If MainValues(MainRow) = CsvValues(CsvRow) Then
FormatCell MainSheet, MainRow, 2
FormatCell CsvValues, CsvRow, 4
End If
Next
Next
End Sub
Private Sub FormatCell(sheet As Worksheet, formatRow As Long, formatCol As Long)
With sheet.Cells(formatRow, formatCol)
With .Font
.Bold = True
.ColorIndex = 2
End With
With .Interior
.ColorIndex = 3
.Pattern = xlSolid
End With
End With
End Sub
:それはより多くのようになります(私はサブに出て書式設定引き込ま)。
あなた自身でこれを行うために努力する必要があります。私たちは一般的にコードを書くのではなく、実行中の特定の問題に対処するのに役立ちます。開始するには、[Range.Findメソッド](https://msdn.microsoft.com/en-us/library/office/ff839746.aspx)を参照してください。立ち往生した場合は、あなたが試したコードを含めるように質問を編集してください。 – tigeravatar