VBAでの新規シート作成について
VBA初心者です。Excel2007、XPを使用しています。
シート1のA列からCP列まで、約1000行データがあります。
1行目は見出しです。
その中でCP列の値が同じ行のみ、
別シートの各位置、見出し行+最大10行としてに表示したいです。
最低でも同じ値が各2行はあります
ちなみにA列とCP列は同じ値なので、A列で判別しても問題ないです。
(例)
Sheet1
A... / CN / CO / CP
項目1... / 項目92 / 項目93 / 項目94
1111 / 品名1 / ○ / 1111
1111 / 品名2 / ○ / 1111
1222 / 品名3 / ○ / 1222
1222 / 品名4 / ○ / 1222
1222 / 品名2 / ○ / 1222
1333 / 品名3 / ○ / 1333
1333 / 品名4 / ○ / 1333
→Sheet2
AA... / DN / DO /DP.
項目1... / 項目92 / 項目93 / 項目94
1111 / 品名1 / ○ / 1111
1111 / 品名2 / ○ / 1111
AA53から
項目1... / 項目92 / 項目93 / 項目94
1222 / 品名3 / ○ / 1222
1222 / 品名4 / ○ / 1222
1222 / 品名2 / ○ / 1222
AA105から
1333 / 品名3 / ○ / 1333
1333 / 品名4 / ○ / 1333
といったように、52行ずつずらした位置に表示したいです。
A列からU列の間に明細を表示しており、
そちらに参照する行として、隣に表示を出来ればと思っております。
恐れ入りますが、ご教授頂けないでしょうか。
宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
#3です
せっかくなので
> もし、切った行を次の塊としてコピーするのなら、
> 後半の方を優先するのなら、
> また、AA 以降をクリアしてから・・・とかなら
これ、変更量も多くないので盛り込んでみました
Public Sub Samp3()
Dim dic As Object
Dim ws As Worksheet
Dim vA As Variant, v As Variant
Dim sS As String
Dim i As Long, j As Long
Const CROWMAX As Long = 10
Set dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Set ws = Worksheets("Sheet2")
' ☆~ AA 以降クリアしないのなら以下をコメントに
With ws
.Cells(1, "AA").Value = 1
.Range("AA1", .Cells.SpecialCells(xlCellTypeLastCell)).Clear
End With
' ~☆
With Worksheets("Sheet1")
vA = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value
For i = 2 To UBound(vA) ' 前優先
' For i = UBound(vA) To 2 Step -1 ' 後優先
If (vA(i, 1) <> "") Then
If (Not dic.Exists(vA(i, 1))) Then
dic(vA(i, 1)) = "A1"
End If
dic(vA(i, 1)) = dic(vA(i, 1)) & "," & "A" & i
End If
Next
j = 1
For Each v In dic.Keys ' 前優先用
' For Each v In mySort(dic.Keys) ' 後優先にしたらこっちを有効に
sS = dic(v)
While (Len(sS) > 0)
vA = Split(sS, ",", CROWMAX + 2)
sS = ""
If (UBound(vA) > CROWMAX) Then
'' ★~ 10行で切って余ったものを次に・・・なら以下1行有効に
' sS = vA(0) & "," & vA(CROWMAX + 1)
'' ~★
ReDim Preserve vA(CROWMAX)
End If
Intersect(.Range(Join(vA, ",")).EntireRow _
, .Range("A:CP")).Copy ws.Cells(j, "AA")
j = j + 52
Wend
Next
End With
Application.ScreenUpdating = True
Set dic = Nothing
End Sub
Private Function mySort(ByVal vA As Variant) As Variant
Dim v As Variant
Dim i As Long, j As Long
For i = LBound(vA) To UBound(vA) - 1
For j = i + 1 To UBound(vA)
If (vA(i) > vA(j)) Then
v = vA(i)
vA(i) = vA(j)
vA(j) = v
End If
Next
Next
mySort = vA
End Function
No.3
- 回答日時:
#1です
解釈抜け/読み飛ばしが結構あったみたいです
・Sheet2 はクリアしてはだめだったんですね
・10行MAX だったんですね
・A へのコピーではなく、AA へのコピーだったんですね
・コピーする順は出現順?
項目1で並べ替えるのなら
For Each v In dic.Keys
↓
For Each v In mySort(dic.Keys)
なお、項目1はまとまっていなくても動きます
ギチギチ専用の記述はしていないので、
Samp1 からの記述変更はそう多くありません
※ 10行で切る場合、行後半のものが切れます
もし、切った行を次の塊としてコピーするのなら、
後半の方を優先するのなら、
また、AA 以降をクリアしてから・・・とかなら
記述を変更しますけど・・・
Public Sub Samp2()
Dim dic As Object
Dim ws As Worksheet
Dim vA As Variant, v As Variant
Dim i As Long, j As Long
Const CROWMAX As Long = 10
Set dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Set ws = Worksheets("Sheet2")
With Worksheets("Sheet1")
vA = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value
For i = 2 To UBound(vA)
If (vA(i, 1) <> "") Then
If (Not dic.Exists(vA(i, 1))) Then
dic(vA(i, 1)) = "A1"
End If
dic(vA(i, 1)) = dic(vA(i, 1)) & "," & "A" & i
End If
Next
j = 1
For Each v In dic.Keys
vA = Split(dic(v), ",")
If (UBound(vA) > CROWMAX) Then
ReDim Preserve vA(CROWMAX)
End If
Intersect(.Range(Join(vA, ",")).EntireRow _
, .Range("A:CP")).Copy ws.Cells(j, "AA")
j = j + 52
Next
End With
Application.ScreenUpdating = True
Set dic = Nothing
End Sub
No.2
- 回答日時:
こんばんは。
>A列からU列の間に明細を表示しており、
>そちらに参照する行として、隣に表示を出来ればと思っております。
ということで、AA列に写すわけですね。
Sheet2 に既存のデータがすでにある上にこれを並べていくことになると、マクロ開始時にはSheet2 のデータは消せないということになりますでしょうか?
>別シートの各位置、見出し行+最大10行としてに表示したいです。
コピー行は、10行までということですね。
質問の内容の項目を逃さないつもりではいたのですが、もし見逃していたら、すみません。
'//
Sub DivideLines()
Dim DiffArea As Range
Dim EndCell As Range
Dim LastCell As Range
Dim Sh1 As Worksheet: Set Sh1 = Worksheets("Sheet1")
Dim Sh2 As Worksheet: Set Sh2 = Worksheets("Sheet2")
'' すでにデータがある場合は、この間は使用できない
' If Application.CountA(Sh2.Cells) > 0 Then
' If MsgBox(Sh2.Name & "の全データを消しますがよろしいですか?", vbOKCancel) = vbOK Then
' Sh2.Cells.Clear
' Else
' Exit Sub
' End If
' End If
With Sh1
Application.ScreenUpdating = False
'------並べ替え----------すでに並べ替えが済んでいるなら、この間は不要
.Range("A1").CurrentRegion.Resize(, 94).Sort _
Key1:=.Cells(2, 1), Order1:=xlAscending, Header:=xlYes
'------------------------
Dim Titles As Range: Set Titles = .Range("A1").Resize(, 94)
Dim FirstCell As Range: Set FirstCell = .Range("A2")
Dim i: i = 1
Dim j
Set EndCell = .Cells(Rows.Count, 1).End(xlUp)
Do
On Error Resume Next
Set DiffArea = .Range(FirstCell, EndCell).ColumnDifferences(FirstCell)
If Err() <> 0 Then
'10行以上はコピーしない
j = Application.Min(EndCell.Row - FirstCell.Row + 1, 10)
Titles.Copy Sh2.Cells(i, "AA")
Range(FirstCell, EndCell).Resize(j, 94).Copy Sh2.Cells(i + 1, "AA")
Exit Do
End If
On Error GoTo 0
Set LastCell = DiffArea.Cells(1).Offset(-1, 0)
'10行以上はコピーしない
j = Application.Min(LastCell.Row - FirstCell.Row + 1, 10)
Titles.Copy Sh2.Cells(i, "AA")
Range(FirstCell, LastCell).Resize(j, 94).Copy Sh2.Cells(i + 1, "AA")
Set FirstCell = LastCell.Offset(1, 0)
i = i + 52
Loop
Application.ScreenUpdating = True
End With
MsgBox "終了", vbInformation
End Sub
'///
No.1
- 回答日時:
全くの未検証ですが、以下でどうなりますか
おかしかったらごめんなさい
Option Explicit
Public Sub Samp1()
Dim dic As Object
Dim ws As Worksheet
Dim vA As Variant, v As Variant
Dim i As Long, j As Long
Set dic = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
Set ws = Worksheets("Sheet2")
ws.Cells.Delete
With Worksheets("Sheet1")
vA = .Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value
For i = 2 To UBound(vA)
If (vA(i, 1) <> "") Then
If (Not dic.Exists(vA(i, 1))) Then
dic(vA(i, 1)) = "A1"
End If
dic(vA(i, 1)) = dic(vA(i, 1)) & "," & "A" & i
End If
Next
j = 1
For Each v In mySort(dic.Keys)
.Range(dic(v)).EntireRow.Copy ws.Cells(j, "A")
j = j + 52
Next
End With
Application.ScreenUpdating = True
Set dic = Nothing
End Sub
Private Function mySort(ByVal vA As Variant) As Variant
Dim v As Variant
Dim i As Long, j As Long
For i = LBound(vA) To UBound(vA) - 1
For j = i + 1 To UBound(vA)
If (vA(i) > vA(j)) Then
v = vA(i)
vA(i) = vA(j)
vA(j) = v
End If
Next
Next
mySort = vA
End Function
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 重複データをまとめて合計を合算する 4 2022/10/25 20:25
- Visual Basic(VBA) 【VBA】指定した検索条件に一致したら別シートに転記したい 2 2022/03/23 16:14
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) エクセルの条件付き書式 個人シートを参照して集計シートに色付けしたい 1 2023/06/22 00:39
- Visual Basic(VBA) EXCEL関数LOOKUPとFILTERについての質問です 1 2022/12/21 05:53
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Excel(エクセル) エクセルの表について 3 2023/04/14 18:00
- Excel(エクセル) フォルダ内の複数ブックを同シート名毎に連結させたい 1 2022/04/07 21:24
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Excel(エクセル) エクセルのフィルターを複数シートに連動させたいです。 エクセルファイルに15シートあります。 そのう 2 2022/05/01 21:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
VBAを使って検索したセルをコピ...
-
vba 2つの条件が一致したら...
-
【VBA】2つのシートの値を比較...
-
エクセルVBA シートモジュール...
-
VBAのFind関数で結合セルを検索...
-
B列の最終行までA列をオート...
-
VBAで、特定の文字より後を削除...
-
文字列の結合を空白行まで実行
-
データグリッドビューの一番最...
-
VBA 値と一致した行の一部の列...
-
vbaでシートより100より大きい...
-
VBAで10行おきにセルの下に罫線...
-
VBA UserFormからの転記で
-
Changeイベントでの複数セルの...
-
セルに値が入っていた時の処理
-
VBA 何かしら文字が入っていたら
-
URLのリンク切れをマクロを使っ...
-
C# dataGridViewの値だけクリア
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Cellsのかっこの中はどっちが行...
-
VBAのコードを教えてください
-
VBAを使って検索したセルをコピ...
-
B列の最終行までA列をオート...
-
エクセルvbaについて
-
vba 2つの条件が一致したら...
-
Excelで、あるセルの値に応じて...
-
VBA UserFormからの転記で
-
VBAのFind関数で結合セルを検索...
-
文字列の結合を空白行まで実行
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
Changeイベントでの複数セルの...
-
エクセルVBAにて =A1=B1とすれ...
-
【VBA】2つのシートの値を比較...
-
データグリッドビューの一番最...
-
VBマクロ 色の付いたセルを...
-
VBAで指定範囲内の空白セルを左...
おすすめ情報