VSCodeのエクスプローラで隠しフォルダを表示する方法

VSCodeのエクスプローラでは、[.]で始まるフォルダやfiles.excludeで除外されているフォルダはデフォルトで非表示になっている。

以下、それらを表示させる3つの方法。


方法1: GUIの設定画面から変更する

  1. Ctrl + [,] で設定画面を開く

  2. 検索ボックスに files.exclude と入力

  3. 表示させたいパターンの右にある をクリックして削除


方法2: settings.json を直接編集する

  1. Ctrl + Shift + [P] でコマンドパレットを開く

  2. Open User Settings (JSON) を選択

  3. files.exclude の該当パターンを false に変更する


"files.exclude": {

"**/.git": true,

"**/.svn": true,

"**/.hg": true,

"**/CVS": true,

"**/.DS_Store": true

}

例えば .git フォルダを表示したい場合は、"**/.git": truefalse に変える。


方法3: ワークスペース単位で設定する

ユーザー設定ではなく、特定のプロジェクトだけに適用したい場合は、プロジェクトルートの .vscode/settings.json に設定を記述する。


{

"files.exclude": {

"**/.git": true

}

}

こうすることで、他のプロジェクトに影響を与えずに設定を変更できる。


まとめ

方法 適用範囲 難易度
GUIの設定画面 全プロジェクト共通 簡単
settings.json(ユーザー) 全プロジェクト共通 普通
settings.json(ワークスペース) 特定プロジェクトのみ 普通


方法1で削除したらパターンを追加ボタンで設定を復活することができる。


それには設定文字列を覚えておく必要があるが、忘れた場合は方法2falsetrueに変えるだけで済む😎

VALUESテーブル???

VALUESのテーブルって何よ❓

魔クロード(Claude)から発せられた見たこともないSQL文をメモ(SQL Server)。


SELECT
    E.経費ID, COUNT(M.経費ID) 行数
FROM
    (VALUES (101), (102)) E(経費ID)
LEFT JOIN
    経費明細 M ON E.経費ID = M.経費ID AND M.取引NO = 'ABC0123'
GROUP BY
    E.経費ID
	

この構文は テーブル値コンストラクタ(Table Value Constructor) と呼ばれ、一時的なテーブルを作成するのに便利。


構文の仕組み

(VALUES (値1), (値2), ...) エイリアス(列名) という形式で、その場でテーブルを生成できる。

  • VALUES句: データの中身
  • エイリアス: テーブルの別名(必須)
  • 列名: カラム名の指定(省略すると勝手にセットされる)


何が嬉しいのか

従来のIN句では「存在するデータ」しかカウントできない。

SELECT 
    経費ID, COUNT(*) 行数
FROM 
    経費明細
WHERE 
    取引NO='ABC0123' AND 経費ID IN(101,102)
GROUP BY 
    経費ID

これだと、例えば、経費ID=102のデータが0件の場合、結果に現れない。

テーブル値コンストラクタを使えば、0件のデータも含めて集計可能


使用例


  • 複数列のデータを定義

SELECT 
    E.経費ID,
    E.経費名,
    COUNT(M.経費ID) 件数
FROM
    (VALUES 
        (101, '手数料'),
        (102, '保管料')
    ) E(経費ID, 経費名)
LEFT JOIN
    経費明細 M 
ON 
    E.経費ID = M.経費ID
GROUP BY
    E.経費ID, E.経費名
  • マスタデータがない時の簡易集計

SELECT 
    W.番号,W.名前,
    COUNT(B.注文日) 件数
FROM
    (VALUES 
      (1, '日'),
      (2, '月'),
      (3, '火'),
      (4, '水'),
      (5, '木'),
      (6, '金'),
      (7, '土')
    ) W(番号, 名前)
LEFT JOIN
    注文 B 
ON 
    DATEPART(WEEKDAY, B.注文日) = W.番号
    AND B.注文日 >=  '2026-01-01' 
    AND B.注文日 <  '2026-02-01'
GROUP BY
    W.番号,W.名前
ORDER BY
    W.番号

