
変動するセル範囲からB列を基準にしてソートし、別シートに転記したいのですが、うまくいきません。
商品名が多数あり変動するために通常のオートフィルター等では無く、マクロを活用して別シートに転記する方法で教えてください。
以下の2つのコードを組み合わせて、複数の商品別シートを作成したいのです。
大変恐縮ですが、詳しい方、マクロのコードを教えてください。
Sub 分類区切線()
Dim i As Integer
Dim 最終行 As Long
最終行 = Range("A5").CurrentRegion.Rows.Count + 5
For i = 6 To 最終行
If Range("B" & i).Value <> Range("B" & i - 1).Value Then
Range("B" & i - 1).Resize(1, 6).Copy
Worksheets.Add
Range("A1").PasteSpecial
End If
Next
End Sub
Sub 別シート作成()
'
' 別シートにヘッドをコピー
'
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("商品").Select
Rows("5:5").Select
Selection.Copy
Sheets(Sheets.Count).Select
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub

No.14ベストアンサー
- 回答日時:
#12です
CurrentRegion で求めた範囲が、イメージした通りじゃないみたい
以下、★ 部分変更したので、どうなりますか
Public Sub Samp2()
Dim rng As Range
Dim vA As Variant, vW As Variant
Dim i As Long, j As Long, k As Long, n As Long
Set rng = Worksheets(Worksheets.Count).Range("A1")
Application.ScreenUpdating = False
With Worksheets("商品")
With .Range("A5") ' ★
With Range(.End(xlDown), .End(xlToRight)) ' ★
n = .Columns.Count
ReDim vW(1 To n)
For k = 1 To n
vW(k) = .Cells(1, k).ColumnWidth
Next
With .Resize(, n + 1)
With .Columns(n + 1)
.Formula = "=ROW()"
.Value = .Value
End With
.Sort .Cells(2), xlAscending, Header:=xlYes
End With
vA = .Columns(2).Resize(, 2).Value
i = 2
While (i <= UBound(vA))
For j = i + 1 To UBound(vA)
If (vA(i, 1) <> vA(j, 1)) Then Exit For
Next
With Worksheets.Add(After:=rng.Worksheet)
For k = 1 To n
.Cells(1, k).ColumnWidth = vW(k)
Next
Set rng = .Range("A1")
On Error Resume Next
.Name = vA(i, 2)
On Error GoTo 0
End With
Union(.Rows(1), .Rows(i).Resize(j - i)).Copy rng
i = j
Wend
With .Resize(, n + 1)
.Sort .Cells(n + 1), xlAscending, Header:=xlYes
.Columns(n + 1).ClearContents
End With
End With ' ★
End With
.Activate
End With
Application.ScreenUpdating = True
End Sub
No.16
- 回答日時:
No.16です。
仮にNo.15の予想が外れているようであれば、初級レベルでは難しそうなのでベテラン回答者さんにお任せです。
十数年やっても初級レベルから脱せないのは情けないですよね・・・
いつになったら『参考程度に』のスタンプを自信をもって使えるのだろう。。。多分その日は来ないかな?
めぐみん 様
何度も教えていただきありがとうございました。
No.15に記載していただいたような余分な列はありませんでした。
trim関数で検証する必要があるかもしれません(検証の方法がよくわかりません)が、見た目およびカーソルの位置が各セルで一番左で点滅していることから、文字が入力されていないようです。
こちらのデータ保存が不十分なため
お手数をお掛けし申し訳ございませんでした。
初心者のため、分からない点が多くて基本から勉強し、教えていただいたコードを intersect の使用方法を含め理解できるようにしたいと思います。
本当に助かりました。
また、わからない点がありましたらご教示ください。
No.15
- 回答日時:
商品がNullとなっていると言う事は、商品の列の行数より多い列が存在しているのかな?
例えばIDや日付が事前に多く入力されているとか、数式を余分に書いている列が存在するなど。
それならデータのある行が存在する代わりに、商品が空白になっててもおかしくはないかも。
No.13
- 回答日時:
No.11です。
環境の違いでしょうかね?
私は5万行を指定しておいて実際は20行足らずでも空白(Null)は拾ってないのですが。。。。
別の質問者さんに回答した時も今回のような問題は聞いてませんし。
No.12さんのコードが本来のExcelにある純粋な機能で作業されているので、そちらの方が宜しいのかも知れません。
ただ画像では4行目にデータが存在していないけど、実際には何かあるって事で起きているトラブルみたいに思えます。
.CurrentRegion を使う上での注意すべき点ではありますので、その辺を補足されては?
私は老眼なので最初に『1~4行目』を気にしましたから同じようにするなら Intersect を使用してます。
老眼が良いのか悪いのか・・・
何度も回答ありがとうございます。
質問投稿した際に元データをうまく保存できなかったために再度作成したのですが、その際に4行目に不要な文字がありました。
ご指摘の通りでしたので、その文字を削除して対象行を50000行に戻して確認したのですが同じ場所でデバックが出ました。
本日の夜に再度 intersect をどのように使用するかも含めて検証してみます。
No.12
- 回答日時:
標準モジュールに記述し、Samp1 を実行してみます
処理対象は、商品 シート
どうなりますか
Option Explicit
Public Sub Samp1()
Dim rng As Range
Dim vA As Variant, vW As Variant
Dim i As Long, j As Long, k As Long, n As Long
Set rng = Worksheets(Worksheets.Count).Range("A1")
Application.ScreenUpdating = False
With Worksheets("商品")
With .Range("A5").CurrentRegion
n = .Columns.Count
ReDim vW(1 To n)
For k = 1 To n
vW(k) = .Cells(1, k).ColumnWidth
Next
With .Resize(, n + 1)
With .Columns(n + 1)
.Formula = "=ROW()"
.Value = .Value
End With
.Sort .Cells(2), xlAscending, Header:=xlYes
End With
vA = .Columns(2).Resize(, 2).Value
i = 2
While (i <= UBound(vA))
For j = i + 1 To UBound(vA)
If (vA(i, 1) <> vA(j, 1)) Then Exit For
Next
With Worksheets.Add(After:=rng.Worksheet)
For k = 1 To n
.Cells(1, k).ColumnWidth = vW(k)
Next
Set rng = .Range("A1")
On Error Resume Next
.Name = vA(i, 2)
On Error GoTo 0
End With
Union(.Rows(1), .Rows(i).Resize(j - i)).Copy rng
i = j
Wend
With .Resize(, n + 1)
.Sort .Cells(n + 1), xlAscending, Header:=xlYes
.Columns(n + 1).ClearContents
End With
End With
.Activate
End With
Application.ScreenUpdating = True
End Sub
別のコードもご検討いただきありがとうございます。
上記コードで作表はできました。
ただし、ヘッダーとなる5行目の代わりに4行目が各シートに転記されます。
No.11
- 回答日時:
>.Name = objRS1.Fields("F3").Value ここでデバックとなります。
エラーになりうる原因として調べるには、
この行の前に
Debug.Print objRS1.Fields("F3").Value 'イミディエイトウィンドウに表示が出るかどうか
.Name = objRS1.Fields("F3").Value ' ここでデバックとなります。
このようにイミディエイトウィンドウに値の表示が出るかどうか。
すなわち商品名に空白が紛れているかを調べるのと、『商品名』は仮の項目で実際は半角文字を使った物でその値がシート名に使えない記号を用いている場合。
位しか思いつかないですね。
ご連絡ありがとうございます
Debug.Print objRS1.Fields("F3").Value でイミディエイトウィンドウにはNullと表示されます。
また、50000行までを作表可能としてコード作成してもらっていますが、今回は、仮として86行目までのシートとしました。
そのため、50000の数値を86とした場合にはイミディエイトウインドウに該当商品名が表示されるとともに、商品名ごとのシートができました。
50000の個所が変数となりますのでどのようにしたらよろしいのでしょうか。
No.10
- 回答日時:
仮にコードが複数で商品名が1つの関係だったとして、商品名でシート訳をしたい(シート名が商品名)と言うのであれば多少改造は必要ですが不可能ではないですよ。
1日ちょいあれば可能かと。(改造と検証で)
理解が低くて申し訳ありません。
やはり、1行目だけ追加しても
.Name = objRS1.Fields("F3").Value ここでデバックとなります。
Set WS = Worksheets.Add(After:=Worksheets(Worksheets.Count))
With WS
.Name = objRS1.Fields("F3").Value コードと商品名は1対なのでこのままでしょうか。
r1.EntireRow.Copy .Range("A5")
.Range("A6").CopyFromRecordset objRS2
.Range("A6", .Cells(Rows.Count, "A").End(xlUp)).NumberFormat = "m月d日" '★ 追加
With .Range("A5").CurrentRegion.Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
objRS2.Close
objRS1.MoveNext
Loop
objRS1.Close
Set objRS1 = Nothing
Set objRS2 = Nothing
objCn.Close
Set r1 = Nothing
Set objCn = Nothing
End Sub
商品名でシート分けを行いたいと思います。
No.9
- 回答日時:
ダブってしまっているんですね。
追加するのは1行だけだったのですが、わかりやすいようにと思い前後を載せた(言葉が足りなかった)ミスなのかな?
With WS
.Name = objRS1.Fields("F3").Value
r1.EntireRow.Copy .Range("A5")
.Range("A6").CopyFromRecordset objRS2
With .Range("A5").CurrentRegion.Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
' With WS
' .Name = objRS1.Fields("F3").Value
' r1.EntireRow.Copy .Range("A5")
' .Range("A6").CopyFromRecordset objRS2
' .Range("A6", .Cells(Rows.Count, "A").End(xlUp)).NumberFormat = "m月d日" '★ 追加
' With .Range("A5").CurrentRegion.Borders
objRS2.Close
objRS1.MoveNext
Loop
は
With WS
.Name = objRS1.Fields("F3").Value '★← ここは F2 の方が良いのかな?コードは違うけど商品名が同じ場合はシート名はコードにしないとならないので
r1.EntireRow.Copy .Range("A5")
.Range("A6").CopyFromRecordset objRS2
.Range("A6", .Cells(Rows.Count, "A").End(xlUp)).NumberFormat = "m月d日" '★← ここだけ追加と書けば良かったのかも
With .Range("A5").CurrentRegion.Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
objRS2.Close
objRS1.MoveNext
Loop
ですね。
実際はWithに対するEnd Withがないのが原因だったのでしょう。
No.7
- 回答日時:
No.6のお礼について。
そのエラーメッセージについてはこちらでは発生してませんでしたね。
シート名:商品 はあってますよね?
あとエラーメッセージが出てシートは1つも作成されないのでしょうか?
データ行数は5万行超えてますか?(念の為)
早速のご連絡ありがとうございます。
追加するように連絡いただいたコードを追記する前は、
.Name = objRS1.Fields("F3").Value
の場所でデバックとなります。(シートは追加されます。)
また、以下の場所に ’を外して 追記した場合は、LOOPの場所でエラーとなり、Doがありませんとの表示がされます。
(ただし、シートは追加されません。)
5万行をデータが越えることはありません。
シート名は商品です。
エラー解消する方法はありますでしょうか。
With WS
.Name = objRS1.Fields("F3").Value
r1.EntireRow.Copy .Range("A5")
.Range("A6").CopyFromRecordset objRS2
With .Range("A5").CurrentRegion.Borders
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
End With
' With WS
' .Name = objRS1.Fields("F3").Value
' r1.EntireRow.Copy .Range("A5")
' .Range("A6").CopyFromRecordset objRS2
' .Range("A6", .Cells(Rows.Count, "A").End(xlUp)).NumberFormat = "m月d日" '★ 追加
' With .Range("A5").CurrentRegion.Borders
objRS2.Close
objRS1.MoveNext
Loop
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセル VBAでシートのコピーを作りたい 1 2023/05/18 07:42
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
このQ&Aを見た人はこんなQ&Aも見ています
-
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
【VBA】元のシート内の文字列を別シートと比較し、一致したら元のシートの別のセルへ転記する方法。
Excel(エクセル)
-
-
4
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
5
【VBA】指定した検索条件に一致したら別シートに転記したい
Visual Basic(VBA)
-
6
エクセルのVBAで日付を検索し転機したい
Visual Basic(VBA)
-
7
VBA 別ブックから条件に合うものを転記したいです
Visual Basic(VBA)
-
8
VBA 値と一致した行の一部の列のデータを転記について教えてください
Visual Basic(VBA)
-
9
VBA 列全体を別シートの列と比較し、同じ値がある行の、右端に値をコピーする方法について
Excel(エクセル)
-
10
excel VBA 2つのシートの特定の列を比較して同じ値のセルがあったらその行を上書きしたい
Excel(エクセル)
-
11
複数条件が一致で別シートに転記【エクセルVBA】
Excel(エクセル)
-
12
VBA 別シートの同じ日付の欄に値を貼付け
Excel(エクセル)
-
13
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
14
【VBA】指定したセルと同じ値で、別シートにあるセルに移動するには?
Visual Basic(VBA)
-
15
VBA 別シート、別ブックへ条件一致で転記
Excel(エクセル)
-
16
excel vbaで日付一致の行にデータ転記
Excel(エクセル)
-
17
エクセルVBA 4行飛ばしで転記するループ処理
Excel(エクセル)
-
18
VBAで条件が一致する行をコピーしその1つ下へ挿入
Excel(エクセル)
-
19
エクセルvbaで、別シートの最下行にデータを取り込むコードを教えてください。
Visual Basic(VBA)
-
20
VBA セルの値と同じ名前のシートにデータを貼り付けするやり方を教えてください
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
VBA 存在しないシートを選...
-
実行時エラー1004「Select メソ...
-
特定の文字を含むシートだけマ...
-
Excelマクロのエラーを解決した...
-
XL:BeforeDoubleClickが動かない
-
【ExcelVBA】全シートのセルの...
-
エクセルVBA Ifでシート名が合...
-
実行時エラー'1004': WorkSheet...
-
エクセルのシート名変更で重複...
-
Excel チェックボックスにチェ...
-
ExcelのVBAのマクロで他のシー...
-
エクセルVBA 別シートからのコ...
-
複数シートに色付きセル(条件つ...
-
EXCEL VBAで複数シートから該当...
-
VB.net(2005)でエクセルの特定...
-
Worksheet_Changeの内容を標準...
-
Excel VBA で自然対数の関数Ln...
-
userFormに貼り付けたLabelを変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelマクロのエラーを解決した...
-
特定の文字を含むシートだけマ...
-
【ExcelVBA】全シートのセルの...
-
ユーザーフォームに入力したデ...
-
excelのマクロで該当処理できな...
-
実行時エラー'1004': WorkSheet...
-
ブック名、シート名を他のモジ...
-
実行時エラー1004「Select メソ...
-
VBA 存在しないシートを選...
-
ExcelVBA:複数の特定のグラフ...
-
エクセルのシート名変更で重複...
-
IFステートの中にWithステート...
-
VBA 検索して一致したセル...
-
ExcelのVBAのマクロで他のシー...
-
XL:BeforeDoubleClickが動かない
-
別のシートから値を取得するとき
-
エクセルVBA Ifでシート名が合...
-
エクセル・マクロ シートの非...
-
シートが保護されている状態で...
-
シート削除のマクロで「delete...
おすすめ情報
今回教えていただいたコードで思い通りの表が作成できました。
大変助かりました。
コードの意味合いが理解できていないので基本から勉強してスキルを少しでも上げたいと思います。
今後も宜しくお願い致します。