masatoの日記

やっていきます

ExcelのオートSUMを補完するSuperオートSUMをつくった

Excelで一番よく使う関数、それはSUM(たぶん)。
しかし、これには弱点がある。途中で空行があると合計がそこで途絶えてしまうのだ。

そんなとき、結局手動でSUMを打ち込み、セルを選択しているのではないだろうか。

組み込み関数の限界なのかもしれない。

そこで、Excel VBAだ。

開始行を自動判定するのが大変なので、そこはユーザーに指定してもらうことにした。終了行も一応、同様に指定するようにしている。

sub SuperAutoSUM()
    Dim startRow As Long
    startRow = InputBox("開始行数を指定...")
    
    Dim endRow As Long
    endRow = InputBox("終了行数を指定...")
    
    If startRow = 0 Or endRow = 0 Then Exit Sub
    
    Dim currCol As Long
    currCol = ActiveCell.column
    If currCol = 0 Then
        MsgBox "対象の列を選択してください。"
        Exit Sub
    End If
    
    Dim i As Long
    Dim addresses As String
    For i = startRow To endRow
        Dim r As Range
        Set r = cells(i, currCol)
        If Not r Is Nothing Then
            If r.Value <> "" Then
                addresses = addresses & "," & r.Address
            End If
        End If
    Next
    '左端の“,”を削除する
    addresses = Right$(addresses, len(addresses) -1)
    
    Dim formulaStr As String
    formulaStr = "=sum(" & addresses & ")"
    ActiveCell.Formula = formulaStr
End Sub

なんとなく便利かもと思って書いたが、実際にはあまり使っていない...

胃カメラを受けてみてカラダに対する意識が変わったという話

今日は会社の健康診断で胃カメラを受けてきた。最近、会社の健康保険制度(?)が変わったとかで、以前は35歳から受診が必須となっていた胃検査が、30歳以上で必須となったのだ。いま32歳なので、今年から受けなければならない。バリウムは散々な評判だったので、胃カメラにした。聞くところによると、麻酔なしでカメラを挿入されるのは大層苦しいらしかったので、麻酔ありで申し込みをした。

だが当日、麻酔なしに変えた。看護師さん「麻酔なしでやってみますか?鼻から入れればはじめはちょっとおえっってなりますけど、あとは楽になりますから」と言う。体内にカメラを入れられるのがどういう感覚がするのかけっこう興味があったので、少し我慢するくらいいいかな、と思って変えた。

とはいっても、鼻腔と喉元の感覚をにぶらせるための麻酔を使った。鼻にスプレーを注入してもらい、ジェル状の麻酔薬を5分口に含ませた。

準備を終えたら、診察室に通された。ベッドに横向きになった状態で胃カメラの挿入がはじまった。はじめ、鼻から入れられるとき、ムズムズとにぶい疼きがあった。粘膜がこすられている感じの不快感。次、喉元をカメラが通るとき、おえっとなった。実際にそういう音が出た(部屋には若い女性の看護師さんとカメラを操作する医師のふたりがいたが、医師に聞かれるのは構わないとしても、看護師さんに聞かれるのが恥ずかしい。まあ、本人は全然気にしてないに決まってるんだけど。)瞬間的だが、ここが一番キツい。そのあとは、ほどほどのしんどさと、そこそこ平気な感じの繰り返しだった。

余裕があるとき、となりのモニタを見ていた。胃カメラの映像だ。はじめて見る自分の体内が映っていた。食道、胃、十二指腸、全部ほのかなピンク色。ぜんどう運動しているのがわかった。カメラの光を、表面の体液が反射してわずかに光沢がある。

自分の身体だが、自分のものではないという感覚だった。自分のコントロールがおよばない場所。 思えば、普段自分のからだだと思っているのは、自分の目で見える範囲だけだ。髪や爪を切ったりして直接的に手を加えたり、間接的には服を着替えたりして外見を変えたりしている。意識的にコントロールできるので、自分のモノだと思いやすい。

しかし、そのからだの中は勝手に動いていた。これをリアルタイムでみるのはかなりおもしろい。わたしはそれを見て、自分は生かされている、という感覚をもった。このからだに宿っている(らしい)意識は、からだそのものを所有していない、というか。自分のモノではないという感じをもつと、大切に扱わなければいけないという気になる。借り物を粗末に扱ってはいけないという感覚に似ている。

そんなわけで手短にまとめると、胃カメラを入れてもらって体内を見ると、自分のからだの知らない一面がわかっておもしろかった。診断結果も異常なしということで検査の類いとしてはめずらしく楽しめました。

安くておいしく食べたいから自炊をしてみることにした

安くて、うまい食事がしたい。第一に、節約したいからだ(詳しい理由は省く)。生活費で合理化てきそうなところでまず目が付いたのが食費だ。食事を考え直してみたい。

予算設定

まず、予算から。ひと月の食費って大体どれくらいかかるんだろう。ちょっと調べてみた。参考にしたのはこちら。

matome.naver.jp

