サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

e-Stat 時間軸コードを、人間が見て分かりやすい表現に変換する Excel 関数【Excel/ユーザー定義関数/E_STAT_TO_STRING()】

はじめに

 官公庁の統計で使われている「e-Stat 時間軸コード」を見やすく変換する Excel 関数(ユーザー定義関数)です。

 こんなもの、探せばありそうな気がしたのですが無かったので VBA で作りました。

関数の使い方イメージ

 セルに数式で =E_STAT_TO_STRING(A1) などとすると、以下のイメージのように文字列変換して表示します。

 範囲外のコード値を使用すると「#VALUE!」エラーに、数字以外の文字が含まれると「#NUM!」エラーを返します。

続きを読む

Redmineのチケットの内容をコミットメッセージにするブックマークレット【Bookmarklet】

はじめに

 VCS のコミットが、Redmine のチケット単位になることはしばしばあります。コミットメッセージに書く内容も、同じような感じになるかもしれません。

 だったら、Redmine の内容から自動でコミットメッセージに変換してくれればいい。

 ブックマークレットを作成します。

続きを読む

社長「勉強は家でやるものだ!!」→その結果

教育費が高すぎると思うのなら、無知による損失と比べてみれば良い [ボックの法則]

はじめに

 以下のようなまとめサイトの記事をみました。

 この「一年目」の方は、社長の言葉を受け止めて「納得」したようです。

 しかしながらサポンテは、いささか異なる見解を持っています。

経営者視点で言うならたしかに

 会社というのは、労働力を提供する代わりに賃金を貰う場所であり、学校ではありません。学びは労働の枠外にあるものであって、それを営利企業が業務時間を使って提供してくれるものと期待するのは筋違いです。

 かつては、サポンテもそう思っていました。

自己教育は無料ではない

 では自分で勉強しようと思うとどうなるでしょうか。当然、個人間でばらつきが出てきます。

 また、自己教育は少なからぬ費用がかかります。生活のために仕事で稼いだ賃金を、仕事のための勉強に消費する。これは果たして健全なことでしょうか。人生全体を振り返った時に、後悔を残さないでしょうか。

 もっと重要なことを言います。企業は今まで、その自己教育が十分に可能になる潤沢な報酬を支払ってきたでしょうか。

 サポンテのようにエンジニアをやっている方はわかると思いますが、セミナーなどはもちろん、技術書籍はまったく安くありません。いくら勉強したいとは言っても、躊躇せざるを得ない金額です。

 そしてエンジニアはずっと賃金が安いままでした。自己教育に回せるほど家計に余裕を持つ人の方が、むしろ少数派でしょう。

その結果どうなったか

 その状況が何十年も続きました。結果、世の中はどうなったでしょうか。

 「自社は、高い技術力スキルと生産性を持つ社員を多く擁しており、世界での競争力もある」と自信をもって言える企業は、日本全体でどれほど存在するでしょうか。

 社員の教育にコストをかけず、安い給料で長時間働かせ、世界を席巻するイノベーティブなものが、この国からたくさん生まれたでしょうか。

教える立場になって

 サポンテはとっくに「新人に教える側」になっているのですが、状況は深刻です。これからの若い人は、破綻する年金に怯えながら爪に火を灯す生活を余儀なくされると感じています。もう「この本は、とてもためになるのでぜひ買って読んでおいてね」などとは言えません。とてもそんなことを言える余裕はなくなってきたと感じます。

 ためになったとしても、収入は下がる一方なので、それも「ぜひ」とは言えない理由です。

企業はもっと社員教育

 企業は、もっと社員教育に積極的になるべきだと思います。なにも、費用をかけろとは言いません。外部講師を招いて社内セミナーを開くとか、そんな大袈裟なことでなくても良いのです。業務時間外でも構いません。ただ社内の会議室と PC を使わせて、自由に参加できる形の勉強会を開きやすい文化を醸成するだけで良いです。プレゼンターをやりたがる人がいないかもしれませんが、その時だけ報酬を出せば良いでしょう。外部講師を招くよりはずっと安く済むはずです。

 サポンテは様々な企業で働きましたが、ほとんど冒頭に引用した言葉の通りの企業ばかりでした。教育費が高すぎると感じるのは、費目があるから見えやすいというだけのこと。無知による損失は会計には載ってきませんからね。一度試算してみれば良いと思います。

