自分が取り組んでいる自動化の作業に行き詰っています。私はマクロの知識はありませんが、visual basicによる自動化を試みるため、Copilotさんに生成してもらったコードを利用することにしました。しかしCopilotさんが生成したコードでは実行しても、本当に実行されたのか疑わしくなるくらい、何も変化しないのです。マクロの方はちゃんと動いているそうなので、私はCopilotさんのコード、もっと言えば私の指示内容に何か問題があるのではと思っています。どうすれば私の思うように自動化できるか、良ければご教授いただけないでしょうか。
私がCopilotに記述した内容やCopilotさんのコードは以下の通りです。私が何をしたいかは以下の内容を読めばご理解いただけるかと思います。3000文字に達する長大な文章ですが、お読みいただければ幸いです。
・Copilotへの命令文
「親愛なるCopilotへ
私が行っているExcelの作業の自動化を助けていただきたい。
#このExcelファイルの特徴
シート数が100以上に上り、各シートのセルのコメントにはたくさんのテキストが記述されている。これはA国について徹底的に調べ、記事を書こうとしたからである。セルでなく、コメントに書いたのはぱっと見ですぐ確認できるようにしたかった事、メモの量が膨大であったことが理由である。
##悩み
しかしこの作業の過程で私は調べてメモするばかり行い、整理整頓をしていなかった。その結果、どこに何の解説が書かれているのか、非常にわかりづらくなってしまった。そのためメモした各項目を整理整頓したいのである。
###現在の段階
すでに各項目の名前は分類済みだ。これは名前を、セルに書き込んだり、コピーペーストする形で終わらせた。しかしコメントに書き込んだ、肝心な内容はまだ分類できずにいる。そのため私はこれをExcelの自動化を用いて手早く終わらせたいのである。
####用語
キッズ:ある一つの事柄について書かれたテキストの塊。「キッズ:(キッズの名前)解説:(解説内容)と表記されている。キッズはExceのファイルの各シートのコメントに記述されている。一つのコメントに複数のキッズが記述されている事も多い。
セルキッズ :(キッズの名前)と同じテキストが記載されたセル。なお、書体はキッズとは異なることもある。
セルキッズA 今回私が作ろうとしているもの。セルキッズのコメント欄に、セルキッズのテキストと一致する(キッズの名前)が含まれたキッズが記述されている状態。
#####目標
セルキッズAをこのExcelファイルで作れるだけ作りたい。
######自動化したいプロセスの例
#######前提条件
ここでは私がExcelで何を自動化したいのか、具体的な例を挙げた上で解説する。
なお、ここで例示するExcelはシート数が合計6つあり、
それぞれ便宜上シート1、シート2,シート3、シートx、シートy、シートzと呼称する。
シート1には3つのセルのコメント欄にキッズが含まれている。
キッズが記述されたコメント付きのセルを便宜上セルコメントと呼ぶ。
シート1にはセルコメント1,セルコメント2、セルコメント3が含まれている。
さらにセルコメント1にはキッズが三つ、セルコメント2にはキッズが4つ、セルコメント3にはキッズが1つ含まれている。
セルコメント1に含まれる三つのキッズはそれぞれキッズ11、キッズ12、キッズ13と呼ぶ。
セルコメント2に含まれる四つのキッズはそれぞれキッズ21、キッズ22、セルキッズ23、キッズ24と呼ぶ。
セルコメント3に含まれるのはキッズ31、キッズ32、キッズ33である。
シート2にはセルコメントが5つ含まれている。
それぞれセルコメント21、セルコメント22、セルコメント23、セルコメント24、セルコメント25と呼称する。
セルコメント21には3つ、セルコメント22には5つ、セルコメント23には2つ、セルコメント24は3つ、セルコメント25には2つキッズが含まれている。
セルコメント21に含まれるキッズをキッズ211、キッズ212、キッズ213と呼ぶ。
セルコメント22に含まれるキッズをキッズ221、キッズ222、キッズ223、キッズ224、キッズ225と呼ぶ。
セルコメント23に含まれるキッズをキッズ231、キッズ232、キッズ233、キッズ234と呼称する。
セルコメント24に含まれるキッズをキッズ241、キッズ242、キッズ243と呼称する。
キッズ251、キッズ252、
シート3においてはセルが一つ含まれている。
セルコメント3に含まれる1つのキッズはセルコメント31と呼ぶ。
シートxにおいてはセルキッズが6つ記載されており、それぞれのテキストは
キッズ211、キッズ213、キッズ221、キッズ232、キッズ251、キッズ243
のキッズの名前と同一である。
シートyにはセルキッズが7つ記載されており、それぞれのテキストは
キッズ13キッズ21、キッズ222、セルキッズ23、キッズ32、キッズ225、キッズ234のキッズの名前と同じである。
シートzにはセルキッズが10つ記載されており、それぞれのテキストはキッズ11、キッズ12、キッズ223、キッズ24、キッズ33キッズ、キッズ212、キッズ231、キッズ241、キッズ242、キッズ311のキッズの名前と同じである。
########プロセス
1.すべてのシートを参照する
- 今回はまずシート1に注目し、シート2とシート3への対処は後回しにする。
3.このシート1の中にコメントが含まれているセルコメントを3つ発見する。まずはセルコメント1に注目し、セルコメント2とセルコメント3は後回しにする。
4.セル1に含まれているキッズを3つ発見する。今回はキッズ11に注目し、キッズ12とキッズ13は後回しにする。
5.キッズ11の(キッズの名前)と同名のセルキッズを検索し、シートzに「キッズ11の(キッズの名前)と同名のセルキッズ」があることを確認する。
6.それが完了したらキッズ11をコピーし、シートzに移動する。そして
シートzに移動したらシートzに「キッズ11の(キッズの名前)と同名のセルキッズ」のコメントを作成し、そのコメントの入力欄に先ほどコピーしたキッズ1を張り付ける。
7.この作業が完了したら次はシート1に含まれていたセル1のコメント欄に記載されている、キッズ12とキッズ13を5.~6.と同様のプロセスでコピーペーストする。
8.さらにキッズ12とキッズ13が終了したらセルコメント2,セルコメント3に含まれているキッズを3.~6.と同様のプロセスでコピーペーストする。
9.さらにセル2、セル3のコピーペーストが終了し、シート1に含まれるセルを全て確認し終えたらシート2、シート3のセルコメントとキッズを1.~6.と同様のプロセスでコピーペーストする。
私の依頼は以上だ。君の返信には大いに期待している。
」
・Copilotさんが生成したコード
「
Sub CopyKids()
Dim wsSource As Worksheet
Dim wsDest As Worksheet
Dim comment As Comment
Dim kids As Variant
Dim kid As Variant
Dim found As Range
Dim ws As Worksheet
' すべてのシートをループ
For Each ws In ThisWorkbook.Sheets
' コメントが含まれるシートをソースとして指定
If ws.Comments.Count > 0 Then
Set wsSource = ws
' すべてのコメントをループ
For Each comment In wsSource.Comments
' コメントのテキストを分割し、キッズを取得
kids = Split(comment.Text, "キッズ:")
' 各キッズをループ
For i = 1 To UBound(kids)
kid = Split(kids(i), "解説:")(0) ' キッズ名を取得
kid = Trim(kid) ' キッズ名の前後の空白を除去
' すべてのシートでキッズ名と一致するセルを検索
For Each wsDest In ThisWorkbook.Sheets
' 同じシートを比較しないようにする
If wsSource.Name <> wsDest.Name Then
Set found = wsDest.Cells.Find(What:=kid, LookIn:=xlValues, LookAt:=xlWhole)
If Not found Is Nothing Then
' 一致するセルが見つかったらコメントを追加または更新
If found.Comment Is Nothing Then
found.AddComment
End If
found.Comment.Text Text:=found.Comment.Text & vbCrLf & "キッズ:" & kid & " 解説:" & Split(kids(i), "解説:")(1)
End If
End If
Next wsDest
Next i
Next comment
End If
Next ws
End Sub
」