ExcelにてA(1006)シートのC2~21、E2~21 G2~21 I2~21 K2~21セルに打ち込まれた内容に対して特定の文字を認識した場合それぞれのシートにその情報を転記し整理したいのですがお力をお貸しくださいませんか?具体的にはA(1006)シート それぞれ上記に打ち込んだ情報のうちA(2)やB(2)の記載共通した(2)があれば別シート2階シートの9:10~9:50の枠内等各時間に対応した大きなセル内に詰めて転記したい同じようにA(3)B(3)であれば同じように共通した(3)の記載があれば別シート3階の各時間のセル内に詰めて整理したい4階セルも同様また最後に全表シートには上記2階、3階、4階などで整理できたシートを参照してそれぞれ同じ時間の枠に詰めて整理してセル内に整理したいといった趣旨です。どなたかマクロや関数に詳しい方いらっしゃいましたらお教えいただけますと幸いです。非常に困っております。なお動作環境はオフィス2019です。

Excel

1件の回答

回答を書く

1140541

2026-02-11 09:10

+ フォロー

一応、作成してみましたが、要件が不明瞭なので、違っていたら、ごめんなさい。その場合は、諦めるか、適宜に修正してください

◆前提条件

・A(1006)シートをアクティブにした状態で実施してください。

・「x階」の各シートは、A列と1行目の「構成」および「値」は同じものとします。

・「全表」シートの全セルを一旦削除します。

・「日付」や「時刻」にみえるセルは、日付・時刻書式で設定されているものとします。つまり、Excel認識の日付・時刻です。

・対象セルに「色付け」しています。ダメであれば、コメントにしてください。



Sub sample()

Const s階 As String = \u0026quot;2階,3階,4階\u0026quot; ''対象階

Dim ws As Worksheet, sFloor As String, sFloorMsg As String

Dim iLastRow As Long, sDayOfWeek As String, ii As Long, jj As Long



''各階の初期化する。

For Each ws In Sheets(Split(s階, \u0026quot;,\u0026quot;))

''各階の既存値をクリアする。

With ws.Range(\u0026quot;A1\u0026quot;).CurrentRegion

.Offset(1, 1).Resize(.Rows.CountLarge - 1, .Columns.CountLarge - 1).ClearContents

End With

Next ws

Set ws = Nothing



''各階に設定する。

sFloorMsg = \u0026quot;\u0026quot;

iLastRow = Cells(Rows.CountLarge, \u0026quot;B\u0026quot;).End(xlUp).Row

For jj = 3 To Cells(1, Columns.CountLarge).End(xlToLeft).Column Step 2

sDayOfWeek = Format(Cells(1, jj).Value, \u0026quot;aaa\u0026quot;)

For ii = 2 To iLastRow

If Cells(ii, jj).Value Like \u0026quot;*(*)*\u0026quot; Then

''階数を求める。

With Cells(ii, jj)

sFloor = Mid(.Value, InStr(.Value, \u0026quot;(\u0026quot;) + 1)

sFloor = Left(sFloor, InStr(sFloor, \u0026quot;)\u0026quot;) - 1) \u0026amp; \u0026quot;階\u0026quot;

If InStr(\u0026quot;,\u0026quot; \u0026amp; s階, \u0026quot;,\u0026quot; \u0026amp; sFloor) \u0026gt; 0 Then

If 階設定(ThisWorkbook.Sheets(sFloor), .Offset(, -1), sDayOfWeek) Then

.Interior.Color = RGB(221, 235, 247)

Else

sFloorMsg = sFloorMsg \u0026amp; \u0026quot;,\u0026quot; \u0026amp; Cells(ii, jj).Address(False, False)

.Interior.Color = vbYellow

End If

Else

sFloorMsg = sFloorMsg \u0026amp; \u0026quot;,\u0026quot; \u0026amp; Cells(ii, jj).Address(False, False)

.Interior.Color = vbYellow

End If

End With

End If

Next ii

Next jj



''全表に集約する。

If sFloorMsg = \u0026quot;\u0026quot; Then

Call 全表作成(s階)

MsgBox \u0026quot;処理が終了しましたm(__)m\u0026quot;, vbInformation

Else

MsgBox \u0026quot;「\u0026quot; \u0026amp; Mid(sFloorMsg, 2) \u0026amp; \u0026quot;」のセルが処理できません!!\u0026quot;, vbExclamation

End If

End Sub



Private Function 階設定(ByVal ws As Worksheet, ByVal rBase As Range, ByVal sDayOfWeek As String) As Boolean