Launchy を利用して素早く新規ファイルを作成したい【Windows】【VBScript】

はじめに

 macOS には Spotlight がありますが、Windows には無いので代わりに Launchy を使っています。先日作ったものWindows 用にも作ってみました。

 現在、Windows が手元にないので動作未検証です。そのうち検証します。

【追記(2022/06/26):エクスプローラーの「最前面ウィンドウ」が取得できませんでした。ひとまず断念。折を見てまた挑戦します】

VBScript でできるか

仕様

  1. 新規ファイルを作成する場所は、エクスプローラーで今開いている場所。なければデスクトップ。
  2. ファイル名は、デフォルトで日付文字列 + 拡張子。
  3. ファイル作成後は、すぐにファイル名の変更ができるように、エクスプローラーで選択状態にする。

インストール

 以下のソースコードを拡張子 ".vbs" で保存し、Launchy で開けるようにしておきます。

 ファイル名は "nm新規マークダウン書類newmarkdown.vbs" のような名前で良いでしょう。

Option Explicit

Private Const EXTENSION = ".md"

' ---
' エクスプローラーで開いているフォルダのパスを取得する。
' 取得できなければ、デスクトップフォルダのパスを取得する。
' 参考:
'   https://r2z.hateblo.jp/entry/20100731/p1
'   https://www.ka-net.org/blog/?p=3782
' ---
Dim shell, fso
Set shell = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")

Dim path
path = ""
Do
    Dim wnd
    For Each wnd In shell.Windows
        If InStr(TypeName(wnd.document), "IShellFolderViewDual") >= 0 Then
            ' エスクプローラーウィンドウならパスを取得する
            path = wnd.Document.Folder.Self.Path
            Exit For
        End If
    Next
    Exit Do
Loop

If path = "" Then
    ' ウィンドウを開いていなければ、デスクトップのパスを取得する
    Private Const SSFC_DESKTOP_DIRECTORY = 16
    path = shell.Namespace(SSFC_DESKTOP_DIRECTORY).Self.Path
End If
Set shell = Nothing

' ---
' 日付文字列のファイル名を作成する
' ---
Dim fileName
fileName = Year(Now) & "-" & _
    Right("00" & Month(Now), 2) & "-" & _
    Right("00" & Day(Now), 2)

Dim fullName
fullName = path & "\" & fileName & EXTENSION

' ---
' フルパスを作成する
' ---
Dim seq
seq = 1
Do
    If fso.FileExists(fullName) Then
        fullName = path & "\" & fileName & "-" & seq & EXTENSION
        seq = seq + 1
    Else
        Exit Do
    End If
Loop

' ---
' ファイルを作成する
' ---
Dim fileH
Private Const FOR_WRITING = 2
Private Const CREATE_FILE = True
Set fileH = fso.OpenTextFile(fullName, FOR_WRITING, CREATE_FILE)
fileH.Close
Set fileH = Nothing
Set fso = Nothing

