PowerQueryでコメントを利用する

PowerQueryの処理ステップにコメントを残す方法について

PowerQueryにコメントを記載することが出来ます
これはExcel数式では出来ない便利な機能です

コメントが挿入されたことを示すアイコン表示状態の画像

この画像のステップ行にコメントが加えられるとアイコンが表示されます

コメントが表示された状態の画像

コメントが作成されたステップにマウスオーバーすると、こちらの画像の様にコメントがポップアップ表示されますので画面上の邪魔になることがありません

VBAと同じくステップ数が増えると、後々確認するとなんのためのステップか分からなくなります、もう絶対なります
そんなときのためにコメントを残して置きましょう

PowerQueryでコメントを残すには2通りの方法があります

プロパティの開き方の画像

1つ目は、ステップ名で右クリックを押すと表示されるメニュー項目のプロパティです

プロパティの設定画面が表示された状態の画像

これを開くとコメント入力ができる画面が表示されます
説明というのがコメントになります
改行も気にせず書くことが可能です

詳細エディターを開くボタンの場所の画像

もう一つは、詳細エディターで編集する方法です
ホームタブにある詳細エディターをクリックすると画面が表示されます

詳細エディター画面でコメントが表示されていることを確認している画像

こちらの画像ではすでにコメントが入力されている箇所があります
プロパティで設定したコメントもここにしっかり反映されます
コメント記号についてはVBAとは違いますので注意してください

1行のコメントの場合は「//」と入力します
その後に続けてコメント文を記載します

複数行コメントの場合の入力方法の画像

複数行にしたい場合は「/*」と「*/」で囲みます
改行をどれだけおこなっても問題ない形になります

実際のところ、この詳細エディターでの編集は1つのステップに対して行う場合は必要ありません
複数のステップをまとめてコメント追記する場合にいちいち画面を設定画面を開きなおさなくて良いのでそういった場面で利用します
この詳細エディターでコメントを記載すると、実際はこのプログラムでPowerQueryが動作していることがよく感じられます

コメントはクドいくらいが丁度いいので、有効に活用してください

セル内文字列を置き換えする

セルに入力された文字列の置き換えについてのコードです(完全・部分一致)

'ABC列で部分一致の検索置換を実行する
Range("A:C").Replace What:="検索文字", Replacement:="置換文字", LookAt:=xlPart
'ABC列で完全一致の検索置換を実行する
Range("A:C").Replace What:="検索文字", Replacement:="置換文字", LookAt:=xlWhole

セル内文字列の置き換えには「Replace」メソッドを使用します
Excelの標準機能と同じように、セルに入力された内容と条件一致するものを検索して、見つかった場合に置き換えを実行する際に使用します

引数の「What」が検索対象の文字列です
置き換えする文字列は「Replacement」に指定します
この2つの指定により、任意の文字列を検索して置き換えを実行することができます

引数「LookAt」の設定で部分一致か完全一致かの選択ができます
部分一致の場合は「xlPart」を設定し、完全一致の場合は「xlWhole」と設定します
検索処理でも同じ事を言えますが引数の設定は前回実行した設定が引き継がれます
なので引数の設定は必要のない部分でも一応設定しておくほうが安心です
部分一致と完全一致が意図せず入れ替わっていたりします

完全一致とすれば、セルの中にある文字列全体が検索と全く同じ時のみ置換の対象になります
部分一致にすれば、セルの中にある文字列の一部だけを置換することが出来ますが、複数当てはまる場合は全て置換対象になる点だけ注意してください
あまりにも短い文字を検索対象にしていると、意図しない変換が行われてしまいます

マイクラ(統合版)で「Code Connection for Minecraft」を利用可能に出来た方法について

マイクラ統合版に「Code Connection for Minecraft」の接続エラーをなんとか回避できた方法について

2022年12月24日に子供の学習用プログラミングアプリの「Code Connection for Minecraft」を導入した際の話です
※Windows10環境の記事となります

前提として、Minecraft(以降、マイクラ)にはPC版の購入が必要なので無料で利用することは出来ません
以下のエディションを購入する必要があります
※「Education Edition」は教育用となり買い切りではないです

https://www.minecraft.net/ja-jp/store/minecraft-java-bedrock-edition-pc(公式サイト)
※Amazonなどでも購入可能です、同じエディションを探してみてください

