AIと戦って、あなたの人生のリスク診断 >>

2万件-3万件位の顧客マスターをACCESSで構築したいと思っています。この程度の件数であればACCESSで十分安定して稼動できますかね?
アクセスのデータベースがどの程度のレコードまで安定して取り扱えるのか
ちょっとピンときません。
安定を第一に考えているので、経験ある方教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

当方はACCESSで


200万レコードを扱います
※これは 猟奇的・・・狂気的です
予算がないとか、時期課題とかで 逃げ切られますが
やはり、個人的には他のDBMSに移行予定でおります

200万件扱っての問題点は
何をするにも 時間がかかる
1クリック2時間3時間・・・時に 応答なし
最適化もかかりづらくなってきますので やはり3万件くらいまでかなと思います※レコード長によりますが
メンテナンスも楽にしたいですよね・・・
    • good
    • 0

今までmdbをメインに使ってきてるんですが、大丈夫と思いますよ(^o^)



もしデータが増えて重くなりすぎたら、内容は全く同じmdbを続きのmdbとして作って、データ抽出したり、更新、削除する時は、ユニオンで結合して処理するという方法もありますよ。
    • good
    • 0
この回答へのお礼

やはり、業務の性格にもよりますし
一概には言えないようですが、
そこそこには使えているというのが
現状の様ですね。
参考になりました。

お礼日時:2001/10/09 09:35

2万件や3万件程度ならAccessでも扱えますが利用体系によってはAccessは不向きな物になると思います。


なお、複数端末でMDBファイルを使うような場合は不向きです。
ちゃんとしたDBMSを導入しましょう。

個人的に管理したいと言うならバックアップも考慮して使う分には問題ないでしょう。

確認ですが貴方の「十分安定して稼動できますよね?」とは定量的に書くとどうなるのですか?

なお真面目に仕事用でサービスするためのDBとして作るならまともなDBMSを考えることをお勧めします。

トラブルが発生しても顧客に迷惑のかからないシステムならまあAccessでもいいのですが迷惑をかけると迷惑料+信頼を失う事になるのでこのあたりは慎重になって頂きたいと思います。
    • good
    • 0
この回答へのお礼

単一端末です。業務で使用します。
定量的には5年に1回-2回程度のトラブルなら
OKかなあと。
一応、サーバーにきちんとしたマスターのDB
がありまして、ACESSのDBはローカルのオフラインのPCで持つサブセットとしてのDBとなります。
万一破損し、ローカルで復旧出来ないときは
サーバーにて作り直して渡すといった形になると
思います。即時性はそれ程求められないので
信頼性とコストとの兼ね合いで決めなくてはと
思っております。
やはりきちんとしたDBMSとの差は歴然とありそうですね。参考になりました。

お礼日時:2001/10/09 09:33

件数的には問題ありませんが、


安定を第一にということなので、Accessはやめておいた
ほうがよろしいかと思います。
経験上、MDBの破損は極稀に起こります。
やはりORACLEやSQLServer等の使用をお勧めします。
    • good
    • 1
この回答へのお礼

なるほど。
安定第一というとやめた方がよろしいですね。
mdb破損時、復旧までの業務のロスとの
兼ね合いもありますね。
参考になりました。

お礼日時:2001/10/09 09:25

こんにちは。

maruru01です。
経験上では、2~3万件は問題ないと思います。
10万件程度でも一応動きますが、クエリーとか検索とかにやたら時間がかかる場合があります。(マシンにもよりますが)
まあ、5万件を越えるようなら、もっと大規模のデータベース(SQL Serverなど)を利用した方が無難ですね。
あとは、一度に全データを使用(検索、出力など)しないなら、データテーブルを適当なサイズに分割して別のファイルに分散しとけば、安定稼動が望めます。
では。
    • good
    • 0
この回答へのお礼

