VBAでの自動化を、思い通りに行いたいです!

Anonymous
2024-12-15T13:22:44+00:00

自分が取り組んでいる自動化の作業に行き詰っています。私はマクロの知識はありませんが、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. 今回はまずシート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

開発者テクノロジ | Visual Basic for Applications

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません
{count} 件の投票

3 件の回答

並べ替え方法: 最も役に立つ
  1. simo-k 67,805 評価のポイント ボランティア モデレーター
    2024-12-15T18:38:10+00:00

    > 私はマクロの知識はありません

    インターネット、書籍などで膨大な情報がありますので、それらを元に勉強して下さい。

    基礎を理解していないとCopilotの回答が正しいかどうかなんて検証出来ないと思います。

    マクロをステップ実行して、変数の値などを含めてご自身が意図した内容になっているかを検証して下さい。

    (多分、あなたがやりたい事の言語化/Copilotの解釈の双方が間違えていると思います。)

    VBA(マクロ)の公式サポート場所は、海外コミュニティとなっています。

    有識者が集まっている所の方が、適切なアドバイスを受けやすいでしょう。

    Stack Overflow(VBA)

      [VBA プログラミングに関する質問]

      Stack Overflow には、説明的なタイトル、完全で簡潔な問題ステートメント、問題を再現する
      ための十分な詳細の要求などのガイドラインがあることに注意してください。
      機能要求または過度に広範な質問は、トピック外と見なされます。
      新しいユーザーの場合は、Stack Overflow ヘルプ センター にアクセスして詳細を確認して下さい。

    ※ 閲覧者・回答者が多い公式サポートサイトをお勧めします。

      英語で質問を送信してください。

      所謂、くれくれ君には対応してくれないと思います。

    0 件のコメント コメントはありません
  2. Anonymous
    2024-12-16T07:12:23+00:00

    端的に申し上げれば、Copilot への命令文が冗長かつ抽象的で分かりづらい印象が否めません。

    > セルでなく、コメントに書いたのはぱっと見ですぐ確認できるようにしたかった事、> メモの量が膨大であったことが理由である。

    また、お使いになっている Excel のバージョンが明記されていないため、
    ここでの「コメント」や「メモ」が、新しいバージョンの Excel における
    スレッド形式のコメントと従来形式のコメント(新しいバージョンにおける『メモ』)の
    どちらを指しているのかが分かりません。

    > #このExcelファイルの特徴> シート数が100以上に上り、各シートのセルのコメントには> たくさんのテキストが記述されている。

    ・それらのワークシート上の表のレイアウトは全て統一されているのか、
     それとも全く統一されていない(不定形である)のかについて、
     現時点では不明である。

    ・コメント/メモの挿入対象となったワークシート/セルが、具体的にどのような条件やルールに
     基づいて選ばれたのか(あるいはそんな条件やルールなどなく、ただ思いつくままに
     コメント/メモを挿入しただけなのか)について、現時点では不明瞭である。

    > すでに各項目の名前は分類済みだ。> これは名前を、セルに書き込んだり、コピーペーストする形で終わらせた。

    ・上記の分類わけの結果が、どのワークシートのどのセル範囲において
     どのような形でまとめられたのかが不明瞭である。

    > キッズ:ある一つの事柄について書かれたテキストの塊。> 「キッズ:(キッズの名前)解説:(解説内容)と表記されている。> キッズはExceのファイルの各シートのコメントに記述されている。> 一つのコメントに複数のキッズが記述されている事も多い。> シート1には3つのセルのコメント欄にキッズが含まれている。> キッズが記述されたコメント付きのセルを便宜上セルコメントと呼ぶ。> シート1にはセルコメント1,セルコメント2、セルコメント3が含まれている。> さらにセルコメント1にはキッズが三つ、セルコメント2にはキッズが4つ、> セルコメント3にはキッズが1つ含まれている。

    そのような独自の用語を定義するよりも、実際に挿入されたコメント/メモの内容と、
    最終的にどのような出力結果を求められているのかについて具体的に例示されることをお奨めします。

    0 件のコメント コメントはありません
  3. motosan 2,760 評価のポイント
    2024-12-16T22:11:30+00:00

    ヤマアラジン さま

    「Copilotさんが生成したコードでは実行しても、何も変化しない」ということですが、実行したら下記のようになりましたが、何か違うのでしょうか?

    Excel 2019 で確認しました。

    ■ 実行前

    Sheet1

    画像

    Sheet2

    画像

    ■ 実行後

    Sheet2

    画像

    ※ コメントの横幅が狭かったので広げて全部表示しました。

    Copilotさん は質問の説明で「注釈付きのコード」を良く作成できましたね!

    0 件のコメント コメントはありません