その他 昨日のまとめ(VBA)

コレクションの作成 (Collectionオブジェクト)
http://www.moug.net/tech/exvba/0150076.html

配列よりコレクションを使うと良さそう。
addを使って追加するの簡単。値はfor eachで取り出そう。組み込もう。


複数行をまとめてコメントアウト
http://www.relief.jp/itnote/archives/001067.php

複数行コメントアウト出来たらなと思っていたらありました。
ツールバーの編集のところから出来て安心です。

あと
http://www.simple-sys.com/blog/2008/04/07/314/

ここ見て重複しないセルのオブジェクトを取得したいというか
万単位以上のデータでなんとか早く検索して取得したいけれど。。
2分探索では2分の1しかならず
なんとかそれ以外の方法(ローカルによるものか、VBA自体で解決できる方法)を模索中です・・・

一応それようの途中も残しておいて後で変更追記しよう。

Function columnObjOut(str As String)

'重複するデータを除いて指定した列一覧を抽出
'要 列のデータソート済
'一覧結果をRangeオブジェクトの配列として返す
'
'参考URL
'http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_jyufuku.html
Dim sheetName As String
Dim column As String                    '一覧抽出対象列
Dim column1 As String                   '一覧抽出対象列基準セル
Dim columnSet As New Collection         '取得した一覧の配列
Dim cntSame As Integer                  '同コード数

'変数の設定
sheetName = "Sheet1"    'シート名の設定
column = str            '列の設定
'column1 = CStr(str & 1)
cntSame = 10                 '列の項目種別数

'上記の列一覧処理のように出来ないか検討
'現在は配列で取得する
Dim x, y
Dim cnt As Integer
    Dim myCnt As Long, myFlg As Boolean
    Dim i As Long, j As Long
        With Worksheets("Sheet1")
            x = .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
        End With
        ReDim y(1 To UBound(x), 1 To 1)
        y(1, 1) = x(1, 1)
        myCnt = 1
        cnt = 0
        Debug.Print TypeName(x)
        For i = LBound(x) To UBound(x)
            myFlg = False
            For j = 1 To myCnt
                If x(i, 1) = y(j, 1) Then myFlg = True: Exit For
            Next j
            If myFlg = False Then myCnt = myCnt + 1: y(myCnt, 1) = x(i, 1)
        Next i
        With Worksheets("Sheet2")
            .Range("C:C").ClearContents
            Debug.Print TypeName(y)
            .Range("C1").Resize(UBound(y), 1) = y
        End With
        For Each c In y
            'Debug.Print c
            'ここに取り出し抽出。データ取り出した後すぐループ抜ける処理記述
        Next

'参考URL
'http://www.simple-sys.com/blog/2008/04/07/314/        
'Dim myDic As Object, myKey As Variant
'    Dim c As Variant, varData As Variant
'        Set myDic = CreateObject("Scripting.Dictionary")    'Dictonaryオブジェクト生成
'        With Worksheets(sheetName)
'            varData = .Range(column1, "A41")
'        End With
'        For Each c In varData
'            If Not c = Empty Then
'                If Not myDic.Exists(c) Then
'                    myDic.Add c, Null
'                End If
'            End If
'        Next
'        myKey = myDic.keys
'
'        For Each c In myKey
'            Debug.Print c
'        Next
'
'        Set myDic = Nothing
        
        
'    Dim lastgyou As Integer
'    Dim i As Integer
'    Dim j As Integer
'
'    Dim checkatai As String
'
'    'B列の最終行を求めます。
'   lastgyou = ActiveSheet.Cells(ActiveSheet.Rows.Count, 2).End(xlUp).Row
'
'    '1行目から最終行の前まで繰り返します。
'   For i = 1 To lastgyou - 1
'
'        'チェックする値を、checkataiに代入します。
'
'        checkatai = ActiveSheet.Cells(i, 2).Value
'
'        '今見てる行から、下をチェックします。
'       For j = i + 1 To lastgyou
'
'            'もし、値が同じであれば、
'           If checkatai = ActiveSheet.Cells(j, 2).Value Then
'
'                'その行を削除します
'               ActiveSheet.Rows(j).Delete
'
'                '最終行が1行減ったのでlastgyouの値を減らします。
'               lastgyou = lastgyou - 1
'
'                'チェックしている行を1行前に戻します。
'               j = j - 1
'
'            End If
'
'        Next j
'
'    Next i
End Function

かなり汚い。。