ありがとうございます。
出来るだけレコード長を小さめに数万件程度に
抑えてみたいと思います。
5万件がひとつの目安ですね。
多分3万は超えない予定です。
マスターとして主キーでの参照と、
少しずつ更新と追加が発生しそうです。
更新・追加繰り返すと最適化を時々した方が
良いみたいですね。
コードが不明の時、カナ名前等での検索も
ありそうです。もう少し研究してみます。

お礼日時:2001/10/05 16:00

顧客マスターの持ち方等の研究をされればOKと思います。


例えば県名は持たず県コードにするみたいにデータを重複して持たない工夫
また適度に最適化をすることです
私は10万件を振り回してます。
若干レスポンスが遅いが安定しています。
全てデータ構造に尽きます。

がんばって作成して下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました。
同じレコード件数でもレコード長などにも
影響しますかね。短いほうが良いとか?
10万件でも動くことは動くみたいですね。
参考になりました。

お礼日時:2001/10/05 15:56

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。

QAccessの最大レコード数

Excelでの登録できるレコード数は最大で65000ぐらいだったと思いますが、Accessでは最大どのぐらいでしょうか?
お願いします。

Aベストアンサー

エクセルの行数は65536行となります。
アクセスはバージョンによると思いますが、2000の場合は以下のようになります。

MDBファイル容量・・・・・・・・・・2GB以内
テーブル・クエリ・フォームの合計 ・32768個
同時使用ユーザ数 ・・・・・・・・・255
1テーブル内のフィールド数・・・・・255
同時に開くことができるテーブル数 ・2048
1テーブルの容量・・・・・・・・・・2GB

1テーブルで2GBという容量を超えなければ、レコード数の制限はないということのようです。

QなぜAccessのファイル用容量は2G?

AccessとFilemakerを比較したサイトがFilemakerのサイトにあり、見ていました。
http://www.filemaker.co.jp/downloads/pdf/comparison_fm_access_jp.pdf

データベースの容量で、Accessは2G、Filemakerは8テラみたいな事を書いています。

マイクロソフトも技術的にはFilemakerを凌ぐソフトを作ることができると思うのですが、なぜデータベースの容量はファイルメーカーに負けているのでしょうか?

Aベストアンサー

マイクロソフトでFilemakerにあたるものはSQLSetverです。こちらですとテラバイトをサポートしています。しかもFilemakerより大企業で使われています。
Appleはサーバーと言うものを大々的に売っていません。マイクロソフトはWindowsサーバーが主流でこれに対応するようにSQLServerが動くように出来てます。今のデーターベースソフトのシュアはSQLServerとOracleが殆どを占めています。
個人向けにはAccessが一番売れています。ただし大きな情報を扱う個人はSQLserverのExpressエディションというものが無料でダウンロードできます。
http://www.atmarkit.co.jp/fwin2k/tutor/sqlexplmt/sqlexplmt_01.html
ただし、SQLやRDBを勉強しないと当然使えませんし、ライセンスの制限があります。容量も制限されています。正しくは有料のエディションを買うべきでしょう。
そう、Accessは厳密にはRDBではないのです。Accessはあくまでもデーターベースソフトに見せかけたファイルシステムなのです。この差は壊れやすい、遅いなどの不都合があるという事です。
本当に確実なシステムを作成する人はSQLServerを使います。
SQLServerはAccessにつなぐ事も出来、AccessのテーブルをSQLServerにつなげることでAccessを入力画面にしてSQLServerに格納することができ、複数の人と使用できます。
ただしこの方法では何れシステムは破綻することになります。正しい制御が出来ないからです。Accessから乗り換えた人の殆どはここで躓きます。
最初からSQLserverを前提に考えたほうが良いでしょう。

マイクロソフトでFilemakerにあたるものはSQLSetverです。こちらですとテラバイトをサポートしています。しかもFilemakerより大企業で使われています。
Appleはサーバーと言うものを大々的に売っていません。マイクロソフトはWindowsサーバーが主流でこれに対応するようにSQLServerが動くように出来てます。今のデーターベースソフトのシュアはSQLServerとOracleが殆どを占めています。
個人向けにはAccessが一番売れています。ただし大きな情報を扱う個人はSQLserverのExpressエディションというものが無料でダウ...続きを読む