食費のところを見ると、「2万前後」とある。2万。これで収まれば上出来という気がする。 単純にひと月30日として割ってみると、1日当たり700円弱の計算になる。さらに、朝・昼・夕の1日3食とるとすると、1食あたり240円程度。実際には、昼・夕に量がよるから多少調整すると、昼・夕で各300円くらいか。
昼食は外で買ってくればかんたんに500円は超えるので、夕食にまわせる予算が200円になる。200円じゃ牛丼も食えないが、自炊にすれば、たんぱく質として旬のお魚もしくは鶏肉、そして野菜にはこちらも旬のものを主に使って料理すれば安くあがりそう。あと、たんぱく質にはたまごを多用するという手もある。安いたまごは100円前後で買えるから。まあ、なんにせよ、自炊がほぼ必須。そして、昼はお弁当になるだろう。朝つくるのはしんどいので、夕飯ののこりものを使うとラクだ。最終的に2万で収まるかどうか置いといて、こういう方針で食生活を組んでいけば、コストが下がるのは間違いない。あとは、これを継続できるかどうか。どうやって馴染ませていくかにかかっている。

おいしくなければ続かない

節約はするけど、おいしいご飯がたべたい。そのためには、端的に言って調味料が大切だと思う。料理研究家の川津幸子さんが著書で書いていた。「調味料はケチらないこと」。 なぜなら、調味料にちょっとよいものを使うだけで料理が格段においしくなるからだ、という。実際、紹介されていたおしょうゆを買ってきて(近所のスーパーで売っていた)、料理してみたらすごいおいしい。800円くらいしたのでかなり高めなのだが(安売り品だとたぶん200円くらいだ)、一回に使う量で考えればしれている。とても1月では使い切れないだろうから、すぐになくなるものでもない。それなのに、料理の味をばつぐんに底上げしてくれる。料理の腕がなくても使うだけでおいしくなる。よい調味料を使うというのはとても合理的なのだ。

調味料をよいものでそろえたら、あとは無理のない価格帯の食材を選ぶこと。旬のものが安くてうまいのでいいだろう。何を作るかだけど、自分が簡単に作れる料理でいいと思う。たとえば、味噌汁の具に2,3種類の野菜を入れるようにして、毎日ちょっとずつ組み合わせを変えていけば、マンネリにならずに満足感を保てるだろう。

あと、たまには予算外のものも食べるといいと思う。仮に鴨肉が食べたい!という気分になったら、鴨肉を買えばいい。たしかに高いが、食費をかけることは別に罪ではない。節約を意識して生活していると、金を使うことに罪悪感をおぼえるようになりがちなので、ほどほどにしたいものだ。

川津さんの本ではないけど、いい感じの出しパックでだしをとると、おいしいお味噌汁ができる。あとは、白菜とかなすとか、しめじとかてきとうに入れれば満足感の高い一品ができる。料理のテクは不要だ。必要なのは、そこそこの出しパック、あとお味噌、そして具。やってみるとわかるけど、100%工場合成グルタミン酸みたいなだしでつくった味噌汁と比べると全然違う。とてもおすすめ。

前提が自炊だから、安く食べようとするとこういう考え方になった。
もし金がかかってもいいのなら、外でてきとうな惣菜とかお寿司などを買ってくるか、お店で食べればよい。
これは、自分で作るか、人が作ったものを食べるかという違いともとれる。

そして、自炊して、おいしく、安く食事するという方針は、単なる節約という枠を越えて、おおげさかもしれないが生き方の姿勢の問題でもあるんじゃないかという気がしなくもない。

と、ここまで書いてくたびれたので気が向いたらつづきを書きたい。

最近動画講座をやっている

最近、Udemyという学習用サイトをつかって動画講座をあれこれ受けてます。同様のサイトにはUdacityとかがありますね。やってるのはプログラミングの講座なんですけど、コンピューター系以外にもカメラの撮り方講座とかいろいろあるみたいです。

動画講座ってすごくいいなあと思ってるんです。すごくわかりやすいんですよね。受けているのが初級講座ばかりなので内容が比較的シンプルということはあるんだと思いますが、なぜか音声だと分かりやすく感じます。本でみましたが、人には読んたほうが理解しやすい人と、聞いた方が理解しやすい人の二通りがあるようです。わたしは耳で聞いた方が情報を受け取りやすい性質なのかもしれないです。本も読むし、理解はできると自分では思っているんですが、聞いた方がわかりやすい。

聴覚から入れた方が理解しやすい性質ということ以外にも、この理由はあるんじゃないかと思います。それは速度じゃないか。しゃべり言葉を聞くのは、活字を読むのよりもずっとゆっくりです。倍速機能を使って早口で再生すれば、早くなるわけですが、あんまり早いと理解できなくなるので、自然とちょうどよいスピードに落ち着くことになります。一方、本をよむ速度は、なんだかめっちゃ速くなってしまいがちで、この場合は自然と速度調整がはたらかないのです。速く読んで、すっと理解したい、というのはあくまでも願望です。実際には、読むスピードを速くするほど理解がおぼつかなくなるはずなのですが、自分自信への見栄なのかもっとたくさん修得したいからなのか、つい全速力で読んでしまいがちのようです。