これは2026年1月の曜日ごとの注文件数を集計している。データベースには存在しない曜日テーブルを一時的に作って集計。

DATEPART関数は引数WEEKDAYなら曜日の番号を返す(日本では日曜が1)。


まとめ

  • 一時的なマスタデータを作りたい時に便利
  • 0件も含めた集計が簡単にできる
  • マスタテーブルを作るほどでもないデータに最適


知らなかったSQL、意外と使い道がありそうだ。
それにしても魔クロード👾は神だな。ありがとう。

ディクショナリ配列

ディクショナリに限ったことではないがオブジェクト配列の初期化方法がパッと頭に思い浮かばなかったのでメモ。

元々のコードは以下のとおり。

Dim dic(3) As New Dictionary

この書き方はdicNothing判定ができないことを知り、自分の中ではNGの書き方となった。

そこで納期に追われて焦りながらこう書き替えた。

Dim dic(3) As Dictionary: Set dic(3) = New Dictionary

これだと実行時エラーとなる。デバッグすると4つ目の要素以外はNothingとなっていた。

魔クロードに解決方法を尋ねると以下のとおり。

Dim dic(0 To 3) As Dictionary, i As Long
For i = 0 To 3
    Set dic(i) = New Dictionary
Next
  • ディクショナリ配列各要素の初期化は愚直にNewを繰り返すこと
  • 配列宣言はToを使うことで意図が明確になる


宣言について、おっしゃるとおり納得です。これからは取り入れます。

ありがとう魔クロード👾

Excelに想うこと


これは Excel Advent Calendar 2025 の20日目です。


無理を承知で、Excelにあったらいいなと想う機能を並べてみた。


1. 列見出しを自由に設定できればなあ

列見出しのA、B、C、.. を自由な文字列に書き替えられたら、ワークシートがデータベースのテーブルそのものって感じになるのだが🧐


2. サブグリッドを埋め込めたらなあ

表の下に違う列幅の表をおければ、方眼紙シートはこの世の中から抹殺できるのだが💀


3. CSVをありのまま表示できたらなあ

ゼロ埋め数字を勝手にただの数値に変換しないでくれ💢
おせっかい変換を無しに設定できればいいのだが


4. イルカが復活しないかな

Copilotに顔があってもいいじゃないか、、、🌞🥃
君はもう邪魔者なんかじゃない。今こそリベンジの時だっ‼️


元祖カイル君🐬と2025年のイケメンなカイル君✨


懐かしの冴子先生🧡と2025年のセクシー3D冴子先生💋




以上、画像はすべてGeminiくん作でした🎄🎄🎄🎄🎄🎅🏻



初心者から強者までが集うExcelコミュニティがこらち



VBAとわたし

これは VBA Advent Calendar 2025 の15日目です。

この記事はVBAと自分がどう関わってきたを振り返る、ポエム的な内容となっています。

長らく放置していた自分のブログをこの機会に再開します。(って過去記事少ないなあ😅)


Excel VBAとの出会い

わたしがExcelを使い始めたのはWindows95が出る前、Windows3.1の頃でした。

当時わたしが勤めていた会社ではパソコンと言えば、Windowsですらない、NECの白黒ブラウン管モニタのワークステーションでした。そのワークステーションにLANPLANという表計算ソフトが搭載されていて、カタログ機能というもので処理の自動化をすることができました。それはVBAのようなプログラム言語ではなく、自動化できる処理が予め決まっていて、それを組み立てていく感じのものでした。
当時の業務の一つとして倉庫保管台帳などの書類作成をタイプライターで行っていました。ミスタイプをしないように慎重に打ち込むのは神経を使う面倒な作業でした。面倒くさがりのわたしは、それを表計算ソフトに打ち込んだデータを使ってドットプリンタで印字作成できるようにしました。
このとき、パソコンの便利さや表計算ソフトの可能性に気づきます。

部署異動後、会社からWindows3.1のパソコンが貸与され、そこにインストールされていたMicrosoft Officeの中の表計算ソフトがExcelでした。

LANPLANのカタログ機能のようなものが無いかと真っ先に調べ、ここで初めてVBAと出会います。

