VBA: コンボボックスでHTMLセレクトボックス風

VBAのコンボボックスを使っていて、選択候補を設定するのはいいのだが、そのままだと表示した文字列をそのまま選ぶだけになってしまって、その候補に対応したシリアル値などがある場合に、いちいち選択後にif文や配列でその対応関係を与え直す処理をしないといけないことがある。

HTMLのセレクトボックスのように「<option value="1">太郎</option>」のように、表示する項目名と、システム側に与える値とを先に対応付けておいて自動で設定できるようにしたかった

のだが、それにけっこう手間取った。

結論としては、複数列(2列)のコンボボックスで、一方の列を非表示にして表示を1列にし、非表示側の列を値用に指定した(コンボボックス 項目名と取得値の選り分けサンプル.xlsm)。

フォームを用意して、コンボボックス(ComboBox1)とコマンドボタン(CommandButton1)を適当に貼りつける。

元データは、ここではSheet1!A1:B4として用意した。A列に番号、B列に項目名(ここでは名前)が入っている。

コンボボックスの初期化は、フォームのコードで下記のように指定した。

Private Sub UserForm_Initialize()
    With ComboBox1
        .ColumnCount = 2            '表示列数
        .TextColumn = 2             'テキストボックスと.Textに割り当てる列の指定
        .BoundColumn = 1            '.Valueに割り当てる列の指定
        .RowSource = "Sheet1!A1:B4" 'シート範囲を値に指定
        .ColumnWidths = "0;-1"      '列幅を0(非表示)と-1(幅自動調整)
    End With
End Sub

Sub CommandButton1_Click()
    MsgBox "値=" & ComboBox1.Value   '.Valueを取得すると.BoundColumnの列が得られる
End Sub

ここで、「.TextColumn」の指定がなかなか把握しにくく、解説サイトによると「表示列」となっていて、ずっとドロップダウンするときに表示する列の指定かと思っていたのだが、そうではなく、単に選択後のテキストボックスへの表示と.Text属性で得られる列の指定で、ドロップダウン時の表示(幅の)指定は.ColumnWidthで行なう必要があった(幅0で非表示、幅-1か空白で自動調整の指定)。

通常のそのまま複数列にしただけだと、次のような表示となる。

項目を選択した場合は、1列目の値がテキストボックスに入り、.Valueで取得される値も同じ値となる。

一方、上記のコードを使って、複数列でも表示幅を指定して2列目だけの表示にした場合だと次の表示となる。

項目を選択した場合は、.TextColumnで指定した2列目の値がテキストボックスに入り、.Text属性でもこちらが使われる。

コマンドボタンで処理では.Valueを得るようにしていて、ここでは.BoundColumnで指定した1列目の値が得られている。

参考:

Vine Linuxと仮想環境(VM Player, VirtualBox)

2017.4に出たVine Linux 6.5Rを試してみようかと.isoファイルを入手:

で、動かそうとVMware Player (VMware Workstation Player)を久しぶりに入手:

VMware Playerは問題なく動作して、Vine Linuxのインストールも終了するようなのだが、インストール後のVine Linuxの仮想環境を立ち上げようとすると、起動インジケータが1/10くらいのところで止まってVMware Playerからの再起動コマンドにも反応しなくなってしまう。

6.3から6.5にバージョンアップしたら、起動画面で同様に止まるという人がいた。acpi=offにすると起動できるとある。VMwareとは関係なく止まるらしい。

  • Vine Linux 6.3 → 6.5のバージョンアップでVineが起動できなくな… – Yahoo!知恵袋

    • Vine Linux 6.3 → 6.5のバージョンアップでVineが起動できなくなりました。Vineのインストール自体は問題なく終了しますが、その後の再起動で起動画面のプログレスバーが1/10ぐらいのところで止まりPC自体がフリーズします。カーネルオプションでacpi=offを指定すると起動はできるのですが、内蔵の無線LANを認識しません(有線LANは使用できます)。

上記、知恵袋からのリンクでさらに、pci=noacpiのほうが良好だとの記述も

  • disabling IRQ #9」でXubuntuが起動できない | Pagent

    • acpi=off 起動は出来るが、画面が横に引き伸ばされてしまい、モニタの設定でも他の解像度を選べず。シャットダウン時には「System halted」のスプラッシュ画面で止まってしまう。
    • pci=noacpi 良好。問題なく使えそう。
    • OS選択画面→「e」でオプション編集→quiet nosplashのあとにオプションを追加

ブートオプションのpci=noacpiだと少し起動画面が進んだが、やはり起動せず。acpi=offでは変化なかった…。

その後、シングルユーザを抜けて起動を進めても同様に停止してしまったので、今度は/etc/inittabで、ユーザモード5のXWindowでなく、3のマルチユーザを指定した。こちらなら、ログインプロンプトまで出てログインもできた。

VMware Toolsをインストールしてみると、X Window起動時にそのまま停止するのではなく、少しアイコンがくるくる回るようになった気がするが、それでもすぐに停止してしまって反応がなくなる。

また、X Windowのドライバ指定で、vmwlegacyをvmwareに書き換えるとよいとの話もあったが、効果なし。

いろいろやってもX Windowまでは起動できず、Vine-6.3Rに戻してみて動作させるのと並行して、VirtualBoxでVine-6.5Rを試してみることに。

で、VirtualBoxでVine-6.5Rを動かすと何の問題もなくX Windowまで起動した(かつ、動作も少しキビキビと速いような…?)。

