◎これだけ便利であるにもかかわらず、使いこなしている人が少ないという
不思議なオブジェクトがコレクションです。
個人的にRangeオブジェクトを使用したExcel固有の書き方は好きではないので、
書き換えの必要のないものはCollectionを多用しています。
Variantとの相互変換による行列変換がキモです。
Option Explicit
Sub main()
'"test"シートにあるデータをコレクションに入れてからクリアしてみます
'この短いプロシージャにEXCEL VBAのエッセンスが詰まっています
Dim wksSheet As Worksheet
Dim lngRow As Long
Dim lngClm As Long
Dim lngRowMax As Long
Dim lngClmMax As Long
Dim varBuf As Variant
Dim colList As Collection
Dim sheetName As String
sheetName = "test"
Set wksSheet = Worksheets(sheetName)
lngRowMax = wksSheet.UsedRange.Rows.Count
lngClmMax = wksSheet.UsedRange.Columns.Count
'コレクションを宣言
Set colList = New Collection
'列ごとVariantに入れた後にコレクションに追加
For lngClm = 1 To lngClmMax Step 1
varBuf = wksSheet.Range(wksSheet.Cells(1, lngClm), wksSheet.Cells(lngRowMax, lngClm)).Value
colList.Add varBuf
Next
wksSheet.Range(wksSheet.Cells(1, 1), wksSheet.Cells(lngRowMax, lngClmMax)).Clear
If IsArray(varBuf) = True Then
Erase varBuf
End If
Set wksSheet = Nothing
Set colList = Nothing
End Sub
Public Sub Reset()
'"src"シートにあるデータを"test"シートにコピーします
'これもコレクションの使い方の代表例です
Dim wksSheet As Worksheet
Dim lngClm As Long
Dim lngRowMax As Long
Dim lngClmMax As Long
Dim varBuf As Variant
Dim colList As Collection
Dim sheetName
sheetName = "src"
Set wksSheet = Worksheets(sheetName)
lngRowMax = wksSheet.UsedRange.Rows.Count
lngClmMax = wksSheet.UsedRange.Columns.Count
Set colList = New Collection
For lngClm = 1 To lngClmMax Step 1
varBuf = wksSheet.Range(wksSheet.Cells(1, lngClm), wksSheet.Cells(lngRowMax, lngClm)).Value
colList.Add varBuf
Next
Set wksSheet = Nothing
sheetName = "test"
Set wksSheet = Worksheets(sheetName)
'コレクション内部で要素が列単位になっているので
'一度Variantに入れたから行列を入れ替えます。
For lngClm = 1 To colList.Count Step 1
If IsArray(varBuf) = True Then Erase varBuf
varBuf = colList.Item(lngClm)
wksSheet.Range(wksSheet.Cells(1, lngClm), wksSheet.Cells(UBound(varBuf), lngClm)) = varBuf
Next
If IsArray(varBuf) = True Then
Erase varBuf
End If
Set wksSheet = Nothing
Set colList = Nothing
End Sub
|