• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA コード教えてください)

VBAコードで配送データを出発地ごとにワークシートに分ける方法

このQ&Aのポイント
  • 配送データを出発地ごとに分けるためのVBAコードを作成しました。このコードを実行すると、出発地が青森、秋田、岩手、宮城の場合にそれぞれのワークシートが作成されます。しかし、出発地データがない場合にもワークシートが作成されてしまう問題があります。どのようにすれば、出発地データがある場合のみワークシートを作成できるでしょうか?
  • VBAコードを使用して配送データを出発地ごとにワークシートに分ける方法を試しています。既存のコードでは出発地データがない場合でもワークシートが作成されてしまいます。出発地データがない場合にワークシートを作成しないようにするための方法を教えてください。
  • VBAコードを使用して配送データを出発地ごとにワークシートに分けるプログラムを作成したいです。既存のコードでは出発地データがない場合でもワークシートが作成されてしまうため、出発地データがある場合のみワークシートを作成する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

> 実行時には、sheet1だけしかない状態で行うのですがエラーになるのです 標準モジュールにコードがあるみたいですね。シートモジュールだと思ってました。 以下のようにしてください。各RangeとCellsの前にドットを入れてます。抜けはないと思いますがもし抜けがあれば入れてください。 Sub Test() Dim i As Long With Worksheets("Sheet1") .Range("B4", .Range("B4").End(xlDown)).Copy .Range("G4").PasteSpecial (xlPasteAll) .Range("G4", .Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo For i = 4 To .Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = .Cells(i, "G").Value .Cells(3, 1).AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value .Cells(3, 1).CurrentRegion.Copy Destination:=Worksheets(.Cells(i, "G").Value).Cells(3, 1) .AutoFilterMode = False Next End With End Sub

kishin1180
質問者

お礼

はい、標準モジュールを使っていました 教えて頂いたコードを実行させた所希望どうりの事が出来るようになりました どうもありがとうございました

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

すでに回答は出ているが、方法論として全体的な、見通しの勉強のために 挙げてみます。 同類の列データから、重複のないリストを作る方法(VBA)は(ロジックは) (1)CountifをVBAで使う方法(下記)一番考えやすいかな? (2)FilterのUnique指定 (3)FSOのDictionaryの仕組を使う (4)SQLのUnique指定 (5)データ総なめで、既に存在するか判別を繰り返す法 などあり、データ処理の必須の基礎手法です。 ーー B列に府県名があるとして 標準モジュールに Sub test01() Dim fuken(100) k = 1 lr = Range("B100000").End(xlUp).Row For i = 2 To lr x = Cells(i, "B") If WorksheetFunction.CountIf(Range("b2:B" & i), x) = 1 Then fuken(k) = x k = k + 1 End If Next i '--確認用 府県が多い場合はDebugPrintに置き換え For i = 1 To k - 1 MsgBox fuken(i) Next i '--- For i = 1 To k - 1 Worksheets.Add(After:=ActiveSheet).Name = fuken(i) Next i End Sub を入れて実行すると、存在する府県名のシートが(出現順に)できます。 ーー この後、VBAで府県名でFilterを使って、各府県の各シートに振り分けるのは、10行程度のコードでできます。

kishin1180
質問者

お礼

書いていただいたコード実行した所、希望しているようにシートが作成されてシートの名前も希望通リ出発地の名前のシートに変更されました コメント頂いたお二人とも変数使ってコード作成するので、私がネット参照しながら作る物とは違ってスマートな物になってますね 私ももっと勉強して理解できるようになりたいです 今回はどうもありがとうございました

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

> 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです 2度目だと、すでに存在するシート名と同じシート名にしようとしてエラーになっています。 元のコードでも同じですので、毎回削除するとかするのだと思っていたのですが。

kishin1180
質問者

補足

実行時には、sheet1だけしかない状態で行うのですがエラーになるのです つまり毎回Sheet1に会社のシステムからExcel形式でエクスポートしたファイルからデータをコピーして貼り付け この貼り付けたデータを、抽出したい日付のデータのみ残すようにしてから、出発地>運送会社>ドライバーの順でソートをかけた状態にする なので、sheet1だけしか存在しないブック構成なのです ここから教えて頂いた方法で、B列のデータを重複しないようにしたデータをG4から貼り付けます ここまで出来た状態で、教えて頂いたコードを実行させるのですが、 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってしまうのです

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

Findで出発地を検索して見つかればシート作成やコピーなどの操作をするという方法があります。以下のサイトのサンプル 2を参考にしてください。 条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド) https://www.moug.net/tech/exvba/0050116.html また、出発地のデータを重複の削除で出発地一覧を空いている場所に作成してその一覧を参照してシート作成やコピーをするとう手もあります。 たとえばG4から下に一覧を作成したとして (一覧の作成のコードはマクロの記録で取得して最初に入れてください) Sub Test() Dim i As Long With Cells(3, 1) For i = 4 To Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = Cells(i, "G").Value .AutoFilter Field:=2, Criteria1:=Cells(i, "G").Value .CurrentRegion.Copy Destination:=Worksheets(Cells(i, "G").Value).Cells(3, 1) Worksheets("Sheet1").AutoFilterMode = False Next End With End Sub

kishin1180
質問者

補足

kkkkkmさんコメントありがとうございます 教えて頂いた、別なセルにデータの重複を削除した物を作成し、それを参照させるという手法を行ってみました コードは下記のようにしました Sub Test() Dim i As Long Range("B4", Range("B4").End(xlDown)).Copy Range("G4").PasteSpecial (xlPasteAll) Range("G4", Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo With Cells(3, 1) For i = 4 To Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = Cells(i, "G").Value .AutoFilter Field:=2, Criteria1:=Cells(i, "G").Value .CurrentRegion.Copy Destination:=Worksheets(Cells(i, "G").Value).Cells(3, 1) Worksheets("Sheet1").AutoFilterMode = False Next End With End Sub これを実行すると ActiveSheet.Name = Cells(i, "G").Value の部分で 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってコードが止まってしまうのですが、これはどうやったらエラー回避できるのでしょうか

関連するQ&A