2011年04月

VBAでIEを起動して任意のURLを開く方法はいくつかありますが、単に開けばいいだけなら以下のコードでできます。
Shell "explorer.exe http://www.madoka-magica.com/", vbNormalFocus
実行結果:

イメージ 1

以前、IEでこうしたことをしたり起動したIEを制御したりというやり方を調べて、この日記にも書いたことがありました。でもIEって、今もう使わないんだよな・・・仕事ではほとんどChromeです。

で、Chromeでも上と同じことをやってみました。
できるにはできたのですが、ただ以下のように書いてもエラーになってしまいます。
'これではエラーになる
Shell "chrome.exe http://www.madoka-magica.com/", vbNormalFocus
エラーメッセージ:

イメージ 2

Chromeの場所を教えてあげないと動いてくれません。
あらためてChromeってどこにあるんだと調べたら、変なところにインストールされてました(Windows XPの場合)。

C:\Documents and Settings\<ユーザー名>\Local Settings\Application Data\Google\Chrome\Application


同じ環境でもPCによって<ユーザー名>部分が変わってしまうので、いずれにしろChromeの場所を調べるコードが必要になります。レジストリを見たら、アンインストール用の情報として以下の部分にインストール場所が書き込まれていました。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome\InstallLocation

WSHのRegReadでこのデータを読むことができますから、コードを以下のように修正してみました。
Dim objWsh As Object
Dim sPath As String
Const REG_KEY = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome\InstallLocation"
    Set objWsh = CreateObject("WScript.Shell")
    sPath = objWsh.RegRead(REG_KEY)
    Shell sPath & "\chrome.exe " & "http://www.madoka-magica.com/", vbNormalFocus
実行結果:

イメージ 3

いちおう動きました。
別の環境や今後のChromeのバージョンアップでも同じように動くかはわかりませんが。

ところで、Chromeはアドレスバーに何かキーワードを打ち込むとGoogleの検索URLに変換して勝手に飛ばしてくれます。URLのキーワード部分が入力した日本語のままなのがミソ。

イメージ 4

これを利用すれば、任意の日本語の単語をそのまま渡してGoogle検索させるということもできるなあ、と思いました。
Dim objWsh As Object
Dim sPath As String
Dim sKeyWord As String
Const REG_KEY = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome\InstallLocation"
Const SEARCH_URL = "http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q="
    Set objWsh = CreateObject("WScript.Shell")
    sPath = objWsh.RegRead(REG_KEY)
    sKeyWord = "円環の理" '←日本語そのまま
    Shell sPath & "\chrome.exe " & SEARCH_URL & sKeyWord, vbNormalFocus
「sKeyWord =」の部分は、たとえばコントロールの値から持ってくるとかInputBoxを使うとかすれば、なんか使い道があるかもしれません。

追記:
書き忘れましたが、標準のブラウザがはじめからChromeになっていればHyperlinks(1).Followを使ってもできます(Excelの場合)。
なお、インストール場所なら下記のキーを参照すべきだったようです。内容は一緒ですが。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe\Path

下図のような特殊文字の使いかたがありました(ツイッターでポストしたところ)。


なぜこんなことを調べたのかというと、これがコメントで使われているのを見たからです(ただし「v」だけは上のリンク先と違うものでしたが)。と言ってもコメントで使った場合、ツイッターのようには表示されません。
この4文字だけでコメントしてみたところ:

イメージ 2

Windows XPでも7でも結果は同じです。
なぜこうなってしまうかというと、これらがArialで表示されているからだと思われます。試しにフォントリンクにArialを追加してリンク先をMS Pゴシックにしてみたところ:

イメージ 3

MSゴシックの字形でちゃんと表示されました。でも「v」はそのままで、やはりツイッターのようにはいきません。

この4文字のうち、「L」「o」「e」は「文字様記号」という領域にあります。
MS Pゴシックにはグリフがありますが、ArialはXPにも7にもありません。

イメージ 4

