2012年7月26日木曜日

Excel 2013 Preview:Bing Mapsを使ってみた

Windows 8 RP入れてるマシンにOffice 2013プレビューをインストール、ちょっといじってみました。
とりあえずExcelですが動作はけっこうぬるぬるでいい感じ。ただ、白っぽくてリボンのアクティブなタブが見づらい気がしました。2010みたいな「配色」のオプションはありません。製品版もこのままなんだろうか。


代わりに「背景」ってあったんですけど右上になんか模様が出るだけでした。


まぁ慣れなのか。ちなみにこの右上には全画面表示のボタンが追加されています。


これは便利でした。2010でも表示タブに「全画面表示」がありますが、単にシート部分がフルスクリーンになるだけです。2013ではフルスクリーンの状態から画面上部をクリックすると、リボンが表示されて使うことができます。シートに戻るとリボンは消えます。

さて、タッチスクリーンは持ってないのでその辺の新機能は試しようがありません・・・というか今のところタッチ機能に興味はありません。まず気になってたのは挿入タブに追加された「Office用アプリ」でした。


JavaScriptなどWebプログラミングを利用して機能を拡張する、今風のアドインというところでしょうか。
アプリはWebブラウザでストアから追加しておきます:Store - Office.com
同じアカウントでサインインしていれば追加したものが表示されます。


試してみたかったのがBing Mapsというアプリでした。 Bingの地図が図形オブジェクトのように挿入されます。


英語ですが。

左上にサンプルのデータを用意してあります。地名は日本語の県名にしてあります。
このデータ範囲を選択して、挿入されたBing Mapsのピンアイコンをクリックします。


すると地図が勝手に日本の関東近辺へ移動してズーム、グラフが作成されました。


英語の地図なのに日本の都道府県名くらいは判別できるんですね。
もっとも、この後東京23区も試してみたらさすがに無理のようでした。

あくまで無料のお試し版でオプションは少ないです。いずれもっと機能を搭載した有料版としてリリースされるんだろうか。


図形オブジェクトと同様に移動やサイズ変更もできるし、地図自体も縮尺を変えたりドラッグで移動したりできます。いろいろと使いみちありそうです。


こういうおもしろそうなものが次々と提供されるなら、バージョンアップしたくなるかもなと思いました。
その他の新機能はまだよく見てません。

2012年7月23日月曜日

Windows 8 RP:SimSunの差分

Windows 8 DPでフォントのバージョンを見た際、SimSun・Gulim・PMingLiUは7と同じでした。製品版の時にでもバージョンアップするのかなと勝手に思ってたのですが、ふとRPでSimSunのバージョンが上がってるのに気づきました。なぜか収録文字数が若干減ってました。
下表はSimSunの5.03(Windows 7)と5.04(Windows 8 RP)を比較したら消えていた文字です。

Unicode 字形 範囲名
1E3F ḿ ラテン文字拡張追加
9FB4 CJK統合漢字
9FB5 CJK統合漢字
9FB6 CJK統合漢字
9FB7 CJK統合漢字
9FB8 CJK統合漢字
9FB9 CJK統合漢字
9FBA CJK統合漢字
9FBB CJK統合漢字
FE10 縦書き形
FE11 縦書き形
FE12 縦書き形
FE13 縦書き形
FE14 縦書き形
FE15 縦書き形
FE16 縦書き形
FE17 縦書き形
FE18 縦書き形
FE19 縦書き形

U+1E3FはSimSunでこの範囲に唯一あった文字で、むしろ7ではなぜ収録されていたのか謎です。何か別の文字の代替にでも使われてたのでしょうか。


まぁコメントで使われることは無いと思いますけど(CJK統合漢字の8文字も)。
縦書き形の10文字は、デザイン的に使われることがあるかもしれません。8RPでは全部豆腐です。


7では単独でSimSunが表示されているのですが、これらがSimSun化文字というわけではありません(ちなみにWindowsコードページに定義はありません)。8RPの豆腐の形から、これらはMicrosoft Sans Serifのフォントリンクで表示されているのだろうと思いました。


調べてみると、フォントリンク先になっている他のCJKフォントにこれらの文字はありませんでした。
試しに7でフォントリンクからSimSunを削除すると8RPと同じ表示になりました。


なんでMicrosoft Sans Serifなのか、その事の方が気になりましたが。
しかし表示されていた文字がバージョンアップで無くなることもあるんですね(ニコニコプレーヤーで表示されない他のフォントには収録されています)。侮れないなと思いました。

