[[20121004235255]] 『配列について』(MAKO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『配列について』(MAKO)

エクセル2007です。宜しくお願いします。B列でA列にない記号をB列に追加したいです。A列の数字0は除きます。下記サンプルコードの中でRange(Cells(lastrow + 1, 2), Cells(lastrow + cnt, 2)) = v2の所でまとめて書き出したいのですが、ご教授お願い致します。配列は勉強中で分かってるようで分かっておりません。汗・・・

  A   B   ⇒  B
1 AA  BB     BB
2 BB  CC     CC
3 0          AA
4 CC         DD
5 0
6 DD

Sub サンプル()

Dim dic As Object, lastrow As Long, last As Long
Dim i As Long, cnt As Long
Dim v As Variant, v1 As Variant, v2() As Variant, v3 As Variant

cnt = 0

        lastrow = Range("b" & Rows.Count).End(xlUp).Row
        v = Range("b1:b" & lastrow).Value

    Set dic = CreateObject("scripting.dictionary")
    For i = LBound(v) To UBound(v)
               dic(v(i, 1)) = v(i, 1)
    Next

        last = Range("a" & Rows.Count).End(xlUp).Row
        v1 = Range("a1:a" & last).Value
            For i = LBound(v1) To UBound(v1)
               If v1(i, 1) <> 0 Then
                If Not dic.Exists(v1(i, 1)) Then

                   ReDim Preserve v2(cnt)
                   v2(cnt) = v1(i, 1)
                  'Cells(lastrow + cnt + 1, 2).Value = v2(cnt)
                cnt = cnt + 1
                End If
               End If
            Next
            ここでまとめて書き出したいです。
            Range(Cells(lastrow + 1, 2), Cells(lastrow + cnt, 2)) = v2
     Set dic = Nothing

        'ReDim v3(LBound(v2) To UBound(v2), 1 To 1) こういう書き方だとうまくいきます。
           'For i = LBound(v2) To UBound(v2)
                    'v3(i, 1) = v2(i)
           'Next i

        'Range(Cells(lastrow + 1, 2), Cells(lastrow + UBound(v2) + 1, 2)) = v3

End Sub


 こんな感じ?

 Sub test()
    Dim dic As Object, v, i As Long
    Set dic = CreateObject("Scripting.Dictionary")
    dic.CompareMode = 1
    With Range("a1").CurrentRegion
        v = .Value
        For i = 1 To UBound(v, 1)
            If v(i, 1) <> 0 Then dic(v(i, 1)) = Empty
        Next
        For i = 1 To UBound(v, 1)
            If dic.exists(v(i, 2)) Then dic.Remove (v(i, 2))
        Next
        If dic.Count > 0 Then
            .Parent.Range("b" & Rows.Count).End(xlUp)(2) _
            .Resize(dic.Count).Value = _
            Application.Transpose(dic.keys)
        End If
    End With
End Sub
(seiya)

 MAKOさんのコードも

 Range(Cells(lastrow + 1, 2), Cells(lastrow + cnt, 2)) = v2

 Range(Cells(lastrow + 1, 2), Cells(lastrow + cnt, 2)) = Application.Transpose(v2)
 このようにすると、作動しますね!!

 後は、際の処理ですね!! 例えば、B列にデータがない場合、あるいは、B1に AAとあるだけの場合、

 エラーになりますから、その対処は必要です。

 それから、Excelの場合、1行目は、項目名にする これにしておくと 色々便利ですから。

 際の処理も項目名があれば、ないより楽だと思います。

 ichinose


seiyaさま、ichinoseさま、回答ありがとうございました。

v2 = "AA" & vbCrLf & "DD"

Range("a1:a2") = WorksheetFunction.Transpose(Split(v2, vbCrLf))

こんな感じでのイメージで理解しました。

ただ、v2に格納できるデータ量が多くてもTransposeは作動すのるでしょうか?

例えば v2 = "AA" & vbCrLf & "DD" ・・・・・・こんな感じです。

お手数ですが教えていただけないでしょうか?

(MAKO)


 vbaの Transpose method には制限があります。
 配列の要素に255を超える長さの文字列が存在したり、配列のどの次元でも
 65536を超えると機能しません。
 (seiya)

ありがとうございました。

勉強になりました。

(MAKO)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.