改めて使っていたパソコンを見直すと、以前に作ったVirtualBoxでの前バージョンのVine Linuxの環境が残っていた。前にもVirtualBoxできちんと動作させられていたのかも。

#結局、Vine Linux 6.3Rでの試しはしていない。

Firefoxの右クリックメニュー

どこぞの歌詞サイトだったか、Tips紹介サイトかで、ショートカットキーでも右クリックメニューでもテキストコピーを禁止しているところがあって(Tipsサイトでコピーを禁止するなよ!!)、対応を検索したら、Firefoxだとabout:configからdom.event.contextmenu.enabledをfalseにするというものがあった。

テキストコピー自体はうまくいったのだが、その後そのまま使い続けていると、右クリックでのジェスチャ動作の際にも、Gmailでの独自メニュー表示時にも、Firefoxの右クリックメニューが出てくるようになってしまった。しばらくはFirefoxの更新での不具合かと我慢して使っていたのだが、よく考えるとこの設定のためだった。

dom.event.contextmenu.enabledをtrueの既定値に戻すと、上記2つのツールでもきちんと動作するようになった。あまりテキストコピーを禁止しているサイトは閲覧する機会はないが、この切り替えがもう少し簡単にできるといいのかも(リンクしたサイトによるとShift+右クリックでメニュー表示を強制可能とあるので、そちらで対応可能?)。

Thunderbirdの本文フィルタが働かない ⇒quoted-printableの字面そのものを(も)指定

メールの振り分けを行なうために、「メールアドレス+本文中の語」の指定でThunderbirdでのフィルタリングを行なっているが、以前は動作していたのに、このところフィルタが機能しなくなったとの話が出てきた。

見てみると、そのフィルタが機能するものもあり、機能するはずの内容のメールでも素通りしてしまう場合もあって、違いがよく分からない。

動作しないほうのメール本文を見てみるとquoted-printableになっていて、ネット検索をしているとどうもこの場合は、Thunderbirdのフィルタやクィック検索だとquoted-printableをデコードせずに本文を検索してしまって、それでフィルタ適用が失敗してしまうらしい。

どうしたものかと思っていたら、「quoted-printableの文字列のままフィルタを指定すればいい」とのご託宣を見つけた!

上記はUTFの場合だが、元がShift-JISの場合にはnkfで確認してみると、以下となる:

% echo 'あいうえお' | nkf -s -MQ
=82=A0=82=A2=82=A4=82=A6=82=A8

メールを見直すとISO-2022-JPのquoted-printableになっていて、この場合は字面が変わって、以下のようになる:

$ echo 'あいうえお' | nkf -j -MQ | perl -pe 's/=(2.)/sprintf "%c", hex($1)/ge';
=1B$B$"$$$&$($*=1B(B

上記でnkfでquoted-printableに変換する際に、そのままだと$が=24や”が=22の文字コード表記となってしまうため、実際のメール文面とも突き合わせて後段にperlでのhex()変換を追加している(perlのhex処理なしだと「=1B=24B=24=22=24=24=24=26=24=28=24=2A=1B=28B」のようになる)。

上記の「=1B$B$”$$$&$($*=1B(B」のうち、頭と終わりの「=1B$B」、「=1B(B」(漢字イン・漢字アウト⇒参考:「JIS, EUC, SJIS の漢字コードについて」)を除いた、「$”$$$&$($*」がここでは元の語の「あいうえお」に対応する。

サイトでquoted-printableへの変換サービスを提供しているところもある:

Thunderbirdでのフィルタ指定は、当初の想定だと「宛先またはCc」にメールアドレスを指定し、「本文に含む」語として「$”$$$&$($*」として、「すべての条件」を指定すればいいのだが、これだと、quoted-printableでない、本文を通常認識できる場合にフィルタリングができなくなる。2種の本文を指定する必要がある(さらにメール本文がutf8の場合などにも対応しようとすると、当然フィルタ数はさらに増える)。

ところが、Thunderbirdはフィルタ条件のAND/ORの併存機能がないようなので、同様のフィルタで本文の語指定が通常の文字列版とquoted-printable版の両方を作成しないといけない。同じようなフィルタ名がずらずら並んでしまう。

また、Thunderbirdはフィルタの複製機能もないようなので、別フィルタを作成する際に、同様の機能でもイチから指定し直しになってしまってしまってちょっと面倒。

アドオンでフィルタをテキスト形式で一括していするものがあるらしい(未確認):

なお、以前は本文がbase64エンコードされている場合でも、文言そのままだとフィルタ指定できなかったらしいが、こちらは解決されているもよう:

dateコマンドでゼロなし出力

dateコマンドで日付を表示しようと`date +%m/%d`とやると

$ date +%m/%d
03/05

と1桁数字の場合は、ゼロ埋めがされてしまう。

前からこれを省きたいと思う場面があったのだが、不明で他のツールを使ったりしていた。

改めて検索を掛けてみると、書式指定時に単に’%-m/%-d’のようにマイナス(ハイフン)を入れればいいだけというのが判明した。

man dateでチェックし直すと、個々の書式の説明箇所でなく、概要的に

By default, date pads numeric fields with zeroes. The following optional flags may follow ‘%’:
– (hyphen) do not pad the field
_ (underscore) pad with spaces
0 (zero) pad with zeros
^ use upper case if possible
# use opposite case if possible

と書かれていた。