[[20250717101436]] 『配車表一覧を得意先ことに振り分け』(事務員) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『配車表一覧を得意先ことに振り分け』(事務員)

ご教授お願い致します。
毎日入力する配車表(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 >


Sub 転記_得意先別()

    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


開発タブって、ありますか?
開発→VisualBasic→挿入→標準モジュール へ貼り付けてください

開発タブがなければホームタブにしてからアイコンとか並んでない空いてるとこで
右クリック→リボンのユーザー設定→コマンドの選択→メインタブ→開発→追加
で、追加できます
(通りすがり) 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


jindon様

ありがとうございます。
情報入力して、オートシェイプを押すとデータは繁栄されるのですが、配車表に入力したやつが全て消えてしまいます💦
情報入力した配車表も保存したいです。
1日1枚単位で配車表は入力します。

また、入力後、仕事がキャンセルになった場合、その情報を配車表から削除すると、得意先一覧からも削除されるのでしょうか?
(事務員) 2025/07/18(金) 14:33:41


 >配車表に入力したやつが全て消えてしまいます

         Next
        .ClearContents   '<--- この行を削除
    End With
    SortSheets
End Sub

 >また、入力後、仕事がキャンセルになった場合、その情報を配車表から削除すると、得意先一覧からも削除されるのでしょうか? 

 データ配置を含めた運用方法をもう一度考え直した方がよろしいかと...
 今のデータ構成ではどんなデータが[削除]されたのかを判定するのは難しいと思いますし、シート数がやたら増えていきますよね?
(jindon) 2025/07/18(金) 14:57:33

jindon様

ご教示ありがとうございました。

>シート数がやたら増えていきますよね?

の件ですが、毎日の配車表も保存しないとダメなので、シート数が増えるのは仕方なくて(;'∀')

毎月、最終日、データ変更がない状態で【確定】を押してデータを反映させることにします(`・ω・´)ゞ

(事務員) 2025/07/22(火) 10:01:34


 >毎日の配車表も保存しないとダメなので、シート数が増えるのは仕方なくて
 データ入力シートを一枚にすればそれで済みますよね?
 キャンセルの場合もフラグを立ててその理由も保持(後に削除も出来る)

 例として

 日付 車番 乗務員 行き先 キャンセル 備考

 とでもしておけば、データは蓄積されフィルタ・ピボットテーブル機能等も使用できます。

 データ構成は最も大事な基礎です。
(jindon) 2025/07/22(火) 10:55:07

毎日、日毎シートは必要なの?
月の最後に、あれば良いの?
(通りすがり) 2025/07/22(火) 11:02:39

通りすがり様

>毎日、日毎シートは必要なの?
 月の最後に、あれば良いの?

配車表も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


日毎シートの雛形は、存在しますか?
もしなければ、日毎シートの空のシートを作成し、シート名を「雛形」としてください。
(通りすがり) 2025/07/22(火) 15:16:56

通りすがり様

' 📌 ?@ 得意先別集計マクロ
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


開発→VisualBasic→挿入→標準モジュール へ貼り付けてください

あ、一度に↑へ貼り付けて下さい

✅ マクロ実行までの基本流れ(初心者向け)

?@ 【開発タブを表示】

  - ファイル → オプション → リボンのユーザー設定 → 「開発」に✅チェック

?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


jindon様

何度も申し訳ございません。

>配車表のデータを削除、又は追加した際にもボタンをクリックすると更新します

この部分ですが、追加は反映されるのですが、削除は反映されません。
(事務員) 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


コード内の、A1をK2に修正してください。

文字置き換えで、できます

(通りすがり) 2025/07/23(水) 12:53:48


通りすがり様

ありがとうございます。

A1は何個くらいありますか?
もし、車番等項目が3行目にズレルとしたら、それも文字置き換えで対処できるのでしょうか?

1行目は➠配車表
2行目➠K2に日付
3行目➠項目
4行目〜➠データ入力

としたいです。
後々から言って申し訳ないのですが、触りながらやっているので・・・すいません。

(事務員) 2025/07/23(水) 13:07:32


Sub 得意先別転記()

    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/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


(通りすがり) 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


' ✅ 完全対応版マクロ:配車表(1日1シート)→ 得意先別1カ月シートへ転記
' 配送データの変更・削除・キャンセルに対応

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.