Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Excel】色付きセルで繋がっている2つの結合セル同士を関連付けたい

事務作業の自動化に情熱を燃やす、しがないエンジニアです。

分かりづらいタイトルで大変恐縮ですが、
図のようなExcelの行程表があります。
・上から下へ時系列に並んでいる
・各担当の一つの作業ごとにセル結合されている
・関連するセル同士が色付きセルで結ばれている
・記載形式は【すみかっこタイトル】、下に箇条書き

ラーメン屋さんで例えるとこんな感じです。
◆図1
1.jpg

これをインプットに、「親父さん」「バイト君A」「バイト君B」という役者ごとの行程表を
自動作成することを考えています。

◆図2
親父さんの行程:
2.jpg
バイト君Aの行程:
3.jpg
・作業ごとに一つのセル
・対応する作業の番号を【すみかっこタイトル】で記す←★ここが課題★
・記載形式は【すみかっこタイトル】、下に箇条書き

ただここで曲者なのがすみかっこタイトルです。
※「【親父さん 1番】【バイト君A 2番】」などの記載
図1にて、各作業に対応するセルは色付きセルで結ばれているのみで、
どの作業が対応しているのか、関数やVBSで判別する方法が思いつきません。

実際の資料は作業が500個くらいあるので、
図1の行程表から図2の資料に自動で落とし込むことができれば
かなり楽になるのですが。。。

※言語や技術は、手作業でなくなればなんでも構いません。

Qiitaのクリエイティブな皆さんのお力をお借りしたいです。
よろしくお願いいたします。

0

2Answer

試行錯誤して作ってみて、とりあえず手元ではタイトルっぽい動きはしました。
おかしなところがあるかもしれませんが、何かのご参考にでもなれば。

Option Explicit
Sub main()
    Dim c As Range, u As Range
    Dim d 'As New Dictionary
    Set d = CreateObject("Scripting.Dictionary")
    
    For Each c In UsedRange
        If c.Interior.ColorIndex > 0 Then
            Dim e
            For Each e In d.Keys
                If Not Intersect(Range(e), c) Is Nothing Then Exit For
            Next
            If IsEmpty(e) Then
                Set u = c
                Call linegroup(u, c)
                Dim v 'As New Dictionary
                Set v = CreateObject("Scripting.Dictionary")
                For Each e In u.Cells
                    If Not IsEmpty(e) Then v(e.Address) = e.Value
                Next
                d(u.Address) = Join(v.Items, ",")
                v.RemoveAll
                Set u = Nothing
            End If
        End If
    Next
    
    For Each e In d.Items
        Debug.Print e
    Next
End Sub
Function linegroup(u As Range, c As Range)
        Dim x, y, co As Range
        For x = -1 To 1: For y = -1 To 1
            Set co = c.Offset(x, y)
            If co.Interior.ColorIndex > 0 And Intersect(u, co) Is Nothing Then
                Set u = Union(u, co)
                Call linegroup(u, co)
            Else
                If Not co.MergeArea.Address = co.Address Then
                    Set u = Union(u, co.MergeArea)
                End If
            End If
        Next: Next
End Function


1Like

Comments

  1. @ys87861

    Questioner

    コメントありがとうございます!やはりQiitaで質問して良かったです。まずは頂いたコード解析してみます!

特定の書式を見つける事はできると思いますが、それをリンクとしてデータを関連したものとして見抜くのは実に難しい気がします。

0Like

Comments

  1. @ys87861

    Questioner

    コメントありがとうございます!そうですね、、セルの内容を書式を元に全取得までは出来ていましたが、色セルの検出が課題です。

Your answer might help someone💌