またこれとは別に「Code Connection for Minecraft」も取得する必要がありますが、こちらは無料のアプリとなっており、MicrosoftStoreで「Code Connection for Minecraft」を検索すれば、すぐに見つかります

ただし、本記事執筆時点(2023年1月12日時点)において、両アプリともMicrosoftStoreから取得してもプログラミングを行うことができません
Code Connection for Minecraftがマイクラと接続が出来ないエラーが発生します
色々試しましたが、アプリの設定や修復・再インストなどではどうにもなりませんでした


接続が出来た方法を記載しますが外部Webサイトよりファイルのダウンロードを行う必要が発生しますので自己責任にて対応を行ってください

まず前提として、両アプリともバージョンを動作する古いバージョンに変更する必要があります

・マイクラ本体のバージョンを「1.18.12」にする
・Code ConnectionをStoreからではなく直接ダウンロードする


この2つを行ったところ、接続が出来てAgent君が登場するようになりました

マイクラ本体のバージョンについては「MCLuncher」を利用することで古いバージョンに更新することが出来ます
ただ接続のためであれば上記のバージョンにすればいいだけなので、Launcherをダウンロードしなくても上記バージョンのファイルをダウンロード出来るサイトも多数あるのでそちらで十分です

Code Connectionについては以下のWebサイトから直接ダウンロードすることが出来ます
https://minecraft.makecode.com/setup/minecraft-windows10

アプリを開くと分かりますがバージョンはStore配信と同じ「1.50」です
またマイクラ本体と違って、別のアプリとして認識されますのでStore取得したままの場合は起動するアプリの選択に注意してください

バージョン更新により、こんな手間をかけなくても接続できるようになるかもしれませんがアプリのコメントなど見る限り、いたちごっこになっているようなので1度起動可能環境をビシッと整えておくといいです

ちなみに、バージョンが古いとマルチプレイが出来なくなります
プログラミングはソロプレイでするものと割り切って下さい
ただ最新バージョンにすればマルチプレイが可能なので、Storeで最新バージョンに更新すれば良いです
プログラミングをする場合にはまたバージョンを戻せば良いだけです(めんどくさい話ですが)

テキストファイルを一括読み込みする

FileSystemObjectを利用して、テキストファイルを一括で読み込みを行うコードについて

'FSOの宣言
Dim bhFSO As Object, bhFSOT As Object
Set bhFSO = CreateObject("Scripting.FileSystemObject")
'指定テキストファイルを開く
Set bhFSOT = bhFSO.OpenTextFile("指定テキストファイルの絶対パス")

'開いたテキストを1つのデータに一括読み込み
Dim bhTxt As String
bhTxt = bhFSOT.ReadAll

'FSOの解放
Set bhFSOT = Nothing
Set bhFSO = Nothing

テキストファイルの文字列を1つのデータに一括で読み込みをするコードです
通常VBAでテキストファイルを読み込む場合は以下のInputステートメントを利用します

ただ、このコードの場合にはデータが配列として分割されます
たとえばテキストデータ全体で検索や置換をしたい場合にそのようなデータとなった場合配列をループでまわして検証する必要が出てきてしまいます
またあえて1セルにまとめて入力したい場面も想定されます
これは新しいテキスト関数が非常に便利になったので実務上有用です

そんな場合に記事コードを利用します
このコードを利用すると文字列変数に一括でデータを読み込むことで
全体的な処理や関数処理が行いやすくなります

指定フォルダー直下の構成を複製する

PowerAutomateDesktopを利用して、指定したフォルダー直下のフォルダー構成を複製するフローです

Display.SelectFolder Description: $'''複製をするフォルダーの選択''' IsTopMost: True SelectedFolder=> SelectedFolder ButtonPressed=> ButtonPressed
IF ButtonPressed <> $'''OK''' THEN
    EXIT Code: 0