Dim vTimes As Variant, rg As Range, iCount As Long, ii As Long, jj As Long



''階数を求める。

階設定 = False ''省略値



''曜日列を抽出する。

On Error Resume Next

jj = 0

jj = Application.WorksheetFunction.Match(sDayOfWeek, ws.Rows(1), 0)

On Error GoTo 0

If jj \u0026lt;= 0 Then

MsgBox \u0026quot;「\u0026quot; \u0026amp; ws.Name \u0026amp; \u0026quot;」シートに「\u0026quot; \u0026amp; sDayOfWeek \u0026amp; \u0026quot;」曜日がありません。\u0026quot;, vbExclamation

Exit Function

End If



''時間行を抽出する。

ii = 2

Do While ii \u0026lt;= ws.Cells(ws.Rows.CountLarge, \u0026quot;A\u0026quot;).End(xlUp).Row

With ws.Cells(ii, \u0026quot;A\u0026quot;)

vTimes = Split(.Value, \u0026quot;~\u0026quot;)

If rBase.Value \u0026gt;= TimeValue(vTimes(0)) And rBase.Value \u0026lt;= TimeValue(vTimes(1)) Then

ii = ii + ws.Rows.CountLarge

Else

ii = ii + .MergeArea.Rows.CountLarge

End If

End With

Loop

If ii \u0026lt;= ws.Rows.CountLarge Then

MsgBox \u0026quot;「\u0026quot; \u0026amp; ws.Name \u0026amp; \u0026quot;」シートに時刻「\u0026quot; \u0026amp; Format(rBase.Offset(, -1).Value, \u0026quot;hh:mm\u0026quot;) \u0026amp; \u0026quot;」がありません!!\u0026quot;, vbExclamation

Exit Function

End If



''「時間行、曜日列」にデータを設定する。

ii = ii - ws.Rows.CountLarge

Set rg = ws.Cells(ii, jj).Resize(ws.Cells(ii, \u0026quot;A\u0026quot;).MergeArea.CountLarge, ws.Cells(1, jj).MergeArea.CountLarge)

iCount = Application.WorksheetFunction.CountA(rg)

If iCount \u0026gt;= rg.CountLarge Then

MsgBox \u0026quot;「\u0026quot; \u0026amp; ws.Name \u0026amp; \u0026quot;」シートの「\u0026quot; \u0026amp; rg.Address(False, False) \u0026amp; \u0026quot;」セル範囲に設定できません!!\u0026quot;, vbExclamation

Exit Function

Else

rg(iCount + 1).Value = rBase.Offset(, 1).Value

階設定 = True

End If

Set rg = Nothing

End Function



Private Sub 全表作成(ByVal s階 As String)

Dim sh As Worksheet, ws As Worksheet

Dim iColumCount As Long, rLastRow As Range, rg As Range

Dim rSetRow As Range, ii As Long



''タイトル行を設定する。

Set sh = ThisWorkbook.Sheets(\u0026quot;全表\u0026quot;)

sh.Cells.Delete

With ThisWorkbook.Sheets(Split(s階, \u0026quot;,\u0026quot;)(0))

.Rows(1).Copy sh.Rows(1)

sh.Range(\u0026quot;A1\u0026quot;).EntireColumn.Insert

sh.Range(\u0026quot;A1\u0026quot;).Value = \u0026quot;時刻\u0026quot;

sh.Range(\u0026quot;B1\u0026quot;).Value = \u0026quot;階\u0026quot;

Set rLastRow = .Cells(.Rows.CountLarge, \u0026quot;A\u0026quot;).End(xlUp)

iColumCount = .Cells(1, .Columns.CountLarge).End(xlToLeft).Offset(, 1).Column - 1

Set rg = .Range(\u0026quot;A2\u0026quot;)

End With



''各階データをコピーする。

Set rSetRow = sh.Range(\u0026quot;B2\u0026quot;)

Do While rg.Row \u0026lt;= rLastRow.Row

For Each ws In ThisWorkbook.Sheets(Split(s階, \u0026quot;,\u0026quot;))

ws.Cells(rg.Row, \u0026quot;A\u0026quot;).MergeArea.Resize(, iColumCount).Copy rSetRow

rSetRow.Offset(, -1).Resize(rg.MergeArea.CountLarge).Value = rSetRow.Value

rSetRow.Value = ws.Name

Set rSetRow = rSetRow.Offset(1)

Next ws

Set rg = rg.Offset(1)

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有