2012年7月19日木曜日

Excel 2010×2003:テキストボックスの文字色がズレる

そう言えばWindows 8 RPにOffice 2013入れてみたのですが、まだ全然いじってません。とりあえず白っぽくて見づらいな(特にリボン)と思いました。
新機能がいろいろ気になるので、時間がある時に遊んでみたいと思います。

さて、ちょっと変なことがあったので。
下図はExcel 2003上のテキストボックスに文字を入れたところです。半角英字の部分だけ色を変えました。


ここで半角英字の前に改行を入れ、保存して閉じます。


このファイルを2010で開いてみたところ。


特に問題ありません。何も変更を加えず、上書き保存だけして閉じます。
ところがこれを再び2003で開いてみると、おかしなことになってました。


英字部分の文字色が途中まで黒に戻っています。2010で開くと元の通りで変化はありませんでした。

調べてみたところ、常にこのような現象が起きるわけではないようでした。たぶん条件としては、

  • 全角文字+半角文字(2バイト文字+1バイト文字?) の組み合わせ
  • 半角文字の前に改行
  • 半角文字のみ文字色を変更

ということみたいでした。改行がポイントっぽいところがおもしろいなと思いました。
初めに2010で作った場合、このような差異は発生しないようでした。

翌日追記:
ふと、Excelのメニューの文字列にはところどころにU+200B(ゼロ幅文字)が挿入されていることを思い出しました。あれってもしかして、表示上のなんらかのバグを回避するためのものなのでは・・・まぁわかりませんけど。

試しに上のケースで半角文字の前にゼロ幅文字を入れてみました。
U+200Bを入れると2010でもズレて、その後2003で開くとさらにズレてました。
ところがU+200C(同じくゼロ幅文字) を入れてみたところ、この現象は起きなくなりました。実際ちょっと困ってたのでこれで解決です。仕組みは不明なままですが、実に興味深いので覚えておこうと思います。

2012年7月9日月曜日

BabelMapが便利すぎる

BabelStone : BabelMap (Unicode Character Map for Windows)

この名前は前から知っていたのですが、パッと見よくあるフォントビューアかな?+英語だからよくわかんないや、と試してませんでした。先日たまたま再び見かけてふと試したところ、とんでもない、かなり高機能なツールでした。フォントに関してちゃんとした知識があるわけではないですけど、それでも少しいじっただけでコメントのフォントを調べるのに使えそうな機能をいくつか見つけることができました。

メインの画面には文字一覧や検索欄が配置されています。文字一覧で任意の文字をクリックすると、一番下のボックスへ入力されます。この部分のテキストは自由に編集することができて、文字を文字コードへ変換したりクリップボードへコピーしたりすることもできます。


代替表示がされてしまうフォントビューアだと、表示の字形が指定したフォントのものかどうか区別がつきません。しかしこの一覧はフォントのCMapデータに基づく表示であるようです。

上のメニューで、その他様々な機能を持ったサブ画面が開くようになっています。
まず便利!と思ったのがFont Coverageという画面です。文字コードや文字列を指定して、その文字のグリフを含むフォント名を一瞬で抽出してくれます。


Composite Font Mappingsという画面では、Unicodeのブロックごとに文字数・対応フォント・各フォントに含まれる文字数などのデータや、実際に表示させた場合のサンプルを見ることができます。


またFont Informationという画面ではフォントのバージョン情報などの他、CMapを取得することもできます。


「Copy CMAP Subtable」 をクリック後、Excelへ貼りつけたところ:


これまでは、MicrosoftのTTFDumpというツールで一々フォントファイルから書き出していました。こんな簡単にできるものがあったとはw

Export Font Glyphsという画面はグリフを画像として出力するためのもののようですが、フォントを変更しながら指定した文字の拡大した字形を見ることができます。


拡張領域にも対応しているので、Windows 8では大量に追加された絵文字などを見たり調べたりするのにも使えます。


話がそれますけど、来年Windows 7のSP2が来るんじゃないかという話をどこかで読みました。
もし本当なら、その時にフォントのバージョンアップでこの絵文字なども対応してくれないかなぁと期待しています。8のユーザーは絵文字の存在に気づいたら、(コメントに限らず)使いたがるんじゃないかと思うからです。現在のままだと7以前では豆腐だらけになってしまいます。

これでコメントのフォントを調べるのがだいぶ手軽になるように思います。いろいろ勉強になったとは言え、今までずいぶん無駄なことをやってしまいました。もっと早く試すべきでした。

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