入門書を買ってイミディエイトペインを知り、MsgBoxを表示させたときの驚き、「これは何でもできる化け物ソフトだ‼️」と直感し、ワクワクしたのを今でもハッキリと覚えています。


プログラミングに目覚めるも苦難の日々

それからはExcel VBAを使って様々な業務ツールを作成しました。Accessも抵抗なく覚え、フォームで業務アプリ的なものを何本も作りました。

VBAを手掛かりにプログラミングに興味を持つようになり、C言語やVisual C++に手を出して挫折、.NET Frameworkの登場でVB.NETとC#に傾倒していきます。ただし、それは趣味の範囲で、会社の業務が鬼のように多忙となり、土日はパソコンなど見たくもないような状態が長く続きました。当時はどこの会社もサービス残業が当たり前、今の基準で言うとブラック企業が普通にあちこちに存在してましたからね😅

そんな中でも、会社においては身の回りの非効率な事務仕事をExcel VBAやAccessで作った業務ツールで一つずつ変えていきました。
上司に頼んでSQL Server付きのオンプレWindowsサーバーを導入してもらったのが2005年頃でした。それまでのショボいAccessのmdbファイル(accdbの前のAccessのDBファイルです)から本物のDBに変わり、複数人の同時アクセスも問題なくできるようになりました。リンクテーブルを使えばAccessで作ったフォームやレポートも使えます。取引ごとに連番を振ってそれを名前とするフォルダを自動生成するVBAを書き、紙のファイルを電子化しました。
これにより、当時部内の壁一面を覆いつくしていた紙ファイル用キャビネットを一掃したのは、わたしの一つの功績となりました。

気が付くと、今まで作ってきたVBA業務ツール群が部内だけでなく全社を巻き込んだDB連携の業務システムにまで成長していました。

正に属人化を絵にかいたような状況ですが、他人が作ったVBAを自分たちで管理する気持ちなどかけらもない情シスからは煙たがられつつも、現場からの受けの良さには逆らえず、黙認された状態で今に至ります。


副業の開始と属人化からの本気の脱却

時代が変わり、リモートワークが制限付きとは言え認められたり、残業も付くようになり、サービス残業がほぼ無くなりました。
年次を重ねて多忙な仕事から解放され、今はIT系の担当ということで業務改善の為に好きなことをやらさせていただいています。

更に時代の流れから副業が認められるようになり、そんな折にX(Twitter)でとある企業の方からDMでVBAの仕事の依頼を受けました。

これは青天の霹靂でした。

この状況を聞きつけた転職した元社員からも依頼を受けたりと、本業の落ち着きとは正反対に、にわかに日常が忙しくなり始めます。

VBAは言語仕様が古く、単にExcelというアプリの機能でしかないと、正直少し蔑むような気持ちがありましたが、お金が稼げるようになり、見方が大きく変わりました。

一方で、これも時代の流れか、会社も属人化を放置するわけにはいかず、わたしの業務システムのクラウド化を本気で行うことになったのです。

今はこの業務システムの基本設計を開発会社さんと共に行っています。わたしより二回りぐらい若いエンジニアの方々を相手に、こちらの下手くそな説明が中々伝わらず、要件定義を含め膨大な時間がかかる作業で、システム作りの難しさを感じているところです。
完成予定は2027年の春先、皆に支持される便利なものが作れるのか、また世の中の変化に対応できるのか、あー心配だ。


Excel-Fun での交流とこれから

VBAを見直すきっかけはもう一つ、Excel-Funへの参加でした。

いつもX(Twitter)でお見掛けするVBAerの方々とのDiscordやZoomでの交流(Zoomでは殆ど黙ってますけどね😅)は刺激をいただきました。

ご自身の膨大なVBAライブラリをお持ちの方、VBA周りのコアな技術に詳しい方、VBAだけで生計を立ててる方、VBAの記事を発信しまくる方、などなど、VBAについては自分が第一人者だと思っていましたが、まったくそんなことはないと実感しています。

副業の開始とコミュニティへの参加から、より一層VBAと触れ合う機会が増えましたが、今や急速に成長する生成AIの時代です。果たしてこれからExcel VBAの世界に未来はあるのでしょうか❓

