2012年6月26日火曜日

Access:隠しオブジェクトの判定

Access 2010のナビゲーションウィンドウが使いづらい!
2003のデータベースウィンドウの詳細表示のように、テーブル名・説明・更新日時・作成日時が横に並んでほしいんですが。じゃあ自分で作ってしまえ、とやってた時のことです。

テーブルの一覧を取得しようと思って下記のようなコードを書きました。

Dim db As DAO.Database
Dim td As DAO.TableDef
Dim prop As Variant
Dim sTemp As String
    Set db = Application.CurrentDb
    For Each td In db.TableDefs
        sTemp = "テーブル名:" & td.Name
        sTemp = sTemp & vbTab & "更新日時:" & td.LastUpdated
        sTemp = sTemp & vbTab & "作成日時:" & td.DateCreated
        For Each prop In td.Properties
            If prop.Name = "Description" Then
                sTemp = sTemp & vbTab & "説明:" & td.Properties("Description")
                Exit For
            End If
        Next
        Debug.Print sTemp
        sTemp = ""
    Next

ちなみにDescriptionは「説明」を書いてないとプロパティ自体が無い状態なので、調べる処理をしています。
まぁこれでできるんですけど、いらないシステムオブジェクトまで取得してしまいます。


ググってみると、テーブル名のプレフィックスを利用して

If Not td.Name Like "MSys*" Then

みたいに判定して除外しているコードをよく見かけました。
でも稀なケースながら、自分でテーブルを隠しオブジェクトにしていることもあります。


TableDefのAttributesプロパティでシステムオブジェクトまたは隠しオブジェクトを除外する、という判定のしかたもあったのですが

If ((td.Attributes And dbSystemObject) Or (td.Attributes And dbHiddenObject)) = 0 Then

非表示のオブジェクトということで一度に判定できないのか?と思って調べたらありました:

SetHiddenAttribute メソッド - MSDN ※ここにあるGetHiddenAttribute

If Not Application.GetHiddenAttribute(acTable, td.Name) Then

これだけでシステムオブジェクトも隠しオブジェクトも判定できました。便利。

2012年6月23日土曜日

Segoe UI化という現象

下図はU+0531(アルメニア文字)を含んだコメントを見ているところです。


7と8RPで微妙に字形が異なります。見た目だけの判断ですが、7はTahoma・8RPはSegoe UI(いずれもボールド)ではないかと思います。
さて、これがフォント変化に関係するかという話です。隣接させた「あ」は何も変化していません。

U+263Aを隣接させてみます。U+263Aはデフォルト(単独)および半角英数字に隣接した状態ではArial、ゴシックに隣接するとゴシックで表示されるという挙動をとります。



隣接するのが「a」でもU+0531でも違いはありません。

ここでU+263AをU+2639に替えてみます。この文字はArialには無いという点がU+263Aとは異なります。デフォルトおよび半角英数字との隣接では豆腐になります。


U+0531との隣接で違いが出ました。「半角英数字との隣接」は「Arialとの隣接」と言い換えるべきかなと思いました。
問題は7と8RPで表示されるものが異なることです。8RPの字形はSegoe UI Symbolです。


U+0531のフォントが違うからかもしれません。
7のSegoe UIにアルメニア文字はありませんでした。TahomaからフォントリンクでMS UI Gothicということかも。U+2639の字形はMSゴシックもMS明朝もMS UI Gothicも一緒です。

次にCJKフォント変化の中で異なるケースを見てみます。下図の3・4・5段目は先頭にU+3016というSimSun化文字を置いています。SimSunにU+263Aは無いため代替表示が起こります。


U+263Aは単独でU+3016に接するとSimSun化の影響を受け、「a」に接するとArialに戻り、後ろにCJK文字「あ」が接すると再びSimSun化の影響を受けています。
7ではSimSunのフォントリンクによりMS P明朝が代替表示されていると思われます。
MICROSS(Microsoft Sans Serif) ・PMingLiUにU+263Aはありません。


ところが8RPで表示されているのはSegoe UI Symbolの字形です。


なぜかと考えたのですが、SimSunのフォントリンクが参照されないということはこのU+263AにSimSunは適用されてないんでしょう。でもSimSun化の影響でフォントが変化していることに間違いはありません。
「SimSun化の影響によるSegoe UI化」とでも言うしかないです。

どうしてこんなことにこだわるのかと言えば、実際のコメントで使われそうな特殊文字の領域でこうした差異が発生しているからです。最後に、さらに7と8RPで異なるケースを見てみます。

今度はU+2641という文字です。これはArialに無く、7でのデフォルトはMSゴシック(か明朝かUI Gothic、区別はつきません)です。SimSunにも無いので上と同じく代替表示が起きます。


7のSimSun化で字形がずいぶん違いますが、これはPMingLiUの字形です。


8RPでは単独で「あ」と接したケース以外すべて7と字形が異なります。これもSegoe UI Symbolなのかなと思います。こうして見るとほんとカオスですけど、むしろ挙動の比較ができることでフォント変化という謎現象が見えやすくなるのかもという気もします。

ところで話題のMicrosoft Surface、いいですね!8はデスクトップで使うつもりなのでRTを買ってしまうかもしれません。しかし今さらですが、RTの搭載フォントってどうなってるんだろう?
8とRTとでまたコメントの表示が違ったら、おもしろ・・・困りますねー

2012年6月11日月曜日

VBA:URLを既定のブラウザで開く

VBAから任意のURLをブラウザで開こうとするとき、ExcelならHyperlinkのFollowというメソッドがあります。

Private Const URL = "http://bardiel-of-may.blogspot.jp"

