出産前後の痔にはご注意!

ACCESSでの質問です。検索に関して、例えば「駅すぱあと」で「asa」と入力すれば「浅草」「浅香山」と表示され「asaku」で「浅草」と表示されるようなインクリメンタルサーチはどうやって実現できるのでしょうか?

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

A 回答 (3件)

#1です



> なぜ最後の「ma」から開始するのかは、最初に文字総数から
> Iを引いて行く方が効率が良いというか当然なのですね

足して行っても構わないのですが・・・

> Case "ぁ", "ぅ", "ゃ", "ぃ", "ゅ", "ぇ", "ょ", "っ"

の対応をどうするか?悩むと後ろの方が楽かなと^^;;;
例えば「とうきょう」だと、後ろからだと、「ょ」だから、「きょ」で割り当てなおし、前からだと、毎回、一時後ろを確認する必要が出てきます
と、言うことで、後ろからして見ました

> 最初に拗音をはねるのは、拗音は頻度が低く処理速度が遅くなる
> からでしょうか(費用対効果的な問題)

前述もしましたが、「き」で直した後、「ょ」ごと、取り替える必要が出てくるので、「きょ」で、変換したくて、先に拗音を取り出して、確認してます

> (1)「shi」「si」ローマ字の入力方法をユーザーに徹底する必要

これは、現状の話の中では、可能性がありますが・・・
アルゴリズムで、もう一つフィールドを追加すれば良いような、もしくは、先のひらがな→ローマ字ではなく、ローマ字→ひらがな(カナ)に変換してから、検索を掛けるのも手だと思いますよ

> (2)アクセスでふりがな自動入力の場合、ユーザーによっては雅夫と
> 入力する際、「みやびおっと」とふりがなされる可能性

ですね
これも、よく悩みます
どちらの「漢字」と「ひらがな」を両方示しておく必要があるかも・・・

> 4 参考書籍やホームページ(検索に関して)
> について、お勧めがあればご教示願います。

Microsoft Access Club
http://www.accessclub.jp/
ここと、おなじくQ&A板も兼ねてます
サンプル、解説なども、多いです
名前の通り「Access」専用サイト

MSDN ライブラリ
http://msdn.microsoft.com/ja-jp/library/default. …
「公式の技術資料サイト」
現在のヘルプよりも、詳しく書いてます
ただし、本当に技術者用で、解説が理解できないことも・・・

moug モーグ
http://www.moug.net/
「マイクロソフト認定資格」から、名前が来てます
「オフィス用Q&A」サイト
サンプル、解説なども、多いです

くらいかな?
大きいところはね
    • good
    • 0
この回答へのお礼

Dxakさんありがとうございました。
投稿は初めてなのですが、大変参考になりました。

魔法使いの開発工房を、たまに見てましたが、ACCESS CLUBは
あまり見たことがなかったので、じっくり見てみようと思います。

今後も、アクセスを中心にちょこちょこがんばろうと思います。
日経ソフトウェアなどたまに見ると、参考コードがほとんどC系統
なので、そっちも勉強しようと色気を出すこのごろではあります。

最近面白かった本は、小飼弾「アルファギークに逢ってきた」です。

どうもありがとうございました。

お礼日時:2008/07/20 19:37

#1です



関数化と言うのは、例えば

Function Test(usStr As String) As String

Dim usCher As String
Dim usAns As String
Dim I As Long

I = Len(usStr)
usAns = ""

While I > 0
usCher = Mid(usStr, I, 1)
Select Case usCher
Case "ぁ", "ぅ", "ゃ", "ぃ", "ゅ", "ぇ", "ょ", "っ"
I = I - 1
usCher = Mid(usStr, I, 1) + usCher
End Select
I = I - 1
Select Case usCher
Case "あ"
usAns = "a" + usAns
Case "い"
usAns = "i" + usAns
Case "う"
usAns = "u" + usAns
Case "え"
usAns = "e" + usAns
Case "お"
usAns = "o" + usAns
' 以下略
End Select
Wend
Test = usAns

