今回は、 オートシェイプの文字列を一覧に出力してくれる Excel VBA の ツール を作ってみたのでシェアしますね。
こんにちは、ゆう(@ProgYuki)です。
普段仕事をする中で頻繁にExcelを使うと思うのですが、
「オートシェイプに書いてある文字列をセルに出力したい」
っていう場面ないですか?
私は今まで何度もありました。
オートシェイプは視覚的に表現したい場合には有用なのですが、データとして扱うにはとても不便なので、基本的にあらゆる場面で乱用するのはやめていただきたいわけですが、チームの中にいろんなコメントをオートシェイプ に書いて残す方とかたまにいますよね。
また、オートシェイプでフローチャートを視覚的にを作った上で、それを工程表としてデータベースのようにまとめたいってこともあると思います。
私は以前BPR(業務改善)コンサルティングの会社にいた時にプロセスフローと工程表の両方を成果物として作る必要があったので、
「オートシェイプの文字列をセルに一覧で出力できたら便利だな〜」
ってよく思ってました。
それで今結構余裕があるので、プログラミングの勉強と業務効率化を兼ねて作ってみました!
のでシェアしますね。
同じようなニーズがある方やVBAの勉強してみたい方は、この記事内にコードも全表示しているので、参考にしていただければと思います。
Excel VBA ツール : オートシェイプ内の文字列を一覧に出力する
マクロ ツール の機能、使用用途、使い方
機能
このツールの機能は、
Excel ブックに含まれる全てのシートの全てのオートシェイプの文字列を抽出して、
- シート名
- オートシェイプ名
- オートシェイプ内の文字列
を指定したセルに一覧に出力する、というものです。
使用用途
使用用途は、想定としては
- オートシェイプに記載されたコメントを一覧表示して対応の漏れをなくしたい
- フローチャートから工程表作成の手間を省きたい
てな感じです。
使い方によってはいろんなところで使えるツールだと思います。
使い方
コードをコピーする場所やプログラムの起動の仕方は後ほど説明しますが、使い方としては、
- 何かしらのオートシェイプがある状態で
- VBAプログラムを起動して
- 文字列一覧を出力したいセルを指定すると
- 自動的に文字列一覧のテーブルが作成される
という流れになります。
画像つきで示すと、
①何かしらのオートシェイプがある状態で
例として適当にオートシェイプを作ってみました。
各オートシェイプ内に書いてある文字列(text1 , text 2 ..etc)が今回セルに出力したい文字列です。
②VBAプログラムを起動して
起動の仕方はいろいろとあります。
ご自身でも調べてみると良いと思いますが、一番わかりやすい方法としては、
「開発」→「マクロ」
と進むと実行できるマクロの一覧が表示されるので、そこで今回は「shapeObjectList」という名前にしているので、それを選択して「実行」を押せば実行されます。
うまくできましたかね?
もし、何かエラー等があれば、コメントかTweetでご連絡いただけると幸いです。
③文字列一覧を出力したいセルを指定すると
今回のツールは起動するとポップアップが出てきて、出力先のセルを指定できるようにしてます。
適当なセルをクリックして指定ください。
④自動的に文字列一覧のテーブルが作成される
セルを指定した後に「OK」をクリックすれば自動的に一覧の表が作成されます。
VBA コードの表示
コードの全文は下記の通りです。
Sub accelerate() With Application .ScreenUpdating = False .DisplayAlerts = False .EnableEvents = False .Calculation = xlCalculationManual End With End Sub Sub clearAccelerate() With Application .ScreenUpdating = True .DisplayAlerts = True .EnableEvents = True .Calculation = xlCalculationAutomatic End With End Sub Sub shapeObjectList() On Error GoTo Err Dim sheets As Worksheet, i As Integer, m As Integer, O As Shape, thisSheet As Worksheet Set thisSheet = ActiveSheet Dim rng As Range Set rng = Application.InputBox(prompt:="Choose the cell to open the table", Type:=8) Dim n As Integer i = rng.Row m = rng.Column Call accelerate Done: With thisSheet .Cells(i, m).Value = "Sheet Name" .Cells(i, m + 1).Value = "Object Name" .Cells(i, m + 2).Value = "Object Texts" End With With thisSheet.Range(Cells(i, m), Cells(i, m + 2)) .Interior.ColorIndex = 48 .Font.ColorIndex = 2 .Font.Bold = True End With For Each sheets In ActiveWorkbook.Worksheets If sheets.Shapes.Count > 0 Then For Each O In sheets.Shapes thisSheet.Cells(i + 1, m).Value = sheets.Name thisSheet.Cells(i + 1, m + 1).Value = O.Name If O.Name Like "Comment*" Then thisSheet.Cells(i + 1, m + 2).Value = "-" Else If O.TextFrame2.HasText Then thisSheet.Cells(i + 1, m + 2).Value = O.TextFrame2.TextRange.Text Else thisSheet.Cells(i + 1, m + 2).Value = "-" End If End If i = i + 1 Next O End If Next sheets For n = 1 To 3 thisSheet.Columns(m).EntireColumn.AutoFit m = m + 1 Next n Call clearAccelerate Exit Sub Err: End Sub
- どこにコードをコピーすれば良いのか
- VBAマクロを使用する上での注意点
については下記の記事で詳しく書いているので、そちらを参考にされてください。
この記事もツール紹介の記事ですが、「VBA プログラムの表示」の項目の後に詳しいコピーの仕方や注意点について書いてます。
ということで本日は以上になります。
私もまだまだVBA含めプログラミングを学習中の身なので、
「もっとこうした方が効率的に書けるよ!」
「こんな業務効率化したいんだけど、VBAでできるかな?」
など、ご指摘やアイディアなどをいただけると嬉しいです!
また、Excel VBAを独学したい方向けに記事を書きましたので、興味がある方はご参考にされてみてください↓
それでは本日もお読みいただきありがとうございました。
Twitter(@ProgYuki)でも情報発信しているので、ぜひフォロー、いいね、RT等お願いします!
ゆう