[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『配車表一覧を得意先ことに振り分け』(事務員)
ご教授お願い致します。
毎日入力する配車表(1日につきシート1枚)を自動で得意先ことに(1カ月につきシート1枚)転記する方法を教えて頂きたいです。
(例)
シート1
【配車表】 〇月▲日
NO. 車番 車両 乗務員 行き先1 荷主 行き先2 荷主 行き先3 荷主
1 11-11 あ a A b B z A
2 11-12 い b B k A v B
シート2
【配車表】 ■月〇日
3 11-13 う g A
4 11-14 え a B
シート3
【得意先A】
日付 車番 乗務員 行き先
〇月▲日 11-11 あ a
〇月▲日 11-12 い k
〇月▲日 11-11 あ z
■月〇日 11-13 う g
シート4
【得意先B】
〇月▲日 11-11 あ b
〇月▲日 11-12 い b
■月〇日 11-14 え a
よろしくお願い致します。
< 使用 アプリ:、使用 OS:Windows11 >
Dim ws As Worksheet, destWs As Worksheet
Dim lastRow As Long, destLastRow As Long
Dim i As Long, j As Long
Dim dayStr As String, carNum As String, driver As String, destination As String, customer As String
Dim cell As Range
Dim destSheetName As String
Dim headerRow As Long: headerRow = 2 'ヘッダーが何行目か(必要に応じて修正)
'全てのシートを走査
For Each ws In ThisWorkbook.Worksheets
'得意先シートはスキップ
If Left(ws.Name, 4) = "得意先" Then GoTo Skip
'日付の取得(例:シート名から取る)
dayStr = ws.Range("A1").Value '必要ならA1以外も可
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'データ行を走査
For i = headerRow + 1 To lastRow
carNum = ws.Cells(i, 2).Value
driver = ws.Cells(i, 4).Value
'行き先1〜3と荷主1〜3(列5,6・7,8・9,10)を順番に処理
For j = 1 To 3
destination = ws.Cells(i, 4 + (j - 1) * 2 + 1).Value
customer = ws.Cells(i, 4 + (j - 1) * 2 + 2).Value
If customer <> "" Then
destSheetName = "得意先" & customer
'得意先シートが存在しない場合は作成
On Error Resume Next
Set destWs = ThisWorkbook.Worksheets(destSheetName)
If destWs Is Nothing Then
Set destWs = ThisWorkbook.Worksheets.Add(After:=Sheets(ThisWorkbook.Sheets.Count))
destWs.Name = destSheetName
'ヘッダー
destWs.Range("A1").Value = "日付"
destWs.Range("B1").Value = "車番"
destWs.Range("C1").Value = "乗務員"
destWs.Range("D1").Value = "行き先"
End If
On Error GoTo 0
'得意先シートの最終行
destLastRow = destWs.Cells(destWs.Rows.Count, "A").End(xlUp).Row + 1
'転記
destWs.Cells(destLastRow, 1).Value = dayStr
destWs.Cells(destLastRow, 2).Value = carNum
destWs.Cells(destLastRow, 3).Value = driver
destWs.Cells(destLastRow, 4).Value = destination
End If
Next j
Next i
Skip:
Set destWs = Nothing
Next ws
MsgBox "得意先別に転記完了しました"
End Sub
シート構成例:
[7月1日] [7月2日] … [7月31日] [得意先A] [得意先B] [得意先C]
【得意先A】シートには月分のデータが縦積み
日付 車番 乗務員 行き先 7/1 11-11 山田 東京 7/2 11-12 佐藤 大阪 7/2 11-11 山田 名古屋 7/3 11-13 鈴木 横浜
こんなイメージのもと、作成しました。
(通りすがり) 2025/07/17(木) 12:43:59
大変お恥ずかしいのですが・・・これはマクロというものでしょうか?
マクロに関しては全くの無知で・・・
どのセルに入力すればいいのでしょうか?
(事務員) 2025/07/18(金) 10:21:53
開発タブがなければホームタブにしてからアイコンとか並んでない空いてるとこで
右クリック→リボンのユーザー設定→コマンドの選択→メインタブ→開発→追加
で、追加できます
(通りすがり) 2025/07/18(金) 11:57:31
VBA 1) 配車表のB1に日付(シリアル値)が入力されている 2) 配車表の2行目に列項目がありデータは3行目から 3) 得意先シート名は 荷主名_yyyy年mm月"、例 A_2025年07月 等 4) 転記後は元データを消去 5) 転記後対象シートをシート名の昇順で並べ替え
使用方法 1) 配車表シートのシート見出しを右クリック-[コードの表示] 2) 右空白部分に下記コードを張り付け
Sub test()
Dim myMonth$, i&, ii&, wsName$, x, r As Range
Set r = [L2]
If Not IsDate(r) Then MsgBox r.Address(0, 0) & "に日付がありません": Exit Sub
If [A4] = "" Then Exit Sub
myMonth = Format$([b1], "yyyy年mm月")
With Range("a4", Range("a" & Rows.Count).End(xlUp)).Resize(, Cells.SpecialCells(11).Column)
For i = 1 To .Rows.Count
For ii = 6 To .Columns.Count Step 2
If .Cells(i, ii) <> "" Then
wsName = Join(Array(.Cells(i, ii), myMonth), "_")
If Not Evaluate("isref('" & wsName & "'!a1)") Then
Sheets.Add(, Sheets(Sheets.Count)).Name = wsName
Sheets(wsName).[a1:d1] = [{"日付","車番","乗務員","行き先"}]
End If
x = Application.Index(.Value, i, Array(2, 4, ii - 1))
With Sheets(wsName).Range("a" & Rows.Count).End(xlUp)(2)
r.Copy .Cells(1)
.Range("b1").Resize(, 3) = x
End With
End If
Next
Next
.ClearContents
End With
SortSheets
End Sub
Private Sub SortSheets()
Dim i&, ii&, temp, n&, t&, wsList
ReDim wsList(1 To ThisWorkbook.Sheets.Count)
For i = 1 To ThisWorkbook.Sheets.Count
If Sheets(i).Name Like "*_####年##月" Then
n = n + 1: wsList(n) = Sheets(i).Name
End If
Next
If n Then
t = ThisWorkbook.Sheets.Count - n + 1
For i = 1 To n - 1
For ii = i + 1 To n
If wsList(i) < wsList(ii) Then
temp = wsList(i): wsList(i) = wsList(ii): wsList(ii) = temp
End If
Next
Next
Application.ScreenUpdating = False
For i = 1 To n
Sheets(wsList(i)).Move Sheets(t)
Next
Application.ScreenUpdating = True
End If
End Sub
3) Alt+F11でエクセル画面に戻る 4) 配車表シートの適当な場所にオートシェイプを挿入 5) 4)のオートシェイプを右クリック-[マクロの登録] リストから***.testを選択して[OK] (jindon) 2025/07/18(金) 12:16:06 Edit: 14:12 >※L2に日付入力
>※3行目に項目 >(A3→NO./B3→車番/C3→車両/D3→乗務員/E3→配送先1 > F3→荷主/G3→配送先2/H3→荷主/I3→配送先3/J3→荷主/K3→配送先4/L3→荷主
>※4行目から情報入力
※L2に日付入力
※3行目に項目
(A3→NO./B3→車番/C3→車両/D3→乗務員/E3→配送先1
F3→荷主/G3→配送先2/H3→荷主/I3→配送先3/J3→荷主/K3→配送先4/L3→荷主
※4行目から情報入力
■同じ人が1日で何件も得意先を回るので、配車表は1行目(B4)はAさん、2行目(B5)はCさん・・・と入力するフォーマットになっています。
■荷主シートには、日付/車番/車両/乗務員/配送先を転記できるようにしたいです。
よろしくお願い致します。
(事務員) 2025/07/18(金) 13:49:10
ありがとうございます。
情報入力して、オートシェイプを押すとデータは繁栄されるのですが、配車表に入力したやつが全て消えてしまいます💦
情報入力した配車表も保存したいです。
1日1枚単位で配車表は入力します。
また、入力後、仕事がキャンセルになった場合、その情報を配車表から削除すると、得意先一覧からも削除されるのでしょうか?
(事務員) 2025/07/18(金) 14:33:41
>配車表に入力したやつが全て消えてしまいます
Next
.ClearContents '<--- この行を削除
End With
SortSheets
End Sub
>また、入力後、仕事がキャンセルになった場合、その情報を配車表から削除すると、得意先一覧からも削除されるのでしょうか?
データ配置を含めた運用方法をもう一度考え直した方がよろしいかと... 今のデータ構成ではどんなデータが[削除]されたのかを判定するのは難しいと思いますし、シート数がやたら増えていきますよね? (jindon) 2025/07/18(金) 14:57:33
ご教示ありがとうございました。
>シート数がやたら増えていきますよね?
の件ですが、毎日の配車表も保存しないとダメなので、シート数が増えるのは仕方なくて(;'∀')
毎月、最終日、データ変更がない状態で【確定】を押してデータを反映させることにします(`・ω・´)ゞ
(事務員) 2025/07/22(火) 10:01:34
>毎日の配車表も保存しないとダメなので、シート数が増えるのは仕方なくて データ入力シートを一枚にすればそれで済みますよね? キャンセルの場合もフラグを立ててその理由も保持(後に削除も出来る)
例として
日付 車番 乗務員 行き先 キャンセル 備考
とでもしておけば、データは蓄積されフィルタ・ピボットテーブル機能等も使用できます。
データ構成は最も大事な基礎です。 (jindon) 2025/07/22(火) 10:55:07
>毎日、日毎シートは必要なの?
月の最後に、あれば良いの?
配車表も1年間保存しないとダメなので、毎日、日ごとシート必要です(;'∀')
(事務員) 2025/07/22(火) 11:25:30
' 📌 ?@ 得意先別集計マクロ
Sub 得意先別_集計()
Dim ws As Worksheet, destWs As Worksheet
Dim lastRow As Long, destRow As Long, i As Long
Dim customer As String, targetSheet As String
Dim dayStr, carNum, driver, destination, cancel, remark
Application.ScreenUpdating = False
' 得意先シート初期化
Dim w As Worksheet
For Each w In ThisWorkbook.Sheets
If Left(w.Name, 4) = "得意先" Then
w.Range("A2:F10000").ClearContents
End If
Next
' 日別シート走査
For Each ws In ThisWorkbook.Sheets
If InStr(ws.Name, "月") > 0 And InStr(ws.Name, "日") > 0 Then
dayStr = ws.Range("A1").Value
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 3 To lastRow
carNum = ws.Cells(i, 2).Value
driver = ws.Cells(i, 3).Value
destination = ws.Cells(i, 4).Value
customer = ws.Cells(i, 5).Value
cancel = ws.Cells(i, 6).Value
remark = ws.Cells(i, 7).Value
If customer <> "" Then
targetSheet = "得意先" & customer
On Error Resume Next
Set destWs = Sheets(targetSheet)
If destWs Is Nothing Then
Set destWs = Sheets.Add(After:=Sheets(Sheets.Count))
destWs.Name = targetSheet
destWs.Range("A1:F1").Value = Array("日付", "車番", "乗務員", "行き先", "キャンセル", "備考")
End If
On Error GoTo 0
destRow = destWs.Cells(destWs.Rows.Count, "A").End(xlUp).Row + 1
destWs.Range("A" & destRow).Resize(1, 6).Value = Array(dayStr, carNum, driver, destination, cancel, remark)
End If
Next i
End If
Next ws
Application.ScreenUpdating = True
MsgBox "✅ 得意先別集計 完了"
End Sub
' 📌 ?A 新しい日付シート作成マクロ
Sub 新規日付シート追加()
Dim lastSheet As Worksheet, newSheet As Worksheet
Dim latestDate As Date, tmpDate As Date
Dim sheetName As String, newDate As Date
Dim ws As Worksheet
' 雛形シート使用(名前:雛形)
Set lastSheet = Sheets("雛形")
latestDate = DateSerial(2000, 1, 1)
' 日付最大値検索
For Each ws In Sheets
If InStr(ws.Name, "月") > 0 And InStr(ws.Name, "日") > 0 Then
On Error Resume Next
tmpDate = DateValue(ws.Range("A1").Value)
If tmpDate > latestDate Then latestDate = tmpDate
On Error GoTo 0
End If
Next ws
If latestDate = DateSerial(2000, 1, 1) Then
MsgBox "⚠️ 日付が検出できません。A1の確認を!"
Exit Sub
End If
newDate = latestDate + 1
sheetName = Month(newDate) & "月" & Day(newDate) & "日"
lastSheet.Copy After:=Sheets(Sheets.Count)
Set newSheet = ActiveSheet
newSheet.Name = sheetName
newSheet.Range("A1").Value = Format(newDate, "m月d日")
MsgBox sheetName & " シート作成完了 ✅"
End Sub
' 📌 ?B ボタン設置マクロ
Sub ボタン設置()
Dim btn As Button
Dim ws As Worksheet
Set ws = ActiveSheet ' 現在のシートにボタン作成
' 得意先別集計ボタン
Set btn = ws.Buttons.Add(50, 30, 150, 30)
With btn
.OnAction = "得意先別_集計"
.Caption = "得意先別集計 実行"
.Name = "btn得意先"
End With
' 日付シート追加ボタン
Set btn = ws.Buttons.Add(50, 70, 150, 30)
With btn
.OnAction = "新規日付シート追加"
.Caption = "翌日シート追加"
.Name = "btn日付"
End With
MsgBox "✅ ボタン設置完了"
End Sub
こんな感じは、どうですか?
(通りすがり) 2025/07/22(火) 12:47:29
ありがとうございます!
Set lastSheet = Sheets("雛形")の部分が、実行エラーと出たのですが、どう対処したらよろしいでしょうか?
(事務員) 2025/07/22(火) 12:58:20
随時入力シートを追加していく手法は賛成できませんが、どうしてもというころなら。
アップしたファイルはシートが1枚(配車表)だけものです。 配車表にあるボタンは配車表シートをコピーして新規の配車表シートを作成します。 なので、元の配車表シートはテンプレートとしての使用なのでデータを記入しないでください。
新規作成された配車表シートにあるボタンをクリックするとデータを対象シートに転記します。 配車表のデータを削除、又は追加した際にもボタンをクリックすると更新します。
https://www.dropbox.com/scl/fi/5dxul0bak6pc52kihi0ui/.xlsm?rlkey=5224sosgt5no18w6wg24b3wle&st=h1a6g12d&dl=0
(jindon) 2025/07/22(火) 14:38:39
' 📌 ?@ 得意先別集計マクロ
Sub 得意先別_集計()
Dim ws As Worksheet, destWs As Worksheet
Dim lastRow As Long, destRow As Long, i As Long
Dim customer As String, targetSheet As String
Dim dayStr, carNum, driver, destination, cancel, remark
Application.ScreenUpdating = False
' 得意先シート初期化
Dim w As Worksheet
For Each w In ThisWorkbook.Sheets
If Left(w.Name, 4) = "得意先" Then
w.Range("A2:F10000").ClearContents
End If
Next
' 日別シート走査
For Each ws In ThisWorkbook.Sheets
If InStr(ws.Name, "月") > 0 And InStr(ws.Name, "日") > 0 Then
dayStr = ws.Range("A1").Value
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
For i = 3 To lastRow
carNum = ws.Cells(i, 2).Value
driver = ws.Cells(i, 3).Value
destination = ws.Cells(i, 4).Value
customer = ws.Cells(i, 5).Value
cancel = ws.Cells(i, 6).Value
remark = ws.Cells(i, 7).Value
If customer <> "" Then
targetSheet = "得意先" & customer
On Error Resume Next
Set destWs = Sheets(targetSheet)
If destWs Is Nothing Then
Set destWs = Sheets.Add(After:=Sheets(Sheets.Count))
destWs.Name = targetSheet
destWs.Range("A1:F1").Value = Array("日付", "車番", "乗務員", "行き先", "キャンセル", "備考")
End If
On Error GoTo 0
destRow = destWs.Cells(destWs.Rows.Count, "A").End(xlUp).Row + 1
destWs.Range("A" & destRow).Resize(1, 6).Value = Array(dayStr, carNum, driver, destination, cancel, remark)
End If
Next i
End If
Next ws
Application.ScreenUpdating = True
MsgBox "✅ 得意先別集計 完了"
End Sub
' 📌 ?A 新しい日付シート作成マクロ
Sub 新規日付シート追加()
Dim lastSheet As Worksheet, newSheet As Worksheet
Dim latestDate As Date, tmpDate As Date
Dim sheetName As String, newDate As Date
Dim ws As Worksheet
' 雛形シート使用(名前:雛形)
Set lastSheet = Sheets("雛形")
latestDate = DateSerial(2000, 1, 1)
' 日付最大値検索
For Each ws In Sheets
If InStr(ws.Name, "月") > 0 And InStr(ws.Name, "日") > 0 Then
On Error Resume Next
tmpDate = DateValue(ws.Range("A1").Value)
If tmpDate > latestDate Then latestDate = tmpDate
On Error GoTo 0
End If
Next ws
If latestDate = DateSerial(2000, 1, 1) Then
MsgBox "⚠️ 日付が検出できません。A1の確認を!"
Exit Sub
End If
newDate = latestDate + 1
sheetName = Month(newDate) & "月" & Day(newDate) & "日"
lastSheet.Copy After:=Sheets(Sheets.Count)
Set newSheet = ActiveSheet
newSheet.Name = sheetName
newSheet.Range("A1").Value = Format(newDate, "m月d日")
MsgBox sheetName & " シート作成完了 ✅"
End Sub
' 📌 ?B ボタン設置マクロ
Sub ボタン設置()
Dim btn As Button
Dim ws As Worksheet
Set ws = ActiveSheet ' 現在のシートにボタン作成
' 得意先別集計ボタン
Set btn = ws.Buttons.Add(50, 30, 150, 30)
With btn
.OnAction = "得意先別_集計"
.Caption = "得意先別集計 実行"
.Name = "btn得意先"
End With
' 日付シート追加ボタン
Set btn = ws.Buttons.Add(50, 70, 150, 30)
With btn
.OnAction = "新規日付シート追加"
.Caption = "翌日シート追加"
.Name = "btn日付"
End With
MsgBox "✅ ボタン設置完了"
End Sub
>この文字をすべてコピーして、一度に貼り付けすればよいのでしょうか?
それとも、それぞれ項目ことにシートが違うのでしょうか?
無知で申し訳ありません( ;∀;)
(事務員) 2025/07/22(火) 15:40:22
あ、一度に↑へ貼り付けて下さい
✅ マクロ実行までの基本流れ(初心者向け)
?@ 【開発タブを表示】
- ファイル → オプション → リボンのユーザー設定 → 「開発」に✅チェック
?A 【VBAエディターを開く】
?B 【マクロを貼り付け】
?C 【コンパイルチェック(エラー確認)】
- ✅ 何も起こらなければOK(コンパイル成功) - ❌ 赤くなる or エラーが出たらコード見直し
?D 【マクロの保存】
?E 【マクロ実行】
(通りすがり) 2025/07/22(火) 18:11:37
私の 2025/07/22(火) 14:38:39 に対する返信が無いようなので、私はここまでとします。 株式会社**物流のような物流会社なら基幹システムが導入されているはず。 Excelで何がしたいのだろう... (jindon) 2025/07/22(火) 18:59:40
jindon様
お返事遅くなって申し訳ありません。
今朝、jindon様が貼り付けてくださったやつを使用して確認してみていました!
素晴らしいものありがとうございます!!
質問なのですが、
>配車表にあるボタンは配車表シートをコピーして新規の配車表シートを作成します。
配車表のシートは、その日にその日分しか作成できないのですか?
“配車表-〇年〇月〇日は既に存在します”
と出てしまいます。
何日分の配車をその日に入力したいのですが、どう対処すればよいでしょうか?
あと・・・日付をK2に表示されるようにして頂きたいです。
よろしくお願い致します。
(事務員) 2025/07/23(水) 10:32:53
何度も申し訳ございません。
>配車表のデータを削除、又は追加した際にもボタンをクリックすると更新します
この部分ですが、追加は反映されるのですが、削除は反映されません。
(事務員) 2025/07/23(水) 10:48:53
私にはあなたがどのように使用しているのかわかりません。
>何日分の配車をその日に入力したいのですが こんなの想定に無いし、後出しは厳禁。
もう一度最初からどのようなシートがあってどのようなシートにどのように転記して どのように追加・削除した時にどのシートを更新するのか 詳細に誰にでも理解できるようにわかりやすく説明してください。 これは質問者の最低限の義務です。
他の回答者が解答らしきものをレスされているので、混乱を避けるためにも私は暫く静観します。 (jindon) 2025/07/23(水) 11:15:33
ありがとうございます
翌日シート追加を押すと、
??日付が検出できません。A1の確認を。
と表示されます。
対処方法教えてください。
(事務員) 2025/07/23(水) 12:38:30
後だし追加申し訳ありません。
日付ですが、K2に表示されるようにお願いしたいです。
(事務員) 2025/07/23(水) 12:40:04
文字置き換えで、できます
(通りすがり) 2025/07/23(水) 12:53:48
ありがとうございます。
A1は何個くらいありますか?
もし、車番等項目が3行目にズレルとしたら、それも文字置き換えで対処できるのでしょうか?
1行目は➠配車表
2行目➠K2に日付
3行目➠項目
4行目〜➠データ入力
としたいです。
後々から言って申し訳ないのですが、触りながらやっているので・・・すいません。
(事務員) 2025/07/23(水) 13:07:32
Dim ws As Worksheet
Dim targetWs As Worksheet
Dim lastRow As Long, pasteRow As Long
Dim i As Long
Dim customer As String
Dim dataDate As String
Dim destSheetName As String
Set ws = ActiveSheet
dataDate = ws.Range("K2").Value ' 日付をK2から取得
lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row ' B列を基準に最終行取得
For i = 4 To lastRow ' ★データは4行目から
customer = ws.Cells(i, 6).Value ' 荷主(得意先)をF列から取得
If customer <> "" Then
destSheetName = "得意先" & customer
' シートがなければ作成
On Error Resume Next
Set targetWs = Sheets(destSheetName)
If targetWs Is Nothing Then
Set targetWs = Sheets.Add(After:=Sheets(Sheets.Count))
targetWs.Name = destSheetName
' 見出しを作成
With targetWs
.Range("A1").Value = "日付"
.Range("B1").Value = "車番"
.Range("C1").Value = "乗務員"
.Range("D1").Value = "行き先"
.Range("E1").Value = "キャンセル"
.Range("F1").Value = "備考"
End With
End If
On Error GoTo 0
' 転記
With targetWs
pasteRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(pasteRow, 1).Value = dataDate
.Cells(pasteRow, 2).Value = ws.Cells(i, 2).Value ' 車番(B列)
.Cells(pasteRow, 3).Value = ws.Cells(i, 3).Value ' 乗務員(C列)
.Cells(pasteRow, 4).Value = ws.Cells(i, 4).Value ' 行き先1(D列)
.Cells(pasteRow, 5).Value = ws.Cells(i, 7).Value ' キャンセル(G列)
.Cells(pasteRow, 6).Value = ws.Cells(i, 8).Value ' 備考(H列)
End With
End If
Next i
MsgBox "得意先別シートへの転記が完了しました。", vbInformation
End Sub
(通りすがり) 2025/07/23(水) 20:18:17
ありがとうございます。
上記、ご教示いただきましたものを試してみたのですが、うまくいきませんでした。
データ入力してみたのですが、何も反映されませんでした。
(事務員) 2025/07/24(木) 10:06:53
#### 🔍【1】K2セルの確認
- OK → `2025/7/22` のような **日付形式** - NG → `7月22日` や `"文字列扱い"` だと失敗します
#### 🔍【2】4行目からの入力
| 列 | 内容 | 必須か? |
|-----|--------------|---------|
| B列 | 車番 | ○ 必須 |
| C列 | 乗務員 | ○ 必須 |
| D列 | 行き先1 | ○ 必須 |
| F列 | 荷主(得意先) | ○ 必須 |
| G列 | キャンセル | 任意 |
| H列 | 備考 | 任意 |
#### 🔍【3】得意先シートができたか?
- 追加されていない場合:
- `F列(荷主)` が空である可能性あり
- マクロが実行されていない可能性あり
#### 🔍【4】テストデータ例(4行目〜)
| B列 | C列 | D列 | F列 | G列 | H列 |
|--------|--------|------|-----|-----|-----|
| 11-11 | 山田 | 東京 | A | | |
| 22-22 | 佐藤 | 大阪 | B | ○ | 渋滞あり |
➡️ `K2` に `2025/7/22` を入力してからマクロを実行してください
#### 🔍【5】それでもダメなら教えてほしいこと
1. **K2 には何が入力されてますか?**
2. **何行目からどんなデータを入力しましたか?**
3. **「得意先A」などのシートは新しくできましたか?**
4. **エラーが出た場合、その内容(メッセージ)を教えてください**
(通りすがり) 2025/07/24(木) 12:41:21
ご回答ありがとうございます。
#### 🔍【1】K2セルの確認 →2025/7/24形式で入力しています。
#### 🔍【2】4行目からの入力
→4行目からの入力です。
■1行目→A〜L・・・セル結合して、配車表と入力
■2行目→K2に日付入力
■3行目→項目入力
(A/行NO.、B/車番、C/車種、D/乗務員、E/配送先1、F/荷主、G/配送先2、H/荷主、I/配送先3、J/荷主、K/配送先4、L/荷主、M/備考)
→このようなレイアウトで作成可能でしょうか?
また、得意先からデータを削除する場合は、“キャンセル”と入力しないと、削除されないのでしょうか?
配車表の入力したデータをクリアしたら、得意先シートから自動で削除されるようなことは可能でしょうか?
(事務員) 2025/07/24(木) 15:30:31
Option Explicit
Sub 得意先別集計_最新状態に再構成()
Dim ws As Worksheet, tgtWs As Worksheet
Dim lastRow As Long, i As Long
Dim destRow As Long
Dim 日付 As String, 荷主 As String
Dim 行先 As String, 車番 As String, 乗務員 As String
Dim dict As Object
Dim j As Integer
Dim 荷主列 As Variant, 行先列 As Variant
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' 既存の「得意先」シートを削除
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "得意先*" Then ws.Delete
Next ws
Set dict = CreateObject("Scripting.Dictionary")
' 各日付シート(1日1シート)を順に処理
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "得意先*" Or ws.Name = "雛形" Then GoTo NextSheet
' 日付取得(K2セル)
日付 = Trim(ws.Range("K2").Text)
If 日付 = "" Then GoTo NextSheet
' データの最終行(B列)
lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
' 各行を処理(4行目以降)
For i = 4 To lastRow
' キャンセル判定(G列 = "キャンセル")
If LCase(Trim(ws.Cells(i, "G").Value)) = "キャンセル" Then GoTo NextRow
車番 = Trim(ws.Cells(i, "B").Value)
乗務員 = Trim(ws.Cells(i, "D").Value)
荷主列 = Array(6, 8, 10, 12) ' F, H, J, L
行先列 = Array(5, 7, 9, 11) ' E, G, I, K
For j = 0 To 3
If Trim(ws.Cells(i, 荷主列(j)).Value) <> "" Then
荷主 = Trim(ws.Cells(i, 荷主列(j)).Value)
行先 = Trim(ws.Cells(i, 行先列(j)).Value)
' 得意先シート作成(初回のみ)
If Not dict.exists(荷主) Then
Set tgtWs = ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count))
tgtWs.Name = "得意先" & 荷主
tgtWs.Range("A1:D1").Value = Array("日付", "車番", "乗務員", "行先")
dict.Add 荷主, tgtWs
Else
Set tgtWs = dict(荷主)
End If
' 転記
destRow = tgtWs.Cells(tgtWs.Rows.Count, 1).End(xlUp).Row + 1
tgtWs.Cells(destRow, 1).Value = 日付
tgtWs.Cells(destRow, 2).Value = 車番
tgtWs.Cells(destRow, 3).Value = 乗務員
tgtWs.Cells(destRow, 4).Value = 行先
End If
Next j
NextRow:
Next i
NextSheet:
Next ws
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "得意先別の集計が完了しました。", vbInformation
End Sub
(通りすがり) 2025/07/24(木) 18:53:25
[[20250713005155]] の(xyz)さんの 2025/07/25(金) 16:42:01 の投稿をよく読みなさい。
他の(通りすがり)さんにも迷惑。
(立ち寄り) 2025/07/25(金) 17:33:50
LLMの回答をそのままコピペするなら、そう明記するべきかと思いますね 質問者さんもこんな奴に聞かないで直接ChatGPTに聞いた方が早いですよ笑 (デボラ) 2025/07/25(金) 18:53:56
>配車表のシートは、その日にその日分しか作成できないのですか? 同日の配車表が重複する場合は配車表_yyyy年mm月dd日_hhmmssを時刻を付加
>日付をK2に表示されるようにして頂きたいです。 済み
配車表の[荷主]の無いものは削除されたものとみなします。
Sub test()
Dim a, w, myDate As Date, ym$, i&, ii&, iii&, wsName$
Dim x(1), e, s$, flg As Boolean, ws As Worksheet, dic As Object
If Not IsDate([K2]) Then MsgBox "K2 に日付がありません": Exit Sub
If [A4] = "" Then Exit Sub
myDate = [K2]: wsName = ActiveSheet.Name
Set dic = CreateObject("Scripting.Dictionary")
ym = Format$(myDate, "yyyy年mm月")
a = Range("a4", Range("a" & Rows.Count).End(xlUp)).Resize(, Cells.SpecialCells(11).Column).Value2
For i = 1 To UBound(a, 1)
For ii = 6 To UBound(a, 2) Step 2
If a(i, ii) <> "" Then
s = a(i, ii) & "_" & ym
If Not dic.exists(s) Then
ReDim w(1 To 5, 1 To 1)
Else
w = dic(s)
ReDim Preserve w(1 To 5, 1 To UBound(w, 2) + 1)
End If
w(1, UBound(w, 2)) = myDate
w(2, UBound(w, 2)) = a(i, 3): w(3, UBound(w, 2)) = a(i, 4)
w(4, UBound(w, 2)) = a(i, ii - 1)
w(5, UBound(w, 2)) = ActiveSheet.Name
dic(s) = w
End If
Next
Next
For Each e In dic
If Not Evaluate("isref('" & e & "'!a1)") Then
Sheets.Add(, Sheets(Sheets.Count)).Name = e
Sheets(e).[a1:e1] = [{"日付","車番","乗務員","行き先","参照"}]
Sheets(e).Columns.AutoFit
End If
Next
For Each ws In Worksheets
If ws.Name Like "*_" & ym Then
s = ws.Name
With ws
.[a1].CurrentRegion.Sort .Columns(1), 1, .Columns(5), Header:=1
x(0) = .Evaluate("min(if((a1:a50000=" & CLng(myDate) & ")*(e1:e50000=""" & wsName & """),row(1:50000)))")
x(1) = .Evaluate("max(if((a1:a50000=" & CLng(myDate) & ")*(e1:e50000=""" & wsName & """),row(1:50000)))")
If Not IsError(x(0)) Then
If x(0) > 0 Then .Rows(x(0) & ":" & x(1)).Delete
End If
If dic.exists(s) Then
With .Range("a" & Rows.Count).End(xlUp)(2).Resize(UBound(dic(s), 2), 5)
.Value = Application.Transpose(dic(s))
.Columns(1).NumberFormatLocal = "yyyy/mm/dd"
End With
End If
.[a1].CurrentRegion.Sort .Columns(1), 1, .Columns(5), Header:=1
.Columns.AutoFit
End With
End If
Next
SortSheets
Sheets(wsName).Select
End Sub
Sub SortSheets()
Dim i&, ii&, temp, n&, t&, wsList
ReDim wsList(1 To ThisWorkbook.Sheets.Count)
For i = 1 To ThisWorkbook.Sheets.Count
If Sheets(i).Name Like "*_####年##月" Then
n = n + 1: wsList(n) = Sheets(i).Name
End If
Next
If n Then
t = ThisWorkbook.Sheets.Count - n + 1
For i = 1 To n - 1
For ii = i + 1 To n
If wsList(i) < wsList(ii) Then
temp = wsList(i): wsList(i) = wsList(ii): wsList(ii) = temp
End If
Next
Next
Application.ScreenUpdating = False
For i = 1 To n
Sheets(wsList(i)).Move Sheets(t)
Next
Application.ScreenUpdating = True
End If
End Sub
Sub CopySheet()
If ActiveSheet.Name <> "配車表" Then Exit Sub
Sheets("配車表").Copy , Sheets("配車表")
With ActiveSheet
.[K2] = Date
With .Shapes(1)
.OnAction = "test"
.TextFrame.Characters.Text = "更新"
.TextFrame.Characters.Font.Bold = True
End With
.Name = GetWsName(Date)
End With
End Sub
Function GetWsName(d As Date) As String
GetWsName = "配車表 " & Format$(d, "yyyy年mm月dd日")
If Evaluate("isref('" & GetWsName & "'!a1)") Then GetWsName = GetWsName & "_" & Format$(Time, "hhmmss")
End Function
https://www.dropbox.com/scl/fi/dcu35xvf305dh4otzsz88/_ver3.xlsm?rlkey=80r1gsk9etwu98k2af5411og2&st=uics45oo&dl=0
(jindon) 2025/07/28(月) 14:42:44
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.