|
▼ぶらっと さん:
>▼kiki さん:
>
>なぁるほど。そういう要件だったんだ。
>じゃぁ、そちらのコードの添削は、この板の回答者さんにおまかせして
>あちらで回答したコードを踏まえて以下。データ量が多ければ効果ありかな?
>参考まで。
>
> Sub Sample()
> Dim c As Range
> Dim v() As Variant
> Dim keyV() As String
> Dim b() As Variant
> Dim cols As Long
> Dim j As Long
> Dim dic As Object
> Dim sh1 As Worksheet
> Dim cnt As Long
> Dim fIdx As Long
> Dim mIdx As Long
> Dim w As Variant
> Dim n As Long
>
> Set dic = CreateObject("Scripting.Dictionary")
> Set sh1 = Sheets("Sheet1")
> fIdx = 1 '転記用配列行カウンター
> ReDim v(1 To Rows.Count) '転記用配列を最大行で準備
> ReDim keyV(1 To Rows.Count, 1 To 1) 'キー列用配列
>
> With Sheets("Sheet1")
> 'シート1の列数取得
> cols = .UsedRange.Cells(.UsedRange.Cells.Count).Column
> ReDim b(1 To 1, 1 To cols) 'シート1にない場合の転記行スケルトン
> End With
>
> With Sheets("Sheet2")
> 'シート2のA1からA列のデータ最終行までのセルを1つずつ取り出す
> For Each c In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
> 'シート2のキーの重複は無視(処理しない)
> If Not dic.exists(c.Value) Then
> 'シート1のD列に、その値があるかどうか
> cnt = WorksheetFunction.CountIf(sh1.Columns("D"), c.Value)
> dic(c.Value) = Array(fIdx, cnt, 0)
> If cnt > 0 Then
> fIdx = fIdx + cnt 'シート2にあれば
> Else
> v(fIdx) = b 'なければ行スケルトン
> keyV(fIdx, 1) = c.Value 'キー列
> mIdx = fIdx '配列セット行の最大数
> fIdx = fIdx + 1
> End If
> End If
> Next
>
> End With
>
> With Sheets("Sheet1")
> 'シート1のD1からD列のデータ最終行までのセルを1つずつ取り出す
> For Each c In .Range("D1", .Range("D" & .Rows.Count).End(xlUp))
> 'もし辞書にあれば(シート2にあれば)1行分のイメージを配列に格納
> If dic.exists(c.Value) Then
> w = dic(c.Value)
> n = w(0) + w(2)
> v(n) = c.EntireRow.Resize(, cols).Value
> '配列セット行の最大値
> mIdx = WorksheetFunction.Max(n, mIdx)
> w(2) = w(2) + 1
> dic(c.Value) = w
> If w(2) = 1 Then keyV(n, 1) = c.Value 'キー列用配列
> End If
> Next
> End With
>
> With Sheets("Sheet2")
> Cells.ClearContents '最初に転記領域のクリア
> .Range("A1").Resize(mIdx).Value = keyV 'キー列セット
> ReDim Preserve v(1 To mIdx) '転記用配列を実際の行数分に圧縮
> .Range("C1").Resize(mIdx, cols).Value = _
> WorksheetFunction.Transpose(WorksheetFunction.Transpose(v))
> .Select
> End With
>
>
> MsgBox "転記終了"
>
>
> End Sub
ぶらっと さん
私の確認不足でお手間を取らせて申し訳ございませんでした。
また、お返事大変感謝しております。
すぐには理解できないコードですが、明日からにらめっこして勉強させていただきたいです。
こちらのコードでは、上記新規質問させて頂いたものには対応難しいですよね?
|
|