「v」だけは「ギリシア文字及びコプト文字」という別の領域にある文字で、これだけArialにもグリフがあります。ただしMSゴシックとは異なり、筆記体の形はしていません。このため上のような表示結果になるのだと思われます。MS PゴシックとArialで字形を比較してみたところ:

イメージ 5

なお、実際に見たコメントでは下図のような状態になっていました。

イメージ 6

後ろに全角化(と言うのかゴシック化と言うのか)を引き起こす文字が隣接していたため、「e」だけはArialからMS Pゴシックに変化して表示されていました。しかしこの「v」はふつうの半角英数字と同様、Arialから変化しない文字のようです。このため、ここで変化は途切れて「L」と「o」は豆腐のままになっていました。
「v」が仮に変化するタイプであれば、これだけで豆腐は直っていたでしょうが。

イメージ 7

なので、表示させるには両端で全角文字なりゴシック化文字なりと隣接させる必要があります。

イメージ 8

もっともこれではかっこ悪いので文字を選ぶ必要がありますが・・・ちなみに全角スペースでもちゃんと全角隣接の効果があります。組み合わせを考えればいい感じになるのでは。

イメージ 9

ついでにもう一つ、XPでも7でも豆腐になるケースです。今や時の人なあの方の顔文字:

イメージ 10

いつ見てもにくたら・・・いや愛らしい顔文字ですが、両側の丸かっこを半角にしてしまうと上の段のように顔部分が豆腐になります。顔の部分にはU+203F・U+25D5というのが使われています。冒頭の「L」「o」「e」と同じくArialにはグリフがなく、挙動も同様のようです。

イメージ 11

さて前回・前々回の話もふくめてこのArialの豆腐化の様子を見ていると、3つパターンがありました。
1.XPと7でArialのグリフの有無が異なる→当然、グリフの無いXPだけ豆腐化(たとえばU+2001)
2.XP・7ともArialにグリフは無い→当然、どちらでも豆腐化(今回の例)
3.XP・7ともArialにグリフは無い→が、Microsoft Sans Serifのフォントリンクを経由してMS UI Gothicにより豆腐化が回避されることがある(たとえば7でのU+2740)。
グリフがあろうがなかろうがArialで表示させようとする、っていうところがミソのような気がしますが、3の挙動だけわけがわからないよ!まあ内部的な処理なのでたぶんいくら調べてもわからないでしょう。コメントに含まれる情報は唯一文字コードだけなので、文字コードで何かを区別してるんだとは思いますけど。

蛇足になりますが、文字コードと言えばAdobeのホームページにこんなのがありました:


見たとき、一瞬おお!と思ってしまいましたが、上の話と直接は関係ないと思います。ニコニコのプレーヤーのようにシステムのフォントを使うのではなく、フォントのデータをはじめからアプリケーションに埋め込んでしまうという形もあるんだそうです(埋め込みフォント)。この時、埋め込むデータを必要最小限にするのに使うものらしい。

ただ、見てるとU+2661(ハートマーク=丸文字化文字)がHangulに定義されていたりして、なかなか興味深い。ニコニコのプレーヤーにおけるフォント変化も、内部ではこういうもので判定されてるんじゃないかしら?と思いました。

前の話の続きです。
お花マーク(U+2740)をフォント変化文字に隣接させてみます。以前にもこの実験は延々とやったんですけど、あらためてもうちょっと簡潔にwなお以下はすべてWindows XPでの話です。

U+2740はSimSunにもGulimにもありませんが、明朝化の場合はMicrosoft Sans Serifが呼ばれてフォントリンクの設定によりMS UI Gothicで表示されます。MS Pゴシックと区別しづらいので、ここではゴシック化と丸文字化を比較します。丸文字化の場合U+2740は「マークで表示されます。

イメージ 1

下図はふつうのひらがな「あ」とU+2740について、二つのフォント変化文字(ゴシック化のU+25EFと丸文字化のU+2661)で前後をはさんだところです。どちらも前のフォント変化文字に従った表示になります。