End Function

と、標準モジュールで、関数化すれば、クエリー上にでも使用可能ですよ
で、「ふりがな」コントロールと言うものが、Access2000以降には、あります
(Access97には無かったと思ったけど・・・)
Excelにも、ふりがな機能があるように、それと似たような機能です
但し、Excelと違い、Accessの場合、フィールドを1つ作る必要があります
テーブル作成で、テキスト型を使用する場合、プロパティに「ふりがな」とありますので、見て確認ください

・「BookShelf」も、見たことはありますが、使ったことは無いです
「キー入力時」ごとに、検索かけ直しを行ってるのかな?
あまり頻繁に抽出を行うと、操作性が著しく低下するから、前回の抽出した条件と相違した場合と、工夫も必要になってくるのでしょうけど・・・
    • good
    • 0
この回答へのお礼

Dxakさんありがとうございました。
「よこはま」の「ま」「ma」の次は「hama」とIが0になるまで
繰り返すわけですね。
・私は、初心者なので、以下お許しください。
1 確認点
 なぜ最後の「ma」から開始するのかは、最初に文字総数からIを引いて行く方が効率が良いというか当然なのですね(はじめ気づかなかった)
2疑問点
 最初に拗音をはねるのは、拗音は頻度が低く処理速度が遅くなるからでしょうか(費用対効果的な問題)
但し、文字の真ん中に拗音があるとはねられてヒットしない気が。
3 参考 
 アクセスでふりがな自動入力させた場合、関数でアルファベットを育成するのもよいと思いました。
 また、テーブルを作る際、読みのフィールドを作るなら検索の速さだけを考えた場合、読みは、ひらがなよりもアルファベットで入力しておいた方が断然早いと思いました。(BookShelfのサクサク感にこだわり)
なお、以下の問題点が
(1)「shi」「si」ローマ字の入力方法をユーザーに徹底する必要
(2)アクセスでふりがな自動入力の場合、ユーザーによっては雅夫と入力する際、「みやびおっと」とふりがなされる可能性
以上、うだうだと書いてしまいましたが、これも日本語独特の異字体によるヒットしない問題(渡辺の辺。高橋の高)←あいまい検索できるというのは、度外視して。
4 参考書籍やホームページ(検索に関して)
について、お勧めがあればご教示願います。
ありがとうございました。

お礼日時:2008/07/20 01:26

う~ん、「駅すぱあと」の「インクリメンタルサーチ」と言うものが、どう言う物か、よく判らない出の回答ですので、その辺りはご了承ください



いろいろな手法が、考えられますが・・・
・「浅草」「あさくさ」「asakusa」のデータをテーブルとして持っておく
・「浅草」「あさくさ」をデータをテーブルとして保持、ローマ字は、関数化して生成

など

1番目のが、最初のが作成は楽ですが、入力が大変
2番目のが、入力(ふりがなを使用すれば、1つ入力だけで済む可能性がある)が楽だけど、関数が大変

あとは、クエリーで

Select 漢字
From テーブル名
Where [漢字] Like [コントロール名] & '*'
or [ふりがな] Like [コントロール名] & '*'
or [ローマ字] Like [コントロール名] & '*';

と、言う感じで、抽出していけばよい
コントロール側で、入力中に絞っていくなら、「キー入力時」で、上記クエリーを、VBA側で[コントロール名]を実の値で置き換えてSQLを動作させないと、多分、抽出する値が、読み取れない可能性があるかな

で、書いていることは、大体、理解できますか?
    • good
    • 0
この回答へのお礼

