Dim strFileName As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim strSQL As String
strFileName = "データ.accdb" 'データベースのファイル名
Set cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\tasukaru\Desktop\通販\出品データ\" & strFileName & ";" '
Set rs = New ADODB.Recordset
strSQL = "SELECT 1 * FROM マスター where JAN = '1000000151749'"
rs.Open strSQL , cn
If rs.EOF Then
MsgBox "該当データ無し"
Else
MsgBox "該当データ有り"
End If
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
次へ
DoCmd.SearchForRecord,,acNext,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"
前へ
DoCmd.SearchForRecord,,acPrevious,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"
Private Sub 検索実行_Click()
DoSearch acFirst
End Sub
Private Sub 次へ_Click()
DoSearch acNext
End Sub
Private Sub 前へ_Click()
DoSearch acPrevious
End Sub
Private Sub DoSearch(Rec As AcRecord)
If Nz(Me.検索.Value) = "" Then
MsgBox "検索テキストボックスに入力してください。"
Exit Sub
End If
If Not Me.検索.Value Like "*[!0-9]*" Then
DoCmd.SearchForRecord , , Rec, "社員番号 = " & Me!検索
ElseIf Not Me.検索.Value Like "*[!あ-ん]*" Then
DoCmd.SearchForRecord , , Rec, "せい = '" & Me!検索 & "'"
Else
DoCmd.SearchForRecord , , Rec, "姓 = '" & Me!検索 & "'"
End If
End Sub
最初のご質問への回答は、メインフォームです。
二つ目のご質問への回答は、その通りです。できたらいいなと思ってご質問させていただきました。
メインフォームののことですか。サブフォームのことですか。
これをせずに、グループ化したクエリをメインフォームのソースにしたいということでしょうか。
返答ありがとうございます。
そんな、便利機能があったのですね・・・
小難しく考えすぎていたようで恥ずかしい限りです。
If rs.EOF Thenでしたか
ありがとうございました
外部データベースのテーブルが対象ですね。
ADODBに参照設定をしておいて、
文字表示を変えるだけならば、合計値のテキストボックスを条件付き書式で条件分岐したほうが良いかと
(社員番号、せい、姓)すべて前方一致でいいのであればLikeの条件を区切り文字+検索文字とすると良いです。
ざっくり解説すると「Me!検索=たけ」のとき
検索文字だけで検索(Likeの条件は「'*たけ*'」)
(社員番号);おおたけ;大竹 ←一致する
(社員番号);たけだ;武田 ←一致する
区切り文字+検索文字で検索(Likeの条件は「'*;たけ*'」)
;(社員番号);おおたけ;大竹 ←一致しない
;(社員番号);たけだ;武田 ←一致する
このように前方一致を満たせます。
ただし、この形にすると社員番号で検索したいときもLikeの条件には「;」がついてくるので比較元の文字列も区切り文字から始まるようにします。
ありがとうございます。上記のコードで、全ての検索が可能になりました。
現状、「たけ」で検索すると、「おおたけ」がヒットするのですが、
前方一致にする方法はありますでしょうか。
下記を試してみてください。
あっ、そうか、
*
はMarkdownの斜体なので見えなくなるんでした。忘れてた('◇')ゞ連投、申し訳ありません。
新田(にった)など、小さい文字もヒットしません・・・。
・・・濁点の含まれた検索だけ、解決していませんでした。汗
「いそがい」は、「いそ」で検索すれば出てくる状態ですm(_ _)m
回答ありがとうございます!!
せいの検索のコードを、
ElseIf Not Me.検索.Value Like "[!あ-ん]" Then
DoCmd.SearchForRecord , , Rec, "せい Like '" & Me!検索 & "*'"
にしてみたところ、解決しました。
いつも本当にありがとうございます。また困ったら質問させてくださいm(_ _)m
ありがとうございます。
検索ボックスの値も、検索したいデータも、完全一致を想定した「せい」のみです。
と、回答の途中で、謎が解けました!せいのどこかに、濁点が含まれるとヒットしていませんでした。
解決方法がありますでしょうか。
自分も最初そう思ってたんですけどMarkdownのアレかなーってやつですね。
ソース表示したら・・・
ありがとうございます。
当初部分一致のつもりで、*も入れていたのですが、
「お」で検索すると、頭に「お」が付く人だけでなく、「あさおか」などもヒットしてしまっていたので、
完全一致に変更したつもりでいました。
回答ありがとうございます。
質問のコードには、* が付いてないので、完全一致での検索かと思います。
部分一致なら、どうせインデックスは無効になるので、下記でもOKですね。
ひょっとすると、質問者さんは部分一致での検索を想定していて、うまくいかないといっているのかも、と思ってきますか。
社員番号がテキスト型のとのことですが、数字のみでしょうか。それとも数字以外も含まれてますか。
数字のみなら、下記のように修正すればいいかと思います。
出来ないときの、検索ボックスの値と、検索したいデータの値の例をいつくか提示してもらえますか。
行儀悪いのは承知で
なんかどうですかね
ありがとうございます。社員番号はテキスト型でした。
ご回答いただいたコードで、社員番号検索が不可能なことを承知の上で試したところ、
せいでは、検索できる人とできない人がいます。条件は不明です。
姓では全て検索できました。また、前へ、次へのボタンも問題なく動作しました。
社員番号フィールドのデータ型はなんでしょうか。テキスト型または数値型どちらですか。
私の回答したコードも試してもらえますか。
いつもありがとうございます。
現在、クエリで社員番号昇順で表示されます。
質問に記載した条件ですと、
検索ボックスが空白だった場合ですが、
次へを押すことで、社員番号を1つ飛ばしで表示されることがわかりました。
原因はわからないのですが、コードの訂正を試みています。
鈴木の姓が3人いると仮定して、
検索ボックス内が、
すずき でも 鈴木 でも、
前後できるようにしたいのですが、
すずきだとレコードの移動ができるのに、
鈴木だとできない、といった具合です。
自分が書くなら下記のようなコードになります。
社員番号フィールドのデータ型は数値型の前提です。
完全一致の場合は、Like ではなく = の方がいいでしょう。
検索ボックスのテキストが数字だけなら
社員番号
、ひらがなだけならせい
、それ以外なら姓
を対象に検索するようにしてます。お返事遅くなりまして、申し訳ございません。
Set rs = Me.subForm.Form.Recordset.Clone
にしたらうまく動作しました。
ご指摘の点も注意きたします。
サンプルを作成して提示のコードで試してみましたが、前へボタンで戻れないという症状は再現できませんでした。
そのレコードより前に該当レコードがあるのに移動しないのでしょうか。
その場合、検索ボックスにはどのようなデータが入力されてますか。
提示のコードですが、行儀のいいコードではないので、下記の手順で修正してください。
そうすることで、不具合の原因を追究しやすくバグの発生しにくいものになります。
まず、VBAウィンドウのメニューの[ツール]-[参照設定]をクリックして
Microsoft Excel 16.0 Object Library
(数字部分はバージョンによって異なる)にチェックを入れて[OK]をクリックしてください。[ツール]-[オプション]をクリックして開くダイアログで[編集]タブの[変数の宣言を強制する]にチェックを入れて[OK]をクリック。
提示のコードが記述してあるモジュールの先頭に下記の1行を挿入。(既にある場合はそのままで)
これの意味は変数を使う場合は必ず宣言することを強制します。
ここでメニューの[デバッグ]-[`*****`のコンパイル]をクリックします。(
*****
はプロジェクト名)もし、構文間違いや変数宣言がないとその部分を指摘してくれます。
提示のコードには、xlApp、xlBook の変数宣言がないので、ここでエラーが出るはずです。
でないなら、モジュールの先頭か、標準モジュールの先頭で宣言しているはずです。
その変数宣言を削除してください。(そのような場所で宣言する変数をグローバル変数といいますがこれはバグの元ですのでなるべく使用しないようにします。)
クリック時のイベントプロシージャの先頭で、この変数の宣言をします。
Dim xlApp As Object
というように宣言することもできますが、上記のように宣言するのを推奨します。そうすると
xlApp.
まで入力するとプロパティやメソッドがリスト表示されますので入力が楽になるしタイプミスが減らせます。以上、を試してみてください。
簡単なサンプルを作成して、実験してみました。
でも、問題なく動作しました。
うまくいかない原因は他にあると思われます。
アドバイスありがとうございます。
月曜日に試してみます。
すみません、もう1点教えてください。
MyFocusという関数で、ScreenUpdating 、Calculation等のプロパティを設定していますが、
タイミングの違いで、DisplayAlertだけこのMyFocusという関数で定義できず、スマートな
コーディングができません。
確か、CalculationプロパティはBookを開いてから閉じる間に書かなければならないが、
DisplayAlertはBookを保存する前後に入れなければならなかったと思います。
この点アドナイスいただけますと幸いです。
よろしくお願いいたします。
お返事書かせてしまってすみません。
書いて下さった情報は貴重なので覚えておきます。
たびたびのご助言、本当にありがとうござました。
2Bの方法は件数か多いと重いかもしれません。選択リストをテキストで保存してますので、検索や削除処理が重くなりそうです。リストをDictionaryオブジェクトに格納すると、検索/削除は高速になるので8000件ぐらいならいいかも知れません。
テーブルに格納するなら、フロントエンド側のワークテーブルにする設計にするのが楽だし、速度的にも有利かと。
バックエンドに格納してしまうと複数ユーザーの更新の衝突の危険性が増してしまいます。
※投稿してから、上の投稿に気が付きました。
自己レスです。
「ベストが明らかだという感じがしない」と書きましたが、
考えてみれば特別な業務以外で True の数が大きくなることはないので、
やはり hatena さんの方法で行けそうな気がします。
そちらで納得したいと思います。
ありがとうございました。
ご回答ありがとうございます。
いわゆるひとり情シスなもので、助言があるだけでありがたいのですが、
hatena さんのような Access 界の有名人からは特別な感じがします。
書き損なってすみませんでしたが、
有線 LAN・共有人数一桁でした。
バックエンド非連結くずしは、
正規化に対する正規化くずしのように加減が分かりにくい世界だと
認識しておりまして、
TOP 句と外部結合を使った SQL から
2, 30 レコードぐらいのワークテーブルを作って、
帳票フォームでページを切り替えていかないといけないのかどうか、
ずっと悩んでおりました。
がしかしそこは、おかげさまで解決です。
ところで、上記 "2b" につき、リンク先拝読しました。
ただ、テーブルに 8,000 件ぐらいはあって今後も増え続けるので、
十分な速度が出(続け)るか分からないところはあります。
「テーブルに Yea/No型のフィールドを追加して、チェックボックスをそれと連結させましょう」の場合、
ユーザ人数分のフィールドをバックエンドに持つか、
ローカルで生成してリンクテーブルと結合になりそうですが、
個人的にはベストが明らかだという感じがしません。
ご意見を伺えれば幸いです。
なんとなくその辺があやしそうそうな気がしたのですか、当たったようですね。
というようにしてみたらどうだろう。
RecordsetClone
とRecordset.Clone
の違いは下記を参照してください。フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは? - hatena chips
普通に定義済みクエリを指定してレコードセットを開くと問題ないです。
一方、サブフォームのRecordsetConeプロパティを元にレコードセットを開くと動かなくなりますね。
の部分のコメント行を下記のように入れ替えたらどうなりますか。
共有する人数、更新の頻度、ネットワーク環境(有線/無線など)によって異なるので、一概には言えません。
共有人数が一桁で閲覧のみなら、データベース分割、連結フォームでたいていは問題なく運用できると思います。
b に関しては下記で紹介している方法が使えます。
a に関しては、1で示した条件内なら普通に連結で問題ないと思います。
実際運用してみて、頻繁に破損したり不具合が出るなら、上の非連結チェックボックスでチェックして、更新クエリでまとめて更新するという運用にするといいでしょう。その場合は、トランザクションをかけておくとより安全です。
共有人数か何十人もいるなら、そもそもAccdbでは無理なので、SQL Server等の本格的なRDBMSへの移行を検討すべきでしょう。
問題のコードを提示してもらえますか。
質問は編集できますので、質問の方に追記してもらうと後々見やすいです。
あと、「切替のダイアログ」とは具体的にどのようなダイアログでしょうか。
どうもありがとうございます。
キーブレイク処理ですか。
一瞬で採番できてしまったのでビックリしました。
縦を横展開もクロス集計で解決しました。
どうもありがとうございます。、
DCountでの連番演算は重い処理になります。
テーブルに、Gid フィールドを追加して、VBAで連番を入力するようにすると高速になります。
下記で、自動で連番を入力する関数を紹介していますので、それを使うといいでしょう。
それができたら、関係者社員番号の横展開は、クロス集計クエリで可能です。
ありがとうございました。