イメージ 2

ここで前のフォント変化文字の後に半角文字「a」を置くと、フォント変化の影響が遮断(というかリセット?)されます。今度は後ろに隣接しているフォント変化文字に従うようになります。これも「あ」もU+2740も同じです。

イメージ 3

下図は二つのフォント変化文字をどちらも前に置いたところです。直接隣接している方に従っています。

イメージ 4

ここで隣接していたフォント変化文字の後に「a」を置くと、「あ」とU+2740とで挙動が分かれます。
「あ」は先頭のフォント変化文字に従います。一方U+2740はフォント変化文字に関係なく、豆腐状態(つまりArial)に戻っています。やはり「a」の効果はリセット的なことなのか。

イメージ 5

さて、謎なのがここでU+2740の後ろにさらに全角ひらがなを置いた場合です。
「あ」が先頭のフォント変化文字に従うのは先に見た通りです。リセットされてArialになっていたU+2740が、ゴシックの「あ」に隣接して再びゴシックで表示されるのは納得できます。

イメージ 6

でもなんで丸文字化の場合まで、「マークにならずにゴシックの字形が表示されるのか?
フォントリンクをいじってみると、明朝化の場合と同様でMicrosoft Sans Serifのフォントリンクにより表示されているらしいことがわかりました。

イメージ 7

丸文字化文字と隣接するだけでは、こうならないわけですから不思議です。「隣接」というか、おそらく文字の並びから「適切なフォント」を判定するようなアルゴリズムなんでしょう。一つのプロセスでこのような挙動になるのか、なにか複数の処理が入り混じった結果なのかはわかりませんが・・・

ところで、Windows 7でも豆腐化してしまうケースがあります。長いんでまたにします。

いまだにWindows XPがメインのマシンなのですが、それでニコニコを見てて気になるのが豆腐コメ。
コメントの豆腐化は、主にはArialの代替表示が行われないためだと思っています。
と言うわけで、あれこれ実験してて豆腐化についてこれまで気になったことをあらためて。

お花のマーク(U+2740)は単独でコメントするとXPではお豆腐になります。7ではなりません。

イメージ 1

XPの方では(実験の結果)グリフが無いにもかかわらず、Arialで表示されているかららしいことがわかりました。Arialのフォントリンクというのはデフォルトではありませんが、これを新規に追加してグリフを持つMSゴシックを設定すれば表示されます。

イメージ 2

一方7の方ですが、やはりArialにはグリフはありません。
ところがXPとは異なり、ここでMicrosoft Sans Serifが呼び出されているらしいことが実験でわかりました。Microsoft Sans SerifにもU+2740のグリフはありませんが、フォントリンクでMS UI Gothicが設定されています。これによりMSゴシックの字形が代替で表示されているっぽい。フォントリンクからMS UI Gothicを削除すると豆腐化します。

イメージ 3

XPにもMicrosoft Sans Serifはインストールされているしフォントリンクも設定されているのですが、なぜか7のように呼び出されることはありません(※明朝化・丸文字化の場合は呼び出されるケースがあります)。
なんでだろう?
内部的な処理なので、Flash Playerの判定なのかWindowsの挙動なのかはわかりようがありません。
MingLiU化がXPではMS Pゴシックで表示されてしまうように、XPでの内部処理には不完全な部分があって、7・Vistaではそれが改善されているということなのかもしれません。

ところで上のようにフォントリンクにArialを追加すると、不思議なことが起きるのに気づきました。
フォント変化文字がArial化してしまうのです。以下はすべてXPでの挙動です。

U+266Aは明朝化に対して有効なゴシック化文字です。ArialにもMSゴシックにもグリフがありますが、通常はMSゴシックの字形で表示されます。
これがフォントリンクにArialを追加してMS Pゴシックを設定すると、Arialの方の字形で表示されます。

イメージ 4