END
Folder.GetSubfolders Folder: SelectedFolder FolderFilter: $'''test*''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Subfolders=> Folders
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
Folder.Create FolderPath: SpecialFolderPath FolderName: $'''作成用フォルダー''' Folder=> NewFolder
LOOP FOREACH CurrentItem IN Folders
    Folder.Create FolderPath: NewFolder FolderName: CurrentItem.Name
END
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: NewFolder WindowStyle: System.ProcessWindowStyle.Normal

フォルダーの選択で指定したフォルダーの直下にあるフォルダ構成をデスクトップに複製するフローです
年や月などで、同じ構成のフォルダーを作成する場合に利用します
例えば、毎月月初に担当者ごとのフォルダを作成するとか、顧客ごとのフォルダを作成するという場合です
前提として、フォルダーの中身は複製しませんので階層構造になっているフォルダーも複製は行いません
このフローの前提として、直下フォルダの構成以外は新規で利用することを想定しているからです

フロー解説

1行目:フォルダーの選択ダイアログを表示
2~4行目:IFによる選択キャンセル時のフロー終了
1~4行目のアクション

1行目は構成を複製するフォルダーを指定するためのダイアログ表示のアクションとなっています
ここで選択したフォルダーの直下にあるフォルダーを複製することになります

2~4行目は、そのダイアログで選択をキャンセルした場合の終了処理になっています
これが無いと後続で未選択時にエラーが発生します

5行目のアクション
「フォルダー内のサブフォルダーを取得」アクションの設定画面の画像
設定画面

5行目は指定したフォルダーの直下にあるフォルダーを全て取得するアクションです
ここで「フォルダーフィルター」という項目を設定することで、任意のフォルダーに制限をかけることが可能となります
例えば、直下にあるフォルダーのうちでも特別に作成したフォルダーであり複製は不要なフォルダーがある場合は、その名前で除外を行うことが可能となります
ただ所詮は名前の文字列だけでしかないので複雑な判定が必要な場合は、初期値の「*」だけにして全てを複製してから手動で削除対応を行う形となります
例の場合で言えば、「test」で始まるフォルダーを対象としています

ちなみにこの項目のうち、サブフォルダーを含めるをオンにした場合は
直下以降の階層構造全てを複製の対象には出来ますが、あまり不要かと思いますので例コードではオフとしています

6行目:特別なフォルダーを取得
7行目:フォルダーの作成
6~7行目のアクション

6行目では複製フォルダーの保存先としてデスクトップを対象とするため、デスクトップのパスを取得しています

7行目で複製フォルダーの格納用フォルダーを作成しています
同名フォルダーがあった場合は何も起きません
基本的にはここで複製したものは移動する前提のため、デスクトップに同じ名称のフォルダーは存在しない想定です

8~10行目のループによるフォルダー作成のアクション画像
8~10行目のアクション

8行目と10行目はループ処理のアクションとなっています
ここで取得したサブフォルダーの要素を全てループしています

9行目でサブフォルダーの名前で新規にフォルダーを作成して、デスクトップの作成用フォルダーの中に保管をしています
これをループにより、取得したサブフォルダーの個数分処理します

作成用フォルダーを開くアクションの画像
11行目のアクション

11行目はデスクトップに作成した作成用フォルダーをエクスプローラーで開くアクションです
デスクトップに作成しているので、探す必要はほぼ無いので蛇足のアクションではありますので削除しても問題はありません
こちらのアクションについては以下の記事で解説を行っています

指定ファイルを指定のフォルダに任意の名前を付けて保管する

指定のファイルを任意の名前に変更して保管用フォルダーに移動する処理

Display.SelectFileDialog.SelectFile Title: $'''対象ファイルを選択してください''' FileFilter: $'''TEST*.csv''' IsTopMost: True CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed
IF ButtonPressed <> $'''Open''' THEN
    EXIT Code: 0
END
File.RenameFiles.Rename Files: SelectedFile NewName: $'''OutDate''' KeepExtension: True IfFileExists: File.IfExists.Overwrite RenamedFiles=> SelectedFile
File.Move Files: SelectedFile Destination: $'''保存先の絶対パス''' IfFileExists: File.IfExists.Overwrite MovedFiles=> SelectedFile
# 以下、保存先のフォルダを開くアクションのため不要であれば削除
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: SelectedFile[0].Directory WindowStyle: System.ProcessWindowStyle.Normal

この処理は指定したファイルの名前を変更して、指定のフォルダに移動します
これの利用場面としてはWeb等から取得したcsvファイルなどをデータ保管用フォルダに格納します、さらにこの先の流れとしてPowerQueryを想定しています
PowerQueryは絶対パスで読み込み先を指定するので、この処理により前回取得時情報を更新するために活用します

この処理は1件だけの処理となっておりますが、実務上は複数のファイルを同様の操作を行うことが想定されるのでその場合はファイル数×作業頻度の度合いでかなり楽になります
さらにこの処理は最後に保管したフォルダをエクスプローラで開いていますが
これも後続作業を想定したものとなりますので不要であれば削除して問題ありません

フロー解説

1行目のファイル選択ダイアログを表示するアクションの画像
1行目のフロー
ファイルの選択ダイアログを表示のアクションの設定画面
設定項目画面

1行目は対象となるファイルを指定するためのダイアログを表示させるアクションです
このアクションの設定項目としては2項目を編集します

「初期フォルダー」ダイアログ表示時に最初に開かれるフォルダの指定です
例コードでは空白となっております、この場合は前回開いたフォルダが開かれます
Webからのダウンロードファイルを想定している場合はここをダウンロードフォルダに設定したりします

「ファイルフィルター」ここで指定した文字列がファイルの制限になります
VBAの様に拡張子の制限では無く、拡張子を含めたファイル名の制限になります
この制限はワイルドカードの利用も可能となっております
例コードの場合では頭文字に「TEST」が含まれたcsvファイルを対象としています

ここをより明確に設定することで、同じcsvファイルであってもダイアログに表示させないことが可能となるのでファイル選択間違いを抑制出来ます

ファイル名の制限をかけた状態が分かる画像
表示制限がかかった状態

この画像は左がPADで表示したダイアログ、右はエクスプローラーの画面です
今回の場合は頭文字に「TEST」となっているものが条件です
そのため、同じ個所に保存されているcsvファイルでも「Sub_20221009.CSV」が表示されていないことが確認できます

そして、ワイルドカードを利用することでダウンロードした際に日時などが追記されるファイル名となっていたとしても対象に含めることが可能です
この指定をより細かく指定すれば、ファイル名で22年10月分だけ表示する、という事も可能です

2~4行目のアクションの画像
2~4行目のアクション

2~4行目はダイアログでキャンセルをした際に処理を終了させるアクションです
ここを作成していないと後続でファイル未選択によりエラーとなります
ダイアログの開くボタンをクリックすると「Open」が返されるので、それ以外のものであれば処理は終了させています

5行目の「ファイルの名前を変更する」アクションの画像
5行目のアクション
ファイルの名前を変更するアクションの設定項目画面の画像
設定項目画面

ここで変更するのは「新しいファイル名」の1つで十分です
ここを最終的に保存をしておくファイル名を指定します
基本的に処理の流れ上、同じ場所にファイルが存在する可能性はありませんが
あった場合には上書きする設定にしています

ちなみに、このアクション以降含め生成された変数は「SelectedFile」に格納しています
これは後続処理がこのファイルを対象としているので変数をアクション数分作成する意味が無いからです
ダイアログで返された変数をどんどん上書きしていきます
また拡張子を保持する設定にしているので「.csv」は指定に含めません

「ファイルの移動」アクションの画像
6行目のアクション
「ファイルの移動」アクションの設定項目画面の画像
設定項目画面

6行目はファイルを指定フォルダに移動しています
ここで設定するのは「宛先フォルダー」です
移動先のフォルダを絶対パスで指定します
この移動の際に同じファイル名があった場合は上書きしています
処理の想定が古いファイルのデータを上書きすることなのでここは重要です

7行目「コメント」と8行目「アプリケーションの実行」アクションのフロー画像
7~8行目のアクション

7行目はコメントで、8行目は保存先のフォルダをエクスプローラーで開きます
これはこの保存後に使用するファイルが保存されているところを開くことで使用ファイルを開く手間を少し楽にする目的で追加しています
ここは完全に蛇足の処理なので不要であれば2行とも削除して問題ありません
8行目の処理については以下の記事で解説しています

印刷時のカラーとモノクロを切り替える

特定のシートの印刷時のカラーとモノクロの印刷配色設定を切り替えるコードについて

'モノクロ印刷に設定する
Worksheets("Sheet1").PageSetup.BlackAndWhite = True

「Sheet1」をモノクロ印刷にする

'カラー印刷に設定する
Worksheets("Sheet1").PageSetup.BlackAndWhite = False

「Sheet1」をカラー印刷にする

印刷を行う際にカラーかモノクロかを切り替えるには、SheetオブジェクトのPageSetup.BlackAndWhiteプロパティを利用します

このプロパティにTrueを設定することでモノクロ印刷となり
Falseを設定することでカラー印刷となります

印刷する際に確認用はモノクロで、提出用にカラー印刷を行うような場合の処理作成で活用できます
プリンターのプロパティから設定をいちいち切り替える必要が無くなります
そもそもプリンターのプロパティはVBAでは設定を変更できません

モノクロ印刷時の印刷プレビューの画面の画像
モノクロ印刷時の印刷プレビュー(設定:True)
カラー印刷設定時の印刷プレビューの画像
カラー印刷設定時の印刷プレビュー(設定:False)

上記の画像の通りで、プロパティをそれぞれに設定することで簡単に印刷時の配色設定を変更することが出来ます

この設定はページ設定になるのでプリンターでの印刷だけでなく
PDF出力に対しても有効な点は注意が必要です

利用したフォルダをエクスプローラで開く

PowerAutomateDesktopで任意のフォルダをエクスプローラで開いてウィンドウを表示します

System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: $'''開きたいフォルダ絶対パス''' WindowStyle: System.ProcessWindowStyle.Normal

エクスプローラでパスを指定して実行する

新しく追加されたDesktopフロー例に、この内容のフローがあります
その中で利用したいのがこの1行だけのフローです

フローの設定項目
設定項目画面

設定項目の「コマンドライン引数」に開きたいフォルダの絶対パスを直接していします
エクスプローラと連動はさせていないので、フローの最後に利用することが多い場面になります
途中でウィンドウが開いても処理に影響を与える可能性があります

使用例

File.GetTempPath TempFile=> TempFile
System.RunApplication.RunApplication ApplicationPath: $'''explorer''' CommandLineArguments: TempFile.Directory WindowStyle: System.ProcessWindowStyle.Normal
Display.ShowMessageDialog.ShowMessage Message: $'''%TempFile.FullName%を削除します''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
File.Delete Files: TempFile.FullName
コードをコピーして作成されたフローの画像
フローの画像