Dxakさんありがとうございます。
1番目は、なんとなく分かるのですが2番目が分かりません。
ご教示願います。
以下内容です。
・1番目に対する私の理解は
特定の[コントロール名]に入力した値を変数に持って、 漢字、ふりがな、ローマ字のいずれで入力されても[漢字][ローマ字][ふりがな]各フィールドでor検索する です。
・2番目は、[漢字][ふりがな]の各フィールドを持つテーブルで、[ローマ字] フィールドの値をどのように関数化して生成するかという点、又、[ふりがな]だけでどのようにして漢字やローマ字が育成されるのか分かりません。
なお、
・インクリメンタルサーチのイメージは、駅すぱあとの他にありました。
例えばBookShelf(マイクロソフト)です。あんな挙動は、VB?C?(私は、どちらも知りません。しかし、少なくともvbaで実現できそうにない感じがするのです。速度とか)
以上です。

お礼日時:2008/07/17 23:06

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

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

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

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

Qaccess マクロでのフィルタの解除の方法

フィルタをかける時は、

***************************
アクション:フィルタの実行
フィルタ名:なし
Where条件式:[フィールド1]="あ"
***************************

で、できますが、
フィルタを解除する時はどのようなマクロを作ればいいのでしょうか?

VBAでやるなら、
Me.Form.FilterOn = False
をマクロでやりたいです。

アドバイスよろしくお願いします。

Aベストアンサー

> VBAでやるなら、
> Me.Form.FilterOn = False
> をマクロでやりたいです。

ご質問の趣旨が「並べ替えは維持した状態で、フィルタだけ解除したい」という
ことでしたら、以下の方法で対応できます。


a)フィルタの解除専用の場合
***************************
アクション:コマンドの実行
コマンド:フィルタをすべて解除
***************************
※フィルタが適用されていない状態で実行するとエラーになります。
  (コマンドボタンで実行させる場合、フィルタ未適用時はボタンを使用不可
  にするか、マクロの『条件』欄に「~.FilterOn = True」の記述が必要、と)
  また、フォームのプロパティシートの『データ』タブにある『フィルタ』欄(VBAでの
  Me.Form.Filterに相当)に設定された文字列も削除されます。


b)フィルタの適用/解除を交互に切り替える場合
***************************
アクション:コマンドの実行
コマンド:フィルタの実行/解除
***************************
※当該フォームにフィルタが設定されていない場合、エラーとなります。
 (フォームのプロパティシートの『データ』タブにある『フィルタ』欄に
  フィルタとなる文字列が設定されていればOk:)
 (フィルタが適用済みなら解除、解除済みなら適用、となります)


因みに、マクロのデザインビューで、『デザイン』リボンの『表示/非表示』グループ
内にある『すべてのアクションを表示』をオンにしてもよいのでしたら、以下の
方法もあります。
(VBAでの方法をご存知の上でマクロで対応ということは、勤務先のセキュリティ
 方針によるものかと思いますので、この方法も不可かもしれませんが(汗))

***************************
アクション:値の代入
アイテム:Forms!フォーム名.Form.FilterOn
式:False
***************************

※サブフォームの場合の『アイテム』は以下のようになります:
 Forms!フォーム名!サブフォームコントロール名.Form.FilterOn

> VBAでやるなら、
> Me.Form.FilterOn = False
> をマクロでやりたいです。

ご質問の趣旨が「並べ替えは維持した状態で、フィルタだけ解除したい」という
ことでしたら、以下の方法で対応できます。


