サポンテ 勉強ノート

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

ワークシート上のセル選択範囲を画像ファイルとして保存【Excel/VBA/Windows】

はじめに

 先日の記事の姉妹版です。

 Excel のセルの選択範囲__セル範囲自体も、その上に描画されている図形なども__を画像ファイルとして出力します。Excel の「カメラ」機能で切り出した図をファイルにする感じですね。

 これもネットで調べると、同じような方法が見つかりますが、先日のマクロと同じく、A1 セルにパスを入力しておく形で実現します。

続きを読む

セル・セル範囲が選択されているか確認する【Excel/VBA】

はじめに

 VBA を書いていると、処理対象の Selection オブジェクトが、想定しているものであるかどうか調べたいことがあります。

 図形Shapeかどうかの確認については、以下のサイトがありました。

図形が選択されているか判定する-VarType関数・ShapeRangeプロパティ:エクセルマクロ・Excel VBAの使い方/DrawingObjectsオブジェクト

 セル範囲が選択状態にあるかどうかを判定するものは見つかりませんでした。「図形が選択されていなければ」という判定では不十分の可能性があります。グラフオブジェクトかもしれませんしね。

 ということで「セルまたはセル範囲が選択されている状態であるかどうか」を真偽値Booleanで返す関数を作ってみました。

続きを読む

ワークシート上の図を画像ファイルとして保存【Excel/VBA/Windows】

Excel を使う理由

 サポンテは Excel で簡単な図を書くことがあります。

 なぜ Excel を使うか?普及率が群を抜いて高いためです。サポンテは色々な会社で仕事しましたが、いまのところ 100% の会社でインストールされています。アプリのインストールを制限されている環境でも、これだけは確実にインストールされています。Visio などのドローソフトを導入する費用がなかったり、自分で勝手にソフトをインストールできない環境に置かれても、Excel が導入されていない企業はありませんでした。

Excel で描いた図をイメージファイルとして出力したい

 書いた図を、PNG などに出力したいことが、しばしば発生します。

続きを読む

ルビの入力って面倒ですよね 【Markdown/HTML/CotEditorスクリプト】

はじめに

 Markdown でブログ書いていても、読み仮名は HTML で書く必要があります。読み仮名、ときどき入れたくなります。「人智アントロポゾフィー」とか。しかし、いまいち手間なんですよね。

CotEditor のスクリプトを書いた

 ブログの編集に使っている CotEditor で入力しやすいように、AppleScriptスクリプトを書きました。

 せっかくなので共有します。よろしければ CotEditor のスクリプトフォルダに入れてご利用ください。

続きを読む

【コードジェネレータ】Excel などから TSV を貼り付けて、C# のオブジェクトリスト初期化コードを生成する

【コードジェネレータ】Excel などから TSV を貼り付けて、C# のオブジェクトリスト初期化コードを生成する

はじめに

 ソースコードとデータは切り離して管理すべきですが、それでもコード中にデータを埋め込みたいケースはしばしば発生します。テストコードとか。

 そのようなデータの元ネタとして、Excel や Numbers や Google Spreadsheet などの表計算ソフトや、ObjectBrowser などの RDBMS クライアントを用いたいという要件はあるかと思います。

 そのようなデータ元ネタは「コピー」すると、TSV 文字列としてクリップボードに格納されます。その TSV を「ペースト」してコードを生成してくれるジェネレータを JSFiddle で作りました。

コードジェネレータ

 左の入力欄に、サンプルのように TSV 文字列をコピペして、convert ボタンをクリックしてください。右側の入力欄に生成したコードが書き出されます。

 サンプル文字列がすでに入力されているので、convert ボタンをクリックするだけで動作を確認できます。

生成されるコード例

 以下のようなコードが出力されます。

var dataSrc = new[]{
    @"1  Apple   200",
    @"2  Banana  150",
    @"3  Citrus  300",
};

var data = dataSrc
    .Select(e => e.Split('   '))
    .Select(e => new
    {
        Id = e[0],
        Name = e[1],
        Price = e[2],
    });

