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