Q300万件のデータの処理について

お世話になっております。
仕事上300万件以上のデータを分析しなくてはいけなくなりました。
Excelだと65000位しか並べることができませんよね。
Accessであればやったことはないですが、恐らく300万件のデータの処理は可能だと思います。
選択肢として、Access以外であれば300万件のデータを処理するには何のソフトを用いるといいのでしょうか?
Accessより処理能力が高いデータベースというのが理想です。
やはりSQLサーバーやOracleっていうやつになるのでしょうか?
宜しくお願いいたします。

Aベストアンサー

分析と言うのが、一時的な業務であるのなら、Accessは手軽だし良いかも知れません。
今後、度々分析を行う可能性があるのであれば、しっかりとしたDBを利用した方が良いと思います。

手軽なところで、PostgrSQLやMySQLを入れてみるのはいかがでしょうか?
フリーソフトではマズイ。と言う事であれば、Oracleが良いと思いますが、結構高価です。
個人的には、PostgrSQL辺りを導入するのが良いのでは無いかな。と思います。

Qアクセスからエクセルファイルを開きたい

アクセスのフォームに作ったボタンから、特定のエクセルファイルを開きたいのですが、どういったマクロを作成したらいいでしょうか?
使用しているのはWindows98、Access97、Excel97です。
ご存知のかた、よろしくお願いします。

Aベストアンサー

目的が、「データを見たい」のであれば、
#1さんのおっしゃるとおりです。

目的が、「Excel を開きたい」のであれば、
マクロの、アプリケーションの実行で、コマンドラインに、
「ディレクトリ:フォルダ\excel.exe 開きたいファイル名」
を入力し、実行すれば、excelで開くことができます。

(例)excel97だとちょっと違うかも。。。
C:\Program Files\Microsoft Office\Office\EXCEL.EXE x:\aaa.xls

excel.exe がどこにあるかわからない場合は、
excel のショーカットを右クリックし、プロパティを選択、
リンク先をみてください。(win98だとちょっと違うかも。。。)

頑張って下さい。

QAccessからExcelのファイルを起動する

Accessのフォーム上にボタンを作成して
クリックすると特定のExcelのファイルが起動する
ようにしたいのですが、簡単な手はありませんか?

Aベストアンサー

こんにちは。maruru01です。

Shell関数を使って、

Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE ファイル名"

とします。
ちなみに、Excelの実行ファイルのパスは環境によって違ってきます。

あと、Excelの実行ファイルのパスがわからなくても、ファイルに関連付けられたアプリケーションで開くには、API関数のShellExecute関数を使用します。
API関数については、WEB上で検索して下さい。
このサイトの過去の質問でもヒットするかも知れません。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

Qフォントの大きさ

Msg_box 関数 でメッセージを出力しているのですが
マーク(注意、警告 etc)を用いての表現の方法しかないのでしょうか?
 例えば メッセージのフォントのサイズを各々メッセージによって
     変えれないのでしょうか?
初歩的なご質問で申し訳御座いません
宜しくお願いします

Aベストアンサー

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃                ┃
┃   ┏━━┓  ┏━━┓   ┃
┃   ┃B1┃  ┃B2┃   ┃
┃   ┗━━┛  ┗━━┛   ┃
┗━━━━━━━━━━━━━━━━┛
[I]・・・アイコン(クラス名:Static)
[MSG_AREA]・・・メッセージ表示領域(クラス名:Static)
[B1/B2]・・・ボタン(クラス名:Button)
という構造になっています

メッセージボックスは指定のスタイルによりアイコンの有無・ボタンの数が変化します。
また、メッセージ文字数により、メッセージの表示領域が変更され、ダイアログのサイズも算出されます。
しかもこの大きさの計算は、ダイアログオブジェクトが創生される前に行われるため、フォントを指定したあと、独自で再配置をしなければなりません。この計算ロジックは非常にややこしいものです。