コードをコピーすると画像のように4つのアクションが作成されます

行っている処理は、一時ファイルを作成して、そのファイルのフォルダをエクスプローラで開きます
処理は停止しないので、ファイルが作成されたことを確認するためのメッセージを表示して、そのメッセージが消されたら一時ファイルは削除します

このように、Excelなどのファイル作成を行った場合に自動的にフォルダに格納するような処理だと処理が完了した後にユーザーがそのファイルを確認したい場合にフォルダをいちいち開かなくてはいけなくなります

なら、最初から作成ファイルを終了しなければ良いとの話になりますが
Automateの仕様で、Excelをフロー中に終了させないとプロセスが残ったままになることがあるのでなるべくフローで操作したExcelは終了させたいです

処理の最後にこのフォルダを開くアクションを作成しておくと、非常にファイル確認が楽になります
なくても良いけど、あるとすごく便利なアクションです

PowerQueryの接続メンテナンス

PowerQueryの接続時のパスに関してのメンテナンス方法と更新頻度設定について

PowerQueryでデータの取り込みを行う場合に、どうしても発生するのが接続のメンテナンスです
単純にリンクの更新が主になります
またcsvファイルを社内Webシステム等からダウンロードする場合は、ダウンロードの名称が毎回違っていたり、所定の位置に上書き保存をしたりする必要があります
ここに関してはショートカットをうまく使うか、PowerAutomateDesktopを活用する方法で良いでしょう