あと動画は、聞きながら手を動かせるのがとてもいいですね。説明を聞きながら、自分でも同じことを試していけます。本を読んでいるとどうしても手が塞がってしまうので。

ということで、最近うけている動画講座の感想でした。

どんな講座があるの

Udemyでは、プログラミング関係でいうといろいろあります。いろいろあるので興味のある方は見てみるとよいと思います。わたしはいまはHTML5, CSS3の講座とかデータベースとかやっとります。MySQLのやつは聞きながらSQLを打ち込んでいけるのですごくよかったです。SQLは打たないと全然理解が進まない印象なので。動画をみながらまねして打っていくだけで、どんなことができるのか雰囲気がつかめて学習がはかどりました。

Perlの講座はわずかあって、初級編みたいなのが多いですが、ちょっと変わり種としてワンライナーのやつがあります。Perlワンライナーを教えてくれる。これも聞きながら実際にコマンドを打って実戦できるので、よかった。ワンライナーって本だと知的読み物としてだけで満足して終わってしまう。そこから手を動かすところまでいくのがよっこらしょってなる。まとめると、動画は手を動かすのによいです。

Perlで順番を保ったまま要素をユニークにしたい

ダブりのあるたくさんの要素を並び順を保ったままダブりなくしたいというニーズ。

Linuxのsort+uniqコマンドだと並び順が変わってしまう。Perlのハッシュを使ってダブりをなくしても並び順は変わってしまう。ハッシュでは元の並び順が保証されないからだ。

そこでハッシュでありながら並び順を保つことができるモジュールTie::IxHashの出番だ。こいつを使うと、ハッシュに入れた順番が記憶される。ループさせて元の順で読み出すことができる。

使い方。

use Tie::IxHash;
tie my %ordered_hash, "Tie::IxHash";

while(<DATA>) {
  chomp;
  $ordered_hash{$_}++;
}

__DATA__
1 tofu
2 hakusai
3 daikon
4 kabocha
5 shimeji

まずモジュールをuseする。したら、ハッシュをtieする。tieというのはtie関数であるらしい。perldocに解説がある。(http://perldoc.jp/func/tie)。ということで、第2引数の"Tie::IxHash"は必須だ。

このハッシュでは値の並び順が保たれることになる。

そして、DATAからサンプルデータを読み込んでみる。番号通りに読み出せるかみてみよう。

use Data::Dumper;

print Dumper \%ordered_hash;

結果。

$VAR1 = {
          '1 tofu' => 1,
          '2 hakusai' => 1,
          '3 daikon' => 1,
          '4 kabocha' => 1,
          '5 shimeji' => 1
        };

順番通りだ。

使いどころ

複数の同じ文を含む文章などで、基本的に並び順のままにしておきたいのだけれど、重複する文は省きたい場合。具体的には試験要領書、チェックリストなど。箇条書きの部分でダブってることが多い。こうしておくと、CATツールを使ってその文書を翻訳するときに同じ文を見なくて済むようになる。乱暴かもしれないけど。

Excel VBA テキストファイルを読み込んでワークシートの一致する文字列をマーキングする

何かリストを何らかの条件で分別していて、途中で該当するセルだけをマーキングしたいというニーズがある、と思う。
とくにだれか他の人に作業経過を連絡したいときなどだ。

テキストエディタで作業して、中間ファイルを得たとする。 この場合はテキストファイルをExcelに読み込んでから、マーキング処理をするという具合になる。

テキストの文字コードがつまずきポイントだ。
ふつうテキストはUTF-8なので、VBAでもそれに応じた読み取り方をする必要がある。

Function ReadUTF8Text(fileFullPath As String) As Variant
    Dim buf As String
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile fileFullPath
        buf = .ReadText
        .Close
    End With
    
    ReadUTF8Text = Split(buf, vbCrLf)
End Function

ADODB.StreamのCharsetプロパティで読み取るテキストファイルの文字コードを指定できる。
1行ずつ読んでString型変数に入れ、最後まで終わったらVariant型にvbCrLrをデリミタとしてSplitしてやると、1行ごとに要素が分かれた配列が得られる。

あとは、for eachループでまわせば好きに処理できる。

開いているWord文書のショートカットをデスクトップにつくるマクロ

編集中のドキュメント、あしたすぐに開きたいという場合、ショートカットをつくりたい。
マクロでワンクリックでつくれるので、便利。

Sub MakeShort()
    Dim ShellObject
    Set ShellObject = CreateObject("WScript.Shell")
    
    Dim TempPath As String
    TempPath = ShellObject.SpecialFolders("Desktop")
    
    Dim ShortcutObject
    Set ShortcutObject = ShellObject.CreateShortcut(TempPath & "\" & ActiveDocument.Name & ".lnk")
    
    With ShortcutObject
        .TargetPath = ActiveDocument.FullName
        .Save
    End With
End Sub

ショートカットをつくっておけば、コピーが散乱してどれが本元なのかを見失わずに済むからよい。
ちなみに、ActiveDocumentActiveWorkbookに変えると、そのままExcelで同様のことができる。
地味に便利。