※VBのMsgBox関数(またはAPIMassegeBox関数)内部で行われていると思われる手順(フックしてSpyで調べました)
1.MSGの文字数/ボタンの数/アイコンの有無により、ダイアログの大きさの算出・各オブジェクトの配置位置の算出
2.ダイアログ本体を創生
3.ボタンをダイアログ内部に創生(複数のボタンが存在するとき、左側のボタンから創生)
4.アイコンがあるならアイコンを創生
5.メッセージを創生
6.ボタンにフォーカスをセット
7.画面に表示する(サンプルではここで操作しています)
という順序のようです。


サンプルは、画面に表示する直前にフォントを指定しています。上記で述べたとおり、各オブジェクトはすでにできあがってしまっているので、再配置が必要になります。(サンプル内のsetResize関数を作りこんでください)


以下を標準モジュールに貼り付けて、Sub Mainから実行するようにしてください。
[myMsgBox関数]がオリジナルMsgBoxを呼ぶための関数です。



Option Explicit

Public Const WH_CBT = 5

'太文字([400/700]にしているけど、フォントによって違うかも?)
Public Enum MY_BOLD
  MYB_FLASE = 400
  MYB_TRUE = 700
End Enum
'斜体
Public Enum MY_ITALIC
  MYI_FLASE = 0
  MYI_TRUE = 1
End Enum
'下線
Public Enum MY_UNDERLINE
  MYU_FLASE = 0
  MYU_TRUE = 1
End Enum
'取消し線
Public Enum MY_STRINKEOUT
  MYS_FLASE = 0
  MYS_TRUE = 1
End Enum


Public Const HCBT_ACTIVATE = 5 ' ウィンドウがこれからアクティブになる通知メッセージ

Public Const WM_SETFONT = &H30 'フォントを指定
Public Const WM_GETFONT = &H31 'テキストボックス、ラベル等が現在使っているフォントのハンドル

Public Const LF_FACESIZE = &H20
Public Const POINT_PER_INCH = 72
Public Const LOGPIXELSY = 90 '縦方向の1論理インチあたりのピクセル数

Public Const HWND_TOP = 0
Public Const HWND_BOTTOM = 1
Public Const HWND_TOPMOST = (-1)
Public Const HWND_NOTOPMOST = (-2)
Public Const SWP_NOSIZE = &H1&
Public Const SWP_NOMOVE = &H2&
Public Const SWP_NOZORDER = &H4&
Public Const SWP_NOREDRAW = &H8&
Public Const SWP_NOACTIVATE = &H10&
Public Const SWP_FRAMECHANGED = &H20&
Public Const SWP_SHOWWINDOW = &H40&
Public Const SWP_HIDEWINDOW = &H80&
Public Const SWP_NOCOPYBITS = &H100&
Public Const SWP_NOOWNERZORDER = &H200&
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Public Const SWP_NOREPOSITION = SWP_NOOWNERZORDER


Public Type LOGFONT
 lfHeight     As Long 'キャラクタの高さ
 lfWidth      As Long 'キャラクタの幅(0 で標準的プロポーション)
 lfEscapement   As Long '相対的出力角度(単位:1/10度)
 lfOrientation   As Long '回転角度(単位:1/10度)
 lfWeight     As Long 'キャラクタの線幅(FW_BOLD, FW_NORMAL)
 lfItalic     As Byte 'イタリックの時 Chr$(1)、通常 Chr$(0)
 lfUnderline    As Byte 'アンダーライン付きの時 1
 lfStrikeOut    As Byte '横線付きの時 1
 lfCharSet     As Byte 'キャラクタセットの指定
 lfOutPrecision  As Byte '常に OUT_DEFAULT_PRECIS = 0
 lfClipPrecision  As Byte ' 同上
 lfQuality     As Byte 'DEFAULT_QUALITY, DRAFT_QUALITY, PROOF_QUALITY
 lfPitchAndFamily As Byte 'DEFAULT_PITCH,FIXED_PITCH, VAIABLE_PITCH
 lfFaceName    As String * LF_FACESIZE 'タイプフェース名
