[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『配列について』(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
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.