今回の記事では、リンク切れや別のcsvファイルへ参照を変更したい場合の操作について解説を行います
2種類の方法がありますので、やりやすい方法で行ってください

ソースの変更を利用

PowerQueryを開くボタンの画像
PowerQueryを開くボタン

まずはPowerQueryを開きます
取り込みデータのテーブル内にアクティブセルがある状態になれば、リボンにクエリタブが表示されます
その中の最左にある「編集」ボタンをクリックします

PowerQueryの編集画面の画像
PowerQuery編集画面

PowerQueryの編集画面が表示されたら、メニュー右側にある「データソース設定」を選択します

データソースの設定画面の画像
ソース設定画面

ブック内にある外部参照のリストが表示されます
ここで注意してほしいのが、編集中のソース以外にもここには表示されますので変更対象のソースであることを確認して、選択してから操作を進めてください
別の形式のファイルを指定してしまうと、ソースの取り込みステップにてエラーが発生します
エラー発生の場合は一度画面を変更を破棄して終了してください

変更対象を選択してから、画面下側にある「ソースの変更」を選択します

ファイル設定画面の画像
ファイル設定画面

対象ファイルの変更を行うには、ファイルパス項目の参照ボタンからファイル選択ダイアログにて変更を行います
もし、文字コードに変更があった場合はここで修正可能です
変更が完了すればOKボタンを選択します
これで対象ファイルを変更することができます