' ---
' エクスプローラーで選択状態にする
' ---
Dim wsh
Set wsh = CreateObject("WScript.Shell")
wsh.Run "explorer.exe /select, """ & fullName & """"
Set wsh = Nothing

さいごに

 Launchy には ".lnk" ファイルをカタログするようにしておいて、ショートカットのプロパティで拡張子を起動オプションにすれば、".txt" もほとんど同じコードでいけるかと思います。

『きみに出会うとき』レベッカ=ステッド著 東京創元社

「そうだねえ、だれかを愛するのはかんたんなことだよ。でも、それを声に出して言うべきときはいつなのか、それを見きわめるのがむずかしいね」

Excel のスクリーンショット機能で Edge のウィンドウを選ぶと真っ黒になる 【VBA】【Windows】

はじめに

 この記事の内容は、Windows 専用です。macOSExcel を持っていないため、同様の不具合が発生しているのか、そもそも確認できていません。

問題

 Google 検索 で「excel スクリーンショット edge」と入力すると「真っ黒」というサジェストが出ます。そこそこ困っている人が多いようです。

 これはセキュリティのためですが、Edge の画面をスクリーンショットに撮って Excel に貼り付けるという要件は少なくありません。

 Excel にはスクリーンショットを簡単に挿入する機能がありますが、一部のアプリ、例えば Web ブラウザの Microsoft Edge などでは、その機能を使うと真っ黒のイメージが貼り付けられます。使えません。他の手段でスクリーンショットを撮ることはできるのですが、手順が多くて面倒です。

他の手段でスクリーンショットを撮る

 他の手段は、以下の通りです。

  1. Edge をアクティブにする
  2. Alt + PrintScreen キーを押す(スクリーンショットイメージがクリップボードに入る)
  3. Excel に戻る
  4. Ctrl + V キーを押す(ペースト)

VBA で解決

 以上の手順を、VBA で自動実行するようにします。

 「個人用マクロブック」に「標準モジュール」を追加して、以下のコードを貼り付けてください。

 部分的に赤字になるかもしれませんが、大丈夫、実行できます。

Optional Explicit

Private ws As Worksheet

#If Win64 Then
    ' 64bit 用
    Private Declare PrtSafe Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long _
            )
    Private Declare PrtSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    ' 32bit 用
    Private Declare Sub keybd_event Lib "user32" ( _
        ByVal bVk As Byte, _
        ByVal bScan As Byte, _
        ByVal dwFlags As Long, _
        ByVal dwExtraInfo As Long _
            )
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Public Sub アクティブ画面を撮って貼付ける()
    On Error GoTo ERR_EXIT
    Set ws = ActiveSheet
    Application.Visible = False
    Application.OnTime Now + TimeValue("00:00:01"), "PrintScreenActiveWindowAndPaste"
    ' 少し待っているのは、Excel を非表示にした瞬間に Tooltip などが残る可能性があるため。
ERR_EXIT:
    Application.Visible = True
End Sub

Private Sub PrintScreenActiveWindow()
    keybd_event &HA4, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1, 0&
    keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
    keybd_event &HA4, 0&, &H1 Or &H2, 0&
End Sub

Private Sub PrintScreenActiveWindowAndPaste()
    PrintScreenActiveWindow
    DoEvents
    Sleep 75
    DoEvents
    Application.Visible = True
    ws.Activate
    Set ws = Nothing
    ActiveSheet.Paste
End Sub

リボンに登録する

 上記で作成したマクロをリボンに登録します。登録するマクロは「アクティブ画面を撮って貼付ける」です。

マクロの使い方

 設定は以上です。リボンに追加したボタンをクリックすると、マクロが実行されます。

 マクロは以下のように動作します。

  1. Excel を非表示にする
  2. Alt + PrintScreen キーを押す(のと同じことをマクロでやる)
  3. Excel に戻る
  4. 現在のシートにペーストする

 したがって、Excel が非表示になったときに Edge が最前面になっていれば、期待通りスクリーンショットが撮れます。

注意点

  • クリップボードを経由するため、内容を書き換えます
  • Excel が非表示になったときに Edge が最前面に来るように作業してください
  • Edge 以外でも使えます

このブログに貼り付けてあるソースコードについて

基本

 基本、パブリックドメインです。

このブログに貼り付けてあるソースコードについて

 本ブログに貼り付けてあるものは、ソースコードというよりはスニペットだと思っていますので、どうぞご自由にお使いください。

 異なるライセンスにしたいものは別途記載します。ライセンス表記の無いものはパブリックドメインです。GitHub などにアップしてあるものは、そちらにライセンスを記載します。