End Type

Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByRef wParam As Long, ByRef lParam As Any) As Long
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hMod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal uFlags As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long


Private mHookProcWnd  As Long 'フックプロセスハンドル
Private mFontHandle   As Long '作成したフォントハンドル

Public Sub Main()
  Call myMsgBox("鈴木 宗○", vbOKCancel Or vbQuestion)
End Sub

'メッセージボックスの初期設定
Public Function myMsgBox( _
        inPrompt As String _
        , Optional inButtons As VbMsgBoxStyle = vbOKOnly _
        , Optional inTitle As String = "vs 辻本 清○" _
        , Optional inHelpFile _
        , Optional inContext _
        ) As VbMsgBoxResult
  'フック
  mHookProcWnd = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, App.hInstance, App.ThreadID)
  
  'メッセージボックスを呼ぶ
  myMsgBox = MsgBox(inPrompt, inButtons, inTitle, inHelpFile, inContext)
  
  'メッセージボックスで作成されたフォントを削除する
  Call delFont
End Function

'フック関数
Private Function MsgBoxHookProc _
    (ByVal nCode As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long
  
  Static staFlg  As Boolean 'ワーキングフラグ
  
  'システムがウィンドウをアクティブ化しようとしている
  If nCode = HCBT_ACTIVATE Then
    If staFlg Then
      Exit Function
    End If
    staFlg = True
    
    'フォントを設定する
    Call setFont(wParam, 30, MYB_TRUE, MYI_TRUE, MYU_TRUE, MYS_TRUE)
    
    'オブジェクトのリサイズ
    Call setResize(wParam)
    
    Call UnhookWindowsHookEx(mHookProcWnd)
    staFlg = False
  End If
  ' フック関数の継続を中止
  MsgBoxHookProc = False
End Function

Private Sub setFont( _
    inOwnerWnd As Long, _
    Optional ByVal inFontSize As Single = -1, _
    Optional ByVal inBold As MY_BOLD = MYB_FLASE, _
    Optional ByVal inItalic As MY_ITALIC = MYI_FLASE, _
    Optional ByVal inUnderLine As MY_UNDERLINE = MYU_FLASE, _
    Optional ByVal inStrikeOut As MY_STRINKEOUT = MYS_FLASE _
    )

  Dim udtLOGFONT As LOGFONT
  Dim lngDC    As Long
  Dim lngWk    As Long
  Dim lngMsgWnd  As Long 'メッセージボックスのメッセージ部分のハンドル
  
  
  'すでに作成済みのフォントを削除
  Call delFont
  
  'メッセージボックスの中の、メッセージ部分のハンドルを得る
  lngMsgWnd = getWndMsg(inOwnerWnd)
  
  'デバイスコンテキストを得る
  lngDC = GetDC(lngMsgWnd)
  
  '現在のフォントのハンドルを取得
  lngWk = SendMessage(lngMsgWnd, WM_GETFONT, 0, 0&) And &HFFFF&
  
  ' フォント属性を取得
  Call GetObject(lngWk, Len(udtLOGFONT), udtLOGFONT)
  
  '新しい設定を行う
  With udtLOGFONT
    'フォントサイズ/太字/斜体/下線/取消し線
    If inFontSize > 0 Then
      .lfHeight = inFontSize * (GetDeviceCaps(GetDC(inOwnerWnd), LOGPIXELSY) / POINT_PER_INCH) * (udtLOGFONT.lfHeight / Abs(udtLOGFONT.lfHeight))
    End If
    .lfWeight = inBold
    .lfItalic = inItalic
    .lfUnderline = inUnderLine
    .lfStrikeOut = inStrikeOut
  End With
  
  '論理フォントの作成
  mFontHandle = CreateFontIndirect(udtLOGFONT)
  'DCへの関連付け
  Call SelectObject(lngDC, mFontHandle)
  'フォントを指定
  Call SendMessage(ByVal lngMsgWnd, ByVal WM_SETFONT, ByVal mFontHandle, 0&)

End Sub

'フォントオブジェクトの削除
Private Sub delFont()
  If mFontHandle <> 0& Then
    Call DeleteObject(mFontHandle)
    mFontHandle = 0
  End If
End Sub

'メッセージボックスの中の、メッセージ部分のハンドルを得る
Private Function getWndMsg(inWnd As Long) As Long
  Dim lngWnd1 As Long
  Dim lngWnd2 As Long
  
  'メッセージボックスには「Static」クラスを持つオブジェクトが1個か2個ある
  '1個の時は メッセージ
  '2個の時は 最初のStaticはアイコン/次にメッセージ
  
  lngWnd1 = FindWindowEx(inWnd, 0&, "Static" & vbNullChar, vbNullString)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Static" & vbNullChar, vbNullString)
  
  '2個目が存在していたら2個目、そうじゃなけりゃ1個目のハンドルを返す
  getWndMsg = IIf(lngWnd2 <> 0&, lngWnd2, lngWnd1)
End Function

'オブジェクトのリサイズ
'(ここは作りこまないといけない。計算ロジック大変そう・・・・)
Private Function setResize(inWnd As Long)
  Dim lngWidth  As Long
  Dim lngHeight  As Long
  Dim lngWnd1   As Long
  Dim lngWnd2   As Long
  
  '本当はここで再配置ロジックを行う(ボタン/アイコン/メッセージ)の各ハンドルを得て、サイズを変更
  'ここに載っているのは、あくまでサンプルです
  'ボタン数が2個限定ですのでお間違いないように!!!!!!!!!!!!!!
  
  '画面サイズを取得
  lngWidth = (Screen.Width \ Screen.TwipsPerPixelX)
  lngHeight = (Screen.Height \ Screen.TwipsPerPixelY)
  
  'メッセージボックスを座標(0,0)へ表示/メッセージボックスを画面サイズに表示
  Call SetWindowPos(inWnd, 0, 0, 0, lngWidth, lngHeight, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
  
  'メッセージ
  Call SetWindowPos(getWndMsg(inWnd), 0, 0, 0, lngWidth \ 2, lngHeight \ 2, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOMOVE)
          
  'ボタン1(大きさそのまま/配置変更)
  lngWnd1 = FindWindowEx(inWnd, 0&, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd1, 0, 0, lngHeight - 50, 0, 0, _
           SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOSIZE)
  
  'ボタン2(大きさ変更/配置変更)
  lngWnd2 = FindWindowEx(inWnd, lngWnd1, "Button" & vbNullChar, vbNullString)
  Call SetWindowPos(lngWnd2, 0, lngWidth - 400, lngHeight - 500, 300, 300, _
           SWP_NOZORDER Or SWP_NOACTIVATE)
End Function

一応サンプルを作りました。
やってみて面白かったけど、やはりオリジナルを作ったほうがかなり楽だということを実感しました。

注意:
ここの掲示板は文字がずれるので、図形が壊れます。以下の文章をメモ帳などのテキストエディタにコピって読んでください。

・・・さて本題・・・


※メッセージボックスの構造
┏━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━┫
┃                ┃
┃ ┏━┓ ┏━━━━━━━━┓ ┃
┃ ┃I┃ ┃MSG_AREA┃ ┃
┃ ┗━┛ ┗━━━━━━━━┛ ┃
┃         ...続きを読む

QAccess フォームのテキストボックスに半角英字のみで入力する設定は

IME入力モードをテーブル・フォームともオフにしたのですがひらがな入力モードになってしまいます。
フォームのテキストボックスに半角英字のみで入力する設定としてプロパティのIME入力モードをオフにするやり方自体が間違っているのでしょうか。
それともATOKを使っているなど利用するパソコン側の問題でしょうか

Aベストアンサー

IME入力モードを「使用不可」にしましょう。


人気Q&Aランキング