多く解答が出たら、それぞれ研究してみてくださいね。
こういうのは、VBAが一番良いと思います。
Sheet2のデータは、まったくなしでも、作動します。
ただ、このマクロは、Sheet2の既にあるデータをクリアしているわけではありませんので、使用の際には注意してください。
また、5010からの新データに対して、分かち行としての空白行はつきません。
Sub test()
Dim ary As Variant
Dim wsh_rng As String
Dim rng As Range
Dim ret As Integer
Dim Sh2 As Worksheet
Dim num As Variant, j As Long, i As Long
Dim ans As Variant
Dim r As Range
Worksheets("Sheet1").Activate 'シート1をアクティブにする
Set Sh2 = Worksheets("Sheet2") 'シート2 を設定
Set rng = Range("A1").CurrentRegion
'アクティブシートのA1からの連続した範囲
ary = rng.Value '配列として取得
num = Application.Max(Range("A:A"))
If num < 1 Or num > 1000 Then MsgBox "データが不明です", 16: Exit Sub
'列の数字チェック
wsh_rng = rng.Columns(1).Address & _
"&" & rng.Columns(2).Address & _
"&" & rng.Columns(3).Address
If Evaluate("Sum((Match(" & wsh_rng & ", " & wsh_rng & ", 0) = Row(" & _
rng.Columns(1).Address & ")) * 1)") <> UBound(ary) Then
ret = MsgBox("データにダブりがあります。" & Chr(13) _
& "上書きして実行しますか?", 64 + vbYesNo)
'配列数式によるダブりのチェック
If ret <> vbYes Then
Exit Sub
End If
End If
With Sh2
If Application.CountA(.Range("A1").Offset(, j)) <> j Then
For j = 1 To num
.Range("A1").Offset(, j).Value = j
Next
End If
For i = LBound(ary) To UBound(ary)
ans = Application.Match(ary(i, 2), .Range("A:A"), 0)
If Not IsError(ans) Then
.Cells(ans, 1).Offset(, ary(i, 1)).Value = ary(i, 3)
Else
Set r = .Range("A65536").End(xlUp).Offset(1)
r.Value = ary(i, 2)
r.Offset(, ary(i, 1)).Value = ary(i, 3)
End If
Next i
End With
Set r = Nothing
Set Sh2 = Nothing
End Sub
お礼
お礼が遅れて大変申し訳ないです とても参考になりました ありがとうございます。