Public Sub TEST()
    ActiveSheet.Hyperlinks.Add(Anchor:=Range("A1"), Address:=URL).Follow
End Sub

URLは既定のブラウザで開くようです。ブラウザが起動していれば新しいタブで開きます。

しかし、これだとセルに書き込みをしないとできません。既に使用されているシートでは危険です。かと言って、そのために新規のシートを追加して後で削除するとか、そのためにDisplayAlertsをFalseにしてTrueに戻すとか、それをユーザーに見せないためにScreenUpdatingをFalseにしてTrueに戻すとか・・・よけいな処理もあんまりやりたくありません。今までは下記のようにやってました。

Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate (URL)

既定のブラウザがなんであれIEで開くんですが。
また、実行するたびに新しいIEが起動してしまいます。それについては下記のように対処してました。

Dim objShell As Object
Dim objWindows As Object
Dim objWindow As Object
Dim objIE As Object

    Set objShell = CreateObject("Shell.Application")
    Set objWindows = objShell.Windows()
    'IEが開いているか探す
    For Each objWindow In objWindows
        If StrConv(objWindow.FullName, vbUpperCase) Like "*IEXPLORE.EXE" Then
            Set objIE = objWindow
            Exit For
        End If
    Next
    '開いていなければ起動
    If objIE Is Nothing Then
        Set objIE = CreateObject("InternetExplorer.Application")
        objIE.Visible = True
    End If

    objIE.Navigate (URL)

ただし「IEが開いているか探す」の部分は、状況によってはエラーになります。Outlookで引っかかったのですが、WindowオブジェクトにFullNameが無いケースがあるようです。
と言うか、この後IEを操作するならともかくURLを開くだけならもっとかんたんにできんのか?

それにユーザーがふだんIEを使っているとは限りません。
やはり既定のブラウザで開くようにしたい。レジストリで取得できるみたいですけど:

ShellExecute を使用して、既定の Web ブラウザーを起動するには - Microsoftサポート

あらためて調べたら、こんないろいろ考えなくてもいい方法がありました。

Run メソッド - MSDN

Dim objWSH As Object

    Set objWSH = CreateObject("WScript.Shell")
    objWSH.Run URL, 1

これだけで既定のブラウザで開くようです(起動してる場合は新しいタブで開く)。2つ目の引数でウィンドウの状態も指定できます。もっと早く知るべきでしたw

2012年6月3日日曜日

Windows 8 RPで見てみた

Windows 8 Release Previewなかなか快適です。
DP版のときはMetroが嫌でオフにして使っていました。7の動作がちょっと苦しい古いマシンに入れてますが、デスクトップUIだけだとかなり軽快でした。CP版ではそれができず、起動もMetroの動作もちょっとモッサリ感がありました。RP版ではそのようなストレスを感じません。

CP版を使っているうちにMetroにも慣れてしまったので、たぶん新しいマシンに入れたら7よりこっちを使いたくなるでしょう。UIの変貌ぶりがいろいろと揶揄されることもありますが(自分も当初はそうでしたw)、そうした予想に反して意外と成功するんじゃないかなという気がしてます。
あとはMetroスタイルのアプリがどれだけ充実していくかじゃないでしょうか。それまではデスクトップ側がメインで、Metro側はランチャー+おまけ的にMetroアプリみたいな使い方になると思います。

さてニコニコです。
まだIEとFirefoxしか試してませんが、デスクトップ側でFlash Playerをインストールすればふつうに見れます。

6/9追記:
一昨日MetroのIEでも見られるようになっているのに気づきました。MetroのIEに組み込まれたFlash Playerは決められたサイトでのみ有効になるという話でしたが、ニコニコもそのサイトとして指定されたんでしょうか。

コメントの表示については今のところCP版と変わらないように見えます。あくまでベータ版だからと考えていた未知の挙動は、結局このまま製品版の仕様になるんじゃないかと・・・仕組みはわからないですけど。


この件についてあらためて簡単に書いておきます。上の図はブロック文字U+2588でSimSun化したコメントです。ニコニコマーク(U+263A)はSimSunにありませんので別のフォントのグリフが代替で表示されます。
下図はSimSunのフォントリンクで、7も8も内容は同じです。


Microsoft Sans Serif(MICROSS)・PMingLiUにU+263Aはありません。結果としてMS P明朝のグリフが表示されるはずで、7の表示は正にその通りです。 しかし8の方は後ろに「あ」をつけると別のものが表示されています。これはおそらくSegoe UI Symbolであろうと思われます。


文字によってこの挙動は起きなかったり、「あ」をつけなくても起きたりします。デザインが違うだけならともかく、コメント幅まで変わってしまうのが問題です。このまま製品版の仕様になるのであればパターンを突き止めてみたいです。

そのSegoe UISymbolですが、DPからCPにアップグレードした際は字数が増えるととともに特徴の一つであるケータイ絵文字(拡張領域)のデザインが一新されたりしました。今回そのような大きな変化は無いようです。
下表はバージョンごとの収録文字数の変遷です。

Segoe UI Symbol 5.00(Win7) 5.33(8DP) 5.46(8CP) 5.55(8RP)
BMP領域 2,693 3,564 3,695 3,807
拡張領域 171 983 1,397 1,410
2,864 4,547 5,092 5,217

BMPで増えているのは主に私用領域で、下図はその一部です。Metroアプリ用のアイコンか何かでしょうか。


拡張領域でちょっとだけ増えているのは顔絵文字でした。あいにくコメントで表示はできませんでした(何をやっても豆腐化)。


ユニコード6.1以降で使用できる顔型絵文字 - 世界の特殊文字ウィキ

Unicode 6.0の絵文字はだいたい表示できるので、何が違うのか気になります。