詳細エディターを利用

ファイルパスだけであれば、絶対パス文字列を直接修正する方法も可能です
※他項目も変更可能ですが、理解していないと面倒です

PowerQueryの編集画面の画像
PowerQuery編集画面

PowerQuery編集画面のメニュー左側にある「詳細エディター」を選択します

詳細エディター画面の画像
エディター画面

この詳細エディターというのは、取り込みから各ステップの全ての内部コードを直接編集することが出来る機能です
黄色にハイライトした箇所が、データの絶対パスになるのでここに対象ファイルの絶対パスを拡張子まで含めて入力を行います

他の箇所を見てみると分かるように、各設定値もここで修正は可能です
例えば「Columns=15」というのはデータから15列を取り出すという意味になるので、ここを13とかにすれば取り込む列数を変更出来ます
取り込んでから削除しても良いですが、最初に取り込む量を減らすことが出来るのでデータの更新速度向上につながります
ただあくまでも左から何列という指定なので、歯抜けにしたいとか5列目だけとかは指定は出来ません

上記2点のいずれかの方法で、リンク切れになった際は対応を行ってください

更新頻度の設定について

外部データとの更新頻度も任意に設定可能です
ただあまり頻度が多いと他の作業に影響がありますので適当に調整します
初期設定では、更新を能動的に行う必要があります

プロパティ設定を開くボタンの画像
プロパティ設定

更新を自動的に行う場合は、クエリタブの左側にある「プロパティ」を選択します

クエリプロパティを開いた状態の画像
クエリプロパティ画面

画像は初期状態の表示となっています

「バックグラウンドで更新する」
これは更新中もExcelの操作が可能となりますので、通常はオンにしておいて問題ありません
ただ、後述の自動更新を設定した場合にその更新が行われていることを明示的に使用者に分からせるにはあえてバックグラウンドで実行しない設定も可能です

「定期的に更新する」
データの更新を開いている間、一定時間ごとに更新を行います
例えばcsvファイルなどの更新頻度の低いものではなく、Web情報であったり、最新情報が欲しいExcelデータであった場合に活用できます
ただこの取り込んだデータをピボットテーブルなどで集計する場合、そちらまで自動更新されるわけでは無いので注意が必要です

「ファイルを開くときにデータを更新する」
ブックオープン時に更新を行います
データの取得が目的のファイルであれば有効にしておくと良いです
前回開いた時点のデータを確認した場面も多々あり得るので、基本はオフで問題は無いでしょう
サブオプションの「ブックを保存する前に外部データ範囲からデータを削除する」をオンにすることで取り込んだデータを保存しないのでファイルサイズの軽量化を行えます
あまりにも大きいデータの取得を行っている場合は有効です

「すべて更新でこの接続を更新する」

すべて更新ボタンの位置の画像
すべて更新ボタン

すべて更新というのは、データタブの真ん中くらいにある画像のボタンです
これをクリックすると、ブックに含まれるピボットテーブルや接続などの再更新を行います
このオプション設定は、これをクリックしたときに更新を有効とするかどうかの指定です
名前の通り、すべて更新したいときに使用するボタンなので、なるべくこの設定はオフにしない方が混乱はしないと思うのでそのままオンの設定で問題ありません

VBAの場合だと、エディター画面を開いて、プロシージャを探して、パスの箇所を見つけて修正、となるのでメンテナンス工数は圧倒的に違います
接続関係のVBAは無くなりますね、こりゃ

PowerQueryについて

Excel2016以降で利用可能なPowerqueryの活用について