a)フィルタの解除専用の場合
***************************
アクション:コマンドの実行
コマンド:フィルタをすべて解除
***************************
※フィルタが適用されていない状態で実行するとエラーになります。
  (コマンドボタンで実行させる場合、フィルタ未適用時はボタンを使用不可
  にするか、...続きを読む

QAccessの桁区切りについて教えてください。

アクセスのレポートの金額に、桁区切りのカンマを付けたいと思っています。
プロパティの書式を通貨にすると¥マークがついてしまいます。
合計は付いてもいいのですが、内訳には¥マークを付かないように桁区切りだけにしたいのです。

そのため、書式に『###,##0』としました。
できましたが、小数点以下が表示されません。

小数点を表示したいので『###,##0.###』としたら、『59,180.000』となってしまいます。
小数点の指定を自動から3桁表示に変えましたが、うまくいきません。

教えていただきたい内容としては、
・金額の表示に桁区切りのカンマを付けたい。
・でも¥マークは付けたくない。
・小数点以下該当があるもののみ3桁まで表示させたいが(5,500.365)、
 小数点以下がないものは小数点以下は表示させたくない(5,400)。

ぜひともアクセスを使いこなしている方、お教えください。

Aベストアンサー

この内容からですと、[金額]フィールドを「レコードの内容により、書式を変えたい」と
いうことですので、テキストで処理する方法よりないかと思います。(Access2000)

VBAによる「ユーザー定義関数」を使う方法ですが、それで良かったら手順を
詳しく書きますので、テストしてみてください。

・テーブルのデザインで[金額]フィールドを「数値型」の「単精度浮動小数点型」か
 「倍精度浮動小数点型」にします。

・「モジュール」の新規作成で開いたコードウィンドウに下記コードをコピーして
 貼り付けます。

・フォームのレコードソースにするためのクエリを作成します。
 必要なフィールドをQBEグリッド(画面の下側)にドラッグした後、
 新規フィールドに 例えば、 金額Txt:Valtxt([金額]) と入力します。

・レポートの[金額]のコントロールソースに、この[金額T]を指定します。
 この書式で「配置」を右に設定します。

これで、少数部がない数値は、整数部だけを表示し、位取りの , が付きます。
小数部がある場合は、4位を四捨五入します。(通常と同じ)
その結果、右側に 0 が付いた場合は、表示しません。

ご承知の上とは思いますが、表形式の場合、少数点位置が揃わなくなりますので
見ずらくなってしまいます。

このようなもので如何でしょうか。

Function Valtxt(V As Double) As String
Dim T As String
Dim N As Integer
T = Format(V, "#,##0.000")
For N = Len(T) To InStr(T, ".") Step -1
  If Mid(T, N, 1) = "0" Then
    T = Left(T, N - 1)
  Else
    Exit For
  End If
Next N
If Right(T, 1) = "." Then T = Left(T, Len(T) - 1)
Valtxt = T
End Function

この内容からですと、[金額]フィールドを「レコードの内容により、書式を変えたい」と
いうことですので、テキストで処理する方法よりないかと思います。(Access2000)

VBAによる「ユーザー定義関数」を使う方法ですが、それで良かったら手順を
詳しく書きますので、テストしてみてください。

・テーブルのデザインで[金額]フィールドを「数値型」の「単精度浮動小数点型」か
 「倍精度浮動小数点型」にします。

・「モジュール」の新規作成で開いたコードウィンドウに下記コードをコピーして
 ...続きを読む

Q文字のリアルタイム検索がしたいんです…

質問を見てくださってありがとうございます。
少し説明が長いのですがどうぞ見てやって下さい。

さっそく質問内容なのですが…。

私がしたいと思っているのは文字列のリアルタイム検索です。まず、それが具体的にどういうことなのかを説明します。

あるFORM1にテキストボックスと一覧表示系コントロール(私が使っているのはTDBGridというコントロールです…)を配置しています。その一覧系コントロールには名前とそのフリガナが表示されます。その状態でテキストボックスにフリガナを入力して沢山あるリストの中から該当する名前(フリガナ)を検索しカレント行にする。というものなのですが、この時"リアルタイム検索"というのがどういうことかといいますと…。
一覧系コントロールに以下のような内容が表示されているとします。
--------------------
名前  フリガナ
--------------------
相田  アイダ
飯田  イイダ
石狩  イシカリ
石川  イシカワ
渡   ワタリ
--------------------

この中の"イシカワ"を検索する時…、
「イ」を入力すると飯田さんの行がカレント行になり
続いて「シ」を入力すると石狩さんの行がカレント行る。
更に「カ」を入力して「ワ」を入力すると石川さんの行がカレント行になるというものです。

これは入力した文字を一文字づつ認識してやり、一覧から検索してきて一番初めにヒットしたものを探し出してくるのですが、ここで問題となるのが入力した文字を一文字づつ認識させるということだと思うんですね。
実際は、入力しても一度[Enter]キーを押すまで、変換待ちになってしまいますから…。

ホントにどうしたらいいんでしょう…。

ずっと考えているのですが分からなくて困っています、わからないけどこうしたらどうかな??なんて回答でもいただけたら嬉しいのでどうぞ宜しくお願いしますm(__)m

質問を見てくださってありがとうございます。
少し説明が長いのですがどうぞ見てやって下さい。

さっそく質問内容なのですが…。

私がしたいと思っているのは文字列のリアルタイム検索です。まず、それが具体的にどういうことなのかを説明します。

あるFORM1にテキストボックスと一覧表示系コントロール(私が使っているのはTDBGridというコントロールです…)を配置しています。その一覧系コントロールには名前とそのフリガナが表示されます。その状態でテキストボックスにフリガナを入力して沢山あるリ...続きを読む

Aベストアンサー

#3です。

私の言うOnChangeイベントはACCESSのchangeイベントと同じものです。最近、他のツールばかり触ってますので混同してました。

それから、私が例示したクエリですが、Likeを使うことも可能です。

あと、IMEを使う環境では、おっしゃるような不具合があるのはやむを得ません。

であれば、元になるテーブルに[yomi]というフィールドを追加し、テキストボックスにも半角文字で入力するようにすればどうでしょうか。つまり「タナカ」ではなく「tanaka」とするのです。当然、クエリも半角英字をキーにして投げます。
読み仮名自体は既に入力されているのでしょうから、それをローマ字に変換して格納するのは、自作関数などで比較的簡単にできると思います。

例えば、
function mbKana2Kana(Instr as string) as string
dim MBkana as string(5)
dim RKana as string(5)
dim TmpStr as string

TmpStr = InStr

MBKana(1)="あ"
MBKana(2)="い"
MBKana(3)="う"
MBKana(4)="え"
MBKana(5)="お"

RKana(1)="a"
RKana(2)="i"
RKana(3)="u"
RKana(4)="e"
RKana(5)="o"

for i = 1 to 5
MBKana2kana = replace(TmpStr, MBKana(i), RKana(i))
next i

end.

って感じで置換をかければいいと思います。

もしかして、replace関数というのがなかったかも知れませんが他の文字列置換関数で代行できると思います。

VBは、最近余り触っていないので、もっと良いルーチンがあるかも知れませんが思いつきません...。

#3です。

私の言うOnChangeイベントはACCESSのchangeイベントと同じものです。最近、他のツールばかり触ってますので混同してました。

それから、私が例示したクエリですが、Likeを使うことも可能です。

あと、IMEを使う環境では、おっしゃるような不具合があるのはやむを得ません。

であれば、元になるテーブルに[yomi]というフィールドを追加し、テキストボックスにも半角文字で入力するようにすればどうでしょうか。つまり「タナカ」ではなく「tanaka」とするのです。当然、クエリも半角英字をキー...続きを読む

Qフォームを開くときに、コンボボックスの値を選択(アクセスVBA)

こんにちは。
アクセスVBAで、フォームを開いたとき
(フォームのOpenイベント)に、
コンボボックスの値を選択したいのですが、
どういう方法が、あるでしょうか。

理想は、
フォームのOpenないし、Loadイベント内で、
コンボ0.ItemData(2).Selected
と、書くような感じです。
(無論、Selectedは使えませんでした)。

よろしくお願いします。

Aベストアンサー

これでいいのかな?
※テキスト書きなので検証していません

If コンボ0.ListCount > 0 Then
  コンボ0.Value = コンボ0.Column(0, 2)
End If


人気Q&Aランキング