『複数のシートから文字列とシート名』(こまねち)
ご教授ください。。。
複数のシートから特定の文字列とその文字列を含むシート名を一覧にする事は出来るでしょうか?
例えばですが。。。
入学式準備の資料を作ったとして、各個人名をシートとして作成し入学に必要なものリストを作ります。
各個人名のシートに「帽子」「上履き」とか。。。
その上で、「帽子が必要な子が誰で、帽子が何個必要か」とかを抽出したいです。
よろしくお願いします。
< 使用 Excel:Excel2021、使用 OS:Windows11 >
個人毎にシートを作る必要性がありますか? 最初から 縦軸に氏名、横軸にアイテムの一覧表を作成する方が早いです
個人票が必要なら、一覧表からワードで差し込み印刷しませう (´・ω・`) 2026/01/09(金) 10:57:47
一つのシートに項目が300くらいあります。
シートも100くらいになります。
シートで個人に必要なものを管理しているのですが、
項目毎に抽出出来たら良いなと思いまして。。。
(こまねち) 2026/01/09(金) 12:32:23
やりたいこと(希望)はなんとなくわかりますけど、具体的情報が欠けています。 説明不足ですね。 各シートはフォーマットが統一されているんですか?
・見出し項目に「帽子」「上履き」などがあれば、 それと各人にとって必要かどうかはどう判断するんですか? ・そうではなくて、必要なものの名称だけが列挙されているんですか? (記入するのに相当負荷がかかる印象ですけど)
新入生に必要な項目が300項目ですか。 項目の数が多いなら余計に必要性とか全体方針をきちんと検討する必要がありますね。 (xyz) 2026/01/09(金) 12:54:15
既に一人1枚のシートがあるというのと、これからひとりひとりシートを作るというのでは、 大きく作業内容が異なります。
これから作るのであれば、 データは、データベースとして機能するようにテーブルとして整理し、 個人の帳票は、データベースからレポートとして出力されるようにするのがいいと思います。
個人の帳票で管理するって、アナログ時代の紙の帳票で管理するイメージですよね この時代、もっと効率的にやる方法があると思うのです (´・ω・`) 2026/01/09(金) 14:29:20
概念だけ示すとしたらこういうことでしょうか あくまでサンプルコードなので、参考程度にご覧ください
Sub sample()
Dim words As Variant: words = Array("帽子", "上履き")
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim sh As Worksheet, cell As Range, w As Variant
For Each w In words
dict(w) = Array(0, "")
Next w
For Each sh In ThisWorkbook.Worksheets
For Each cell In sh.UsedRange
If Not IsError(cell.Value) Then
For Each w In words
If InStr(CStr(cell.Value), w) <> 0 Then
dict(w)(0) = dict(w)(0) + 1
dict(w)(1) = dict(w)(1) & sh.Name & ","
End If
Next w
End If
Next cell
Next sh
Dim r As Long: r = 1
Dim key As Variant
With ThisWorkbook.Sheets("集計")
For Each key in dict.keys
If dict(key)(1) <> "" Then
dict(key)(1) = Left(dict(key)(1), Len(dict(key)(1)) - 1)
Else
dict(key)(1) = "該当なし"
End If
.Cells(r, 1).Value = key
.Cells(r, 2).Value = dict(key)(0)
.Cells(r, 3).Value = dict(key)(1)
r = r + 1
Next key
End With
End Sub
(Asa) 2026/01/09(金) 23:59:25
・wordsのハードコードの問題 ・UsedRangeによる全セル探索の冗長さ ・wordsの個数依存のセル干渉 ・一つのシートに複数のwが存在する可能性
諸々を度外視しているコードです。 あくまでもサンプル、というのはそういう意味です。
(Asa) 2026/01/10(土) 00:07:21
たとえ話ではなく実際に沿った質問をしてください。 たとえ話だと混乱するだけです。 (父兄が希望を記入するのか、必要品は学校側が指定できないのか、 個人ごとに違うのか等、それによって話は変わってきます。)
・既に各シートは作成ずみであり、集計が今回のテーマと言うことなのか。 まずはそこを明確に。 >最初から 縦軸に氏名、横軸にアイテムの一覧表を作成する方が早いです それに対する回答に、たとえ話で応えることが間違いです。実際どうなのかを書いて下さい。 ・予め集計する文字列は決まっていて、それは既に一覧化されているのかどうか。 ・各シートには、項目だけが記載されているのか、それ以外の説明的なものも含まれているのか。 ・項目の冗長性は無いと考えてよいか。("上履き"と"上履"とか) ・マッチは完全マッチなのか、部分マッチなのか。 ・項目はどのように記入されているのか。 特定の列に固まっているのか、ランダムに散在しているのか。 ・一覧シートのレイアウトはどのようなものか。 ・シート名だけで事足りるのか、特定セルにある識別情報も必要なのか。
少なくとも 上記を明確にして、サンプルデータを提示し、 ・インプットはこれこれで、 ・こうした結果を得たい というものを、行番号・列番号が分かる形式で提示して下さい。 無論、300項目,100シートを列挙する必要はなく、構造がわかればよいのです。 (シートは3個くらい、項目は10個程度。)
質問が具体性を欠いています。回答者が逐一確認していくのではなく 質問者が自発的に必要と考えるものを提示して下さい。
(xyz) 2026/01/10(土) 07:02:10
Asaさん 回答拝見しました。
dict(w)(0) = dict(w)(0) + 1
dict(w)(1) = dict(w)(1) & sh.Name & ","
意図通りには動かないと思います。
(itemが配列でそれを更新するときは、
配列を作ってから改めて配列自体をdictにセットする必要があります。)
確認してみて下さい。
(xyz) 2026/01/10(土) 07:39:38
xyz様 いつも補足ありがとうございます そのような面倒くさい仕様があるのを失念しておりました
arr = dict(w) arr(0) = arr(0) + 1 arr(1) = arr(1) & "," dict(w) = arr
こんな感じですかね。 なんでこんな仕様になってるんですかね〜。。 (Asa) 2026/01/10(土) 14:39:38
度々すみません。arr(1) = arr(1) & sh.Name & "," でした。 (Asa) 2026/01/10(土) 17:26:42
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.