Excelの基本機能にPowerQueryという機能があります
この機能は外部データ(内部も可能)をテーブルとして取り込む機能です
この機能では取り込みを行う際のフィルターや並べ替えなどを含め記録することができます
それを記録しておくことで、定期的に外部データを取り込む際に効率化を図ることができます

多くの場合の取り込みデータはcsvか別ブックのデータになると思います
この機能の制約としてはテーブルとして出力されるため、取り込み先も表形式のデータになっていることが重要になります
ある程度は操作によって調整することが可能ではありますが、同じルールで作成が続けられることが前提となります
この機能を有効的に利用するなら、取り込み元もきれいに整えておくことをおすすめします
ただしcsvであれば、データの形式はきれいにそろっているのでそこはあまり気にしなくても大丈夫です
別ブックのデータを取得する際に特に重要です

Powerqueryを開くために、csvファイルを取り込む手順の画像
PowerQueryを開くための操作

まずPowerQueryを利用するにはデータの取り込み作業が必要となります
その取り込みの際に利用するのが、PowerQueryです
上記の画像の手順ではcsvファイルを取り込む際の流れになっています

  • リボンメニューから「データ」タブを選択
  • 「データの取得」を選択
  • 「ファイルから」を選択
  • 「テキストまたはCSVから」を選択
    ⇒取り込みたいcsvファイルを選択してください

今回の記事では郵便番号一覧のCSVデータを利用しています
日本郵便株式会社 – 郵便番号データダウンロード

Powerqueryの前に表示される取り込みデータのプレビュー画面の画像
PowerQuery前の画面

ファイルを選択すると、そのデータから自動的にデータが表形式に作成されてプレビュー表示されます
この画面の右下にある「読み込み」ボタンをクリックすると、新しいシート・テーブルが作成されてそこにデータが読み込まれます

約12万5千レコードが読み込まれた状態になっていると思います
このようにcsvファイルの取り込みは格段に簡単になっています

さらにcsvファイルでよくあるのが文字コードの不一致による文字化けです

文字コードを変更した場合の動き

これに関しては、このプレビュー画面の左上にある「元のファイル」という選択ボックスから文字コードを指定することで簡単に変更が可能です
プレビュー表示もされているので、正しい文字コードも選んでいけば分かります

ただここまでではPowerQueryの活用ではありません
この取り込んだデータの加工を、取り込む時点で加工するのがPowerQueryの機能となります

郵便番号一覧のデータでは郵便番号の列は全て数値になっていることが分かると思いますが、これは数字では無く決まった文字数のコードなので、どちらかというと文字列で取得をする方がデータに即しています
そこでPowerQueryを利用して郵便番号列は文字列に型を変更することが可能です

Powerquery画面で型変換の手順画像
PowerQuery画面から型変換を行う
  • テーブル範囲にアクティブセルを置いた状態で表示される「クエリ」タブを選択
  • 「編集」を選択 - PowerQuery画面が表示される
  • 変換したい列の見出しの左側にある個所をクリックすると型変換が行える
  • 「テキスト」を選択
  • 「現在のものを置換」を選択
Powerqueryにおいて、列の型変換をして取得されたデータが変更された状態の画像
型変換後のデータ状態

上記の手順を行うと、こちらの画像の様にデータが文字列型に変換されます
数値となり除外されていた頭の0が付与されていることも確認できます
単純にExcelでcsvファイルを開いたときは、この0が無くなるのがよくある注意点でしたがPowerQueryで取り込みを行えば次回以降は意識する必要が無くなります

変換作業が完了したら再読み込みを行うためのボタンの画像
操作の確定を行うボタン

変換作業が完了したら、PowerQueryの画面の左上の「閉じて読み込む」の画像の箇所をクリックするとその設定で再度csvファイルのデータを読み込みます
この操作は記録されているので、次回以降はPowerQueryの画面を開く必要は無くデータの更新を行うだけでこの作業が実行されます

PowerQueryの注意点はファイルへのリンクは絶対パスを利用している点です
フォルダ構成やファイル名などが変更になった場合はリンク切れとなり、データの更新が出来なくなります
VBAのような相対パスの概念は無いので注意してください
ここは環境によっては少し不便かもしれませんが、パスの修正自体はそれほど難しくは無いので割り切っておいて大丈夫です
普通に数式で外部参照している場合も同様ですし、それらより圧倒的にメンテナンスしやすいです

