MS Access Tips/Sample and VBA and Blog customize etc...

使用できるフォント名を列挙

AccessClub の掲示板のスレッド レポートをいろいろなフォントで印字したい で使用できるフォント名を列挙する方法についていろいろ紹介されています。

まず、RURI++ さんのところの フォント名取得 は、AC97用のようで、私のAC2003では使えませんでした。

記事No:150094 でNull さんが紹介している Excel のCommandBarComboBoxを利用する方法は動作しました。しかし、Excelを呼び出す為、かなり重いです。

記事No:150273 で紹介されている Access の CommandBarCombobox を利用する方法は、エラーになりました。よく考えてみたら、コマンドバーをカスタマイズして、フォントコンボボックスを移動させていました。元の「書式設定」コマンドバーに戻したら表示できました。ユーザーがカスタマイズしていると、動作しない可能性があります。また、AC2007 だと動作しないようです。

そこで、APIを使って列挙する方法を調べてみました。

難易度:

標準モジュール

以下の使用例はAccessですが、Access以外のExcel、Word等のOfficeアプリでも使用出来ます。

使用例

フォーム1 にコマンドボタン コマンド0 とリストボックス リスト1 を配置。
リスト1 の値集合タイプは「値リスト」に設定。

これで、リストボックスにフォント名が表示されます。

このままでは並び順がバラバラなので、配列を昇順または降順に並べ替える関数 を使って昇順に並べ替えて表示するようにしてみました。

サンプルMDB が下記からダウンロードできます。
GetFontNames_07.zip (Access 2007-2010 形式 - 35kb)
GetFontNames.zip (Access 2002-2003 形式 - 32kb)
GetFontNames_2k.zip (Access 2000 形式 - 31kb)

拍手する

5 Comments

nomo says..."「型が一致しません」とでてしまいます。"

いつも素晴らしいコードを活用させていただいております。
このコードが動きません。サンプルをDLぢても同じです。
Win7 pro 64bit Access2013 です。(PtrSafe は追加済み)

Ret = EnumFonts(DeviceContextHandle, vbNullString, AddressOf FontEnumProc, 0)

AddressOf FontEnumProc
 ↑ で反転、型が一致しません、となります。

PC側で何か足りていないのでしょうか。




2016.04.16 19:45 | URL | #Zt97O8Ak [edit]
hatena says..."re:「型が一致しません」とでてしまいます。"

> このコードが動きません。サンプルをDLぢても同じです。
> Win7 pro 64bit Access2013 です。(PtrSafe は追加済み)

Access は 64bit版ですか。だとすると、PtrSafe だけでなく型宣言も変更する場合があります。下記を参考に変更してください。

Office 2010 の 32 ビット バージョンと 64 ビット バージョンとの互換性
https://msdn.microsoft.com/ja-jp/library/office/ee691831%28v=office.14%29.aspx?f=255&MSPPError=-2147217396

2016.04.17 08:30 | URL | #5uE6dEgY [edit]
nomo says..."re:re:「型が一致しません」とでてしまいます。"

hatenaさん
ありがとうございます。

> Access は 64bit版ですか。だとすると、PtrSafe だけでなく型宣言も変更する場合があります。

64bitです。敷居が高かったー!

LongLong型、LongPtr型に置き換える必要があるようですが、ご提示のURL、何が何やら・・・です。
APIの勉強もせずに手っ取り早く検索して諸先輩のコードを拝借しようという根性がいけません。反省。

”どのような場合に Long パラメーターをLongPtr に変換するのですか。”

”Microsoft Developers Network の Windows API のドキュメントで、呼び出す関数について確認する必要があります。ハンドルとポインターは LongPtr に変換する必要があります。例として、RegOpenKeyA の説明では以下のシグネチャを示しています。”

この「ドキュメント」の見方がまたわからず。(悲)

とりあえず、
#If VBA7 And Win64 Then
' 64Bit 版
Public Declare PtrSafe Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long
Public Declare PtrSafe Function ReleaseDC Lib "user32" ( _
ByVal hwnd As LongLong, ByVal hdc As LongLong) As LongLong
#Else
' 32Bit 版
Public Declare Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" ( _
ByVal hwnd As Long, ByVal hdc As Long) As Long
#End If

として

ArySort ary

をいれずに一瞬動いたように思ったのは気のせいか?
上の全部を「LongLong」に変えると今度は「GetDC Lib」でエラーとなるので、めったやたらと変えればいいと言う訳でもなさそう。
もう少し格闘してみます。

2016.04.17 13:15 | URL | #Zt97O8Ak [edit]
hatena says..."re:re:re:「型が一致しません」とでてしまいます。"

今回のAPIの件以外にも、64bit版にはいろいろ制限や不具合があるようなので、当方ではまだ64bitは時期尚早と判断して32bit版環境しかないので、確認する手立てがありません。

また、APIと64bitに関する関係の情報も少なくて、これといった明確な情報が見つかりません。

とりあえず見た情報から、ハンドルやポインター関係の変数は、LongPtr に変更するということぐらいしか分かりませんね。

とりあえずそのへんを LongPtr に変換してうまく動くのを、手探りで探すしかなさそうです。

2016.04.17 15:35 | URL | #5uE6dEgY [edit]
nomo says..."re:re:re:re:「型が一致しません」とでてしまいます。"

hatenaさん
できました。

やはり一瞬動いたのは気のせいではありませんでした。
その後同じAccessファイルでLong型をLongLong型に変更しましたが、
何をどうやっても「動作を停止しました」となり落ちてしまう現象でした。
諦めかけて、hatenaさんのサンプルで型変更を行ったらあっさり
動きました。

自分のAccessファイルに戻ると駄目。
モジュールをサンプルから移植しても駄目。参照設定を全て同じにしても駄目。

試しに自分のフォームをサンプルに移したらこれまたあっさり動きました。

原因はこれ → 「 Access2010 SP1適用後に発生する現象について 」
http://answers.microsoft.com/ja-jp/office/forum/office_2010-access/access2010/463924d6-fab6-46e3-ba94-2179d1a9239b

当方は2013ですが、デコンパイルを(なぜか2回やらないと駄目)したら
動きました。

MukkuMukuさんに感謝です。

最終的には、以下の感じです。


 ↓ これ以外の全てのLong型をLongLong型に変更でいけました。
   これだけはLongLong型に変更するとまたまたクラッシュ。

Public Declare PtrSafe Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long

それ以外では、フォームの「コマンド0_Click」においても、

Dim Ret As Long

  ↓

Dim Ret As LongLong

vbsで取る方法などあれこれ別の方法も当たってみて最終的には.NETしか
ないかなーと思っていたところ、冷静になってイベントビューアを眺めた
結果の出来事でした。

お騒がせ致しました。

hatenaさんも色々当たって下さったようで、申し訳ありませんでした。

コード有難く使わせていただきます。

ちなみにvbsで取ったら、1分近くかかり、泣きました。
有難うございました。

2016.04.18 16:25 | URL | #Zt97O8Ak [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/193-0c9a9884
該当の記事は見つかりませんでした。