次に明朝化文字です。
明朝化文字U+2588やU+2593はやはりArialにもSimSunにもグリフがありますが、通常はSimSunの字形で表示されます。ところがフォントリンクにArialを追加してSimSunを設定すると、Arialの方の字形で表示されます。

イメージ 5

イメージ 6

同様に丸文字化文字も見てみます。
丸文字化文字U+2592・U+2665はArialにもGulimにもグリフがあり、通常はGulimの字形で表示されます。フォントリンクにArialを追加してGilimを設定すると、Arialの方の字形で表示されます。

イメージ 7

イメージ 8

一見わけのわからない挙動ではあります。

ただ、Arialにもグリフがあるのに通常はゴシック・明朝・丸文字で表示されるのは、これらがフォント変化文字だからではないかと。言わば自分自身のフォントも変化させてるってことなんじゃないか?と思いました。
例えばSimSunをフォントリンクに設定すれば、明朝化を起こさなくてもひらがなや漢字はSimSunで表示されます。明朝化する必要がなくなるってことなのかも。

フォント変化文字でない場合、レジストリをいじらなくてもArialになったりゴシックになったりします。
下図は上段がArial、下段がMSゴシックで表示されていると思われます。

イメージ 9

これでArialにグリフが無いとU+2740のように単独では豆腐になるわけですが。

それにしても、この全角文字と隣接させるとゴシックになるというのは、明朝化や丸文字化とは異なる独特な挙動です。長くなるのでこの話はまた別で書きたいと思います。

データベース(Access)に下図のようなクエリがあるとします。

イメージ 1

ExcelからADOで接続してこのレコードセットを取得、シート上にCopyFromRecordsetで貼り付ける時の話です。
変数rsが取得したRecordsetオブジェクトだとして、以下のコードを実行します。
ActiveSheet.Range("A1").CopyFromRecordset rs
実行結果:

イメージ 2

ここまでは何の問題もありません。
ところでMSDNにはこのメソッドについて以下のように説明されています。
データは指定したセル範囲の左上隅を起点として貼り付けられます。


「指定したセル範囲の左上隅を起点」なんだから、Rangeの範囲を「A1:B1」としても「A1:C100」としても「A1」と同じ結果になるはずだよな。

どうしてそんなことが気になったのかというと、実際に書いたコードの中で名前が定義されたセル範囲に貼り付けるという部分があったからです。NameオブジェクトにRefersToRange.CopyFromRecordsetと書いていました。
RefersToRangeではなくRefersToRange.Cells(1)とした場合と結果はいちおう同じなのですが、一点おかしな挙動が見られました。

先のコードのセル範囲を変えて再度やってみます。貼り付ける前にActiveSheet.Cells.Clearを実行しています。
ActiveSheet.Range("A1:B1").CopyFromRecordset rs
実行結果:

イメージ 3

E列がなぜか日付の書式設定になってしまいましたw
書式が日付になっているだけで、「標準」に戻してやれば元の値であることは確認できるんですが。

イメージ 4

指定する範囲をもう1列広げてみます。貼り付ける前にActiveSheet.Cells.Clearを実行しています。
ActiveSheet.Range("A1:C1").CopyFromRecordset rs
実行結果:

イメージ 5

今度はF列まで日付の書式設定になっています。ってことはさらに列を広げてみると・・・

「A1:D1」にした場合:

イメージ 6

「A1:E1」にした場合:

イメージ 7

日付になっちゃう範囲も1列ずつ広がってますね。
2003では「A1:F1」とすると、さらに貼り付け範囲の外のI列まで日付の書式になってました。
(2007・2010ではこの現象は起きませんでした)

イメージ 8

さらにこの時、なぜかシートの最後列まで全部日付になっちゃってましたw

イメージ 9

わけがわからないよ!
なお影響を受けるのは列全体ではなく、あくまで貼り付けられたデータの最下行まででした。

イメージ 10

なんでこんなことが起きるのかは結局不明。
CopyFromRecordset特有の挙動なのかExcel自体の仕様によるものなのか、ちょっと気になります。

↑このページのトップヘ