型変換に関しては、他にもいろいろな型があるのでリストを確認しておいてください
それと同じくらい強力なのがフィルタ処理です
取り込んだ後に必要なデータにフィルタ機能を利用してフィルタをかける作業がある場合は、そのフィルタ条件も取り込みの時点で指定することが可能です
1列など、切り替えが多い場合は逆に必要ないかもしれませんが
複数列などで条件立てをする場合は強力です

Powerquery画面でフィルター設定を行う手順の画像
フィルター設定手順

フィルタの手順については、通常のフィルタ機能と大きな違いはありません
各列の見出しにある▼ボタンをクリックすることで、条件の設定が出来ます

フィルタ設定画面の画像
フィルタ設定画面

特殊条件として便利なのが、この「空の削除」です
これを指定した列にある空白のレコードは除外されます
例えばコードが無いデータは不要なので、その列でこの設定をすることで不要なデータの取り込みを行わないようにできます

注意点としては、このPowerQueryの画面では全てのデータが読み込まれていないので
フィルタの選択項目がデータの全てになっていない
可能性がある点です
また取り込み元のデータのリストも、この手順作成時点と同じであるかどうかも分からないのでなるべく条件設定は抽象的な方がメンテナンスは減らせます
上記の画像例では、市町村以下の列で「オオサカシ」が含まれたものを指定しています
こうすることでデータの取り込み量を減らすことが出来るのでファイルサイズを無駄に大きくせずに済みます
これはこの後に行う、関数や作業の際にファイルの動作に影響を与える部分なので
可能な限りこのPowerQueryでデータを減らすことをお勧めします

また、Microsoftの推奨としてPowerQueryのステップもレコードを減らすものをなるべく上位にすることがあります
ステップの順番は、作業を行った順番に登録されていきます
例えば、今回の記事解説順で行くと以下の順番になっています

  1. データの取り込み
  2. 郵便番号列の型をテキスト型に変更
  3. 市町村列で「オオサカシ」を含むものにフィルタ設定

この手順で言うと、レコードの数を減らすのは3の手順となります
このフィルタによって1,200レコードほどになりますので100分の1ほどになります
これを2の手順にすることで、型変換の処理を行うレコード数を減らすことで読み込み速度の向上が見込めます
ステップの順番はドラッグするだけで簡単に行えます

ステップの修正

またステップの文字にマウスを移動させると、左側に×ボタンが表示されます
これをクリックすることでステップの削除も行えます

ステップの移動については、移動先との矛盾に注意が必要です
例えば今回の記事で行くと、上記の手順2で文字列に変更しています
その変更を前提として、郵便番号列で「011」で始まるものなどでフィルタ設定を行った場合にフィルタを移動させるとエラーとなります
なぜなら、型変換前は数値型のため「011」という文字列でフィルタ設定を行うことが出来ないためです
この場合にはエラーがちゃんと表示されるので、その場合は諦めるかステップを修正します
修正する場合は、ステップの文字列をwクリックすれば設定画面が表示されます

最後にPowerQueryとは直接の関係はありませんが、この機能を最大限活用するためにテーブル機能も活用します
と、いうのもテーブル機能というのは自動的に行が拡張されていきますが、その際に数式の入力された列の場合はその数式も自動的に拡張された行に反映されることを活用できます

実はPowerQueryで自動作成されたテーブルの最左列に追加を行っても読み込みに影響を与えません
これを利用します

テーブルに列を追加した場合の画像
追加した列

このcsvファイルのデータ列数は15列となります
その左に住所の文字列を結合したセルを作成してみます
画像の様に単純に行の各列を&で結合しただけの関数です

テーブル機能のおかげでデータの取り込み数によって自動的に増減するので、関数の行数を調整する必要もありません
またデータの取り込みを完了した時点で関数の結果も計算されています

もし、これまでcsvファイルをテキストコピーして貼り付け-データの分割でデータを作成-フィルタ機能で条件抽出-関数を作成して行数分オートフィルする
というようなよくある手順を踏んでいた場合は、データの更新を行うだけ(ワンクリック)でこの作業が完了してしまいます

この様にPowerQueryとテーブル機能と関数の組み合わせで、データの取り込みから加工までを設定で行えるためVBAをこれのために組んでいるなら早々にこちらへの切り替えをおすすめします
VBAのメンテナンスより遥かに簡単ですから