foreach (var item in data)
{
    Console.WriteLine(item.ToString());
}

ソースコード

 念のため、ソースコードも載っけておきます。JSFiddle がサービス終了しちゃうかもしれませんからね。

 それに、オフラインで使いたいという要件もあるかもしれません(その場合、CDN のところは修正してください)。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        @media (prefers-color-scheme: dark) {
            body {
                background-color: #333;
                color: #fff;
            }
            textarea {
                background-color: #444;
                color: #fff;
            }
        }
    </style>
</head>
<body>
    <div id="app">
        <textarea name="" id="src" cols="30" rows="10" v-model="src" placeholder="Excel などからコピペしてください"></textarea>
        <button v-on:click="convert">convert</button>
        <textarea name="" id="result" cols="30" rows="10" v-model="result"></textarea>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script>
        var app = new Vue({
            el: "#app",
            data: {
                src: "Id\tName\tPrice\n1\tApple\t200\n2\tBanana\t150\n3\tCitrus\t300",
                result: "",
            },
            methods: {
                convert: function (e) {
                    var lines = this.src.split("\n");
                    
                    var ret = "var dataSrc = new []{\n";
                    for (let i = 1; i < lines.length; i++) {
                        ret += "    @\"";
                        ret += lines[i];
                        ret += "\",\n";
                    }
                    ret += "};\n\n";
                    
                    ret += "var data = dataSrc\n";
                    ret += "    .Select(e => e.Split('\t'))\n";
                    ret += "    .Select(e => new {\n";
                    var colnames = lines[0].split("\t");
                    for (let j = 0; j < colnames.length; j++) {
                        ret += "        " + colnames[j] + " = e[" + j + "],\n";
                    }
                    ret += "    });\n\n";
                    
                    ret += "foreach (var item in data)\n";
                    ret += "{\n";
                    ret += "    Console.WriteLine(item.ToString());\n";
                    ret += "}\n";
                    
                    this.result = ret;
                }
            }
        });
    </script>
</body>
</html>

おわりに

 以前なら、このようなコードは ExcelVBA で作成していました。

 でも Excel の無い環境もあるでしょうし、VBA だと共有したい時に配布しないといけないんですよね。共有したいツールが増えると、手間も増えます。

 そのような点から、JavaScript を使った Web サービスの方が、作り手の視点からも、使う側の視点からも嬉しい気がしてきました。Web サービスになっていれば URL をメールやチャットで送るだけですからね。JSFiddle や CodePen のような便利なサービスもありますし。

Git で外部の diff ツールを使う方法のまとめ

はじめに

 Git で差分比較を行う際に、外部ツールを使う方法です。

 基本的にどんなツールも、すでに誰かが書いていることが多いので、リンクの紹介が主です。

 下記にない場合は 「git diff <ツール名>」 で検索すれば、何かしら情報が出てくるでしょう。

 Mac の場合は以下がいろいろ詳しいですね。

 参考:Mac で使える git mergetool をいろいろ試してみる - 準備編 | そんなこと覚えてない

 Merge のことはあんまり考えていません。個人開発が多いためか、あんまりコンフリクトしないので。

続きを読む

アクティブブックのフォルダを開く

はじめに

 Excel を使っていて、編集中のファイル(アクティブワークブック)のフォルダを開きたいと思うことが、しばしばあります。

 サポンテは、作業環境をシンプルに保ちたく、今すぐに使わないウィンドウをずっと開いておくのに抵抗を感じます。エクスプローラのウィンドウも、必要なければすぐに閉じてしまいます。

 それは、後でまた開きたくなった時にすぐ開くことができれば問題ありません。

 そういうことでサポンテは、アクティブブックのフォルダを開くマクロをリボンに登録して使っています。このマクロ自体は、たいへん短いコード(実質一行)なので、記事を書いて公開するほどのものでもありませんでした。

SharePoint 対応

 ところが最近、SharePoint 上のファイルを直接開いて編集するということを頻繁にするようになりました。この場合も、ブラウザで SharePoint を開いてほしい。

続きを読む