わたしとしては、Excel VBAはまだまだ使い続けられるんだと思っています。

今関わっているシステム開発の体験からすると、システム化とはそんなに簡単なものではなく、この世の中が1年やそこらで変わるとは到底思えなくなったからです。

身近な困りごとを短時間で解決できるVBAは、今後も重宝され続けることでしょう。

IT系への好奇心旺盛なわたしは、新しいことにも興味を持ちつつ、Excel-Funの皆様を始めとする世間の方々に自分のできる情報発信をしながら、これからもVBAと戯れたいと思っています😆


Discord | 🌏総合案内 | Excel-Fun.xls*


ワークシートを明示しないRangeオブジェクトの参照先

プロシージャの中でワークシートを明示せずにRangeオブジェクトを使った場合、どのワークシートのRangeオブジェクトが参照されるかの実験。

Sheet1とSheet2の各々のセル 'A1' に '名前' という名前のNameを作る。


Sheet1.Names.Add Sheet1!名前, =Sheet1!$A$1
Sheet2.Names.Add Sheet2!名前, =Sheet2!$A$1


そして、Sheet1モジュールに下記のプロシージャを書き、実行する。


Public Sub TestSheet1Proc()

    ' (1)
    Debug.Print Range("A1").Parent.Name
    ' (2)
    Debug.Print Cells(1, 1).Parent.Name
    ' (3)
    Debug.Print Range("名前").Parent.Name

End Sub


イミディエイト・ウインドに 'Sheet1' が3行出力される。
Sheet2モジュールのプロシージャから Sheet1.TestSheet1Proc を呼び出して実行したらどうなるか?
結果は変わらず、'Sheet1' が3行出力される。
ThisWorkbookモジュールからでも同様。

TestSheet1Proc を標準モジュール又はThisWorkBookモジュールにコピペして実行した場合、どうなるか?
結果はアクティブ・シートが何かで異なる。

Sheet1がアクティブの場合、'Sheet1' が3行出力される。
Sheet2がアクティブの場合、'Sheet2' が3行出力される。
Sheet3がアクティブの場合、'Sheet3' が2行出力されるが、(3)でエラーとなる。

Sheet3に '名前' という名前のNameを作ればこのエラーは出なくなる。

シート・モジュール内でワークシートを明示せずにRangeオブジェクトを使用した場合、常にそのシートのRange(セル)が参照される。

標準モジュールやThisWorkbookモジュールでワークシートを明示せずにRangeオブジェクトを使用した場合、アクティブ・シートのRange(セル)が参照される。



Connection を閉じて、Recordset を使う

ADOについて、Connection を閉じて、Recordset を使う方法。
データベース接続を速やかに切断することで、データベースの負荷を軽減できる。

マイクロソフトの「ADO プログラマーズ リファレンス」のCloseメソッドの説明によると、

◆Close により関連する全てのシステムリソースが解放される。
◆オブジェクトはメモリからは削除されず、プロパティ設定を変更してもう一度開くことができる。
◆メモリからオブジェクトを完全に削除するには、オブジェクト変数を Nothing に設定する。

とのこと。


Sub TestUnconnectedRs()

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    cn.Open connectionString

    ' ↓ここがポイント(1)
    rs.CursorLocation = adUseClient

    rs.Open sqlString, cn, adOpenKeyset, adLockOptimistic

    ' ↓ここがポイント(2)
    Set rs.ActiveConnection = Nothing
    ' ※cn.Close ではエラーとなる。rsもCloseされてしまう。
    ' ※Set cn = Nothing はOK。

    Do Until rs.EOF
        Debug.Print rs.Fields(0).Value
        rs.MoveNext
    Loop
    rs.Close

End Sub


ポイント(1) CursorLocation に 'adUseClient' を設定しないとエラーとなる。
ポイント(2) cn.Close では「関連する全てのシステムリソースが解放される」ので、実行と同時に rs も Close されてしまい、エラーとなる。Nothing の場合、cn だけが閉じられ、rs はメモリ上に残る。cn を再び使う場合は、Newする必要がある。