Microsoft Access 掲示板

6,622 件中 6,241 から 6,280 までを表示しています。
2
けんたろー 2019/06/25 (火) 11:32:51 a63a9@86c72

最初のご質問への回答は、メインフォームです。

二つ目のご質問への回答は、その通りです。できたらいいなと思ってご質問させていただきました。

1

グループ化をすると更新不可のクエリになってしまって、

メインフォームののことですか。サブフォームのことですか。

上司のカラムデータを基にグループ化して、上司ID、上司氏名、フラグの属性を持たせたメインテーブルにデータを追加(追加前にデータを削除)

これをせずに、グループ化したクエリをメインフォームのソースにしたいということでしょうか。

2
月子 2019/06/24 (月) 09:12:07 ff722@7f6ca

返答ありがとうございます。
そんな、便利機能があったのですね・・・
小難しく考えすぎていたようで恥ずかしい限りです。

4
5流クン 2019/06/23 (日) 16:47:55 39554@9ec8c

If rs.EOF Thenでしたか

ありがとうございました

2
hatena 2019/06/23 (日) 09:49:41 修正

外部データベースのテーブルが対象ですね。

ADODBに参照設定をしておいて、

 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

1
名前なし 2019/06/21 (金) 17:11:34 dd5c4@2b788

文字表示を変えるだけならば、合計値のテキストボックスを条件付き書式で条件分岐したほうが良いかと

20
名前なし 2019/06/21 (金) 16:29:02 feab0@f966d

(社員番号、せい、姓)すべて前方一致でいいのであればLikeの条件を区切り文字+検索文字とすると良いです。

DoCmd.SearchForRecord,,acNext,"';' & 社員番号 & ';' & せい & ';' & 姓  Like '*;" & Me!検索 & "*'"

ざっくり解説すると「Me!検索=たけ」のとき
検索文字だけで検索(Likeの条件は「'*たけ*'」)
(社員番号);おおたけ;大竹 ←一致する
(社員番号);たけだ;武田 ←一致する

区切り文字+検索文字で検索(Likeの条件は「'*;たけ*'」)
;(社員番号);おおたけ;大竹 ←一致しない
;(社員番号);たけだ;武田 ←一致する

このように前方一致を満たせます。
ただし、この形にすると社員番号で検索したいときもLikeの条件には「;」がついてくるので比較元の文字列も区切り文字から始まるようにします。

19

ありがとうございます。上記のコードで、全ての検索が可能になりました。

現状、「たけ」で検索すると、「おおたけ」がヒットするのですが、
前方一致にする方法はありますでしょうか。

17

下記を試してみてください。

DoCmd.SearchForRecord,,acNext,"社員番号 & ';' & せい & ';' & 姓  Like '*" & Me!検索 & "*'"
15
名前なし 2019/06/21 (金) 11:54:34 8b8f2@f9cf6 >> 8

あっ、そうか、*はMarkdownの斜体なので見えなくなるんでした。忘れてた('◇')ゞ

14

連投、申し訳ありません。
新田(にった)など、小さい文字もヒットしません・・・。

13

・・・濁点の含まれた検索だけ、解決していませんでした。汗
「いそがい」は、「いそ」で検索すれば出てくる状態ですm(_ _)m

12

回答ありがとうございます!!

せいの検索のコードを、
    ElseIf Not Me.検索.Value Like "[!あ-ん]" Then
        DoCmd.SearchForRecord , , Rec, "せい Like '" & Me!検索 & "*'"
にしてみたところ、解決しました。

いつも本当にありがとうございます。また困ったら質問させてくださいm(_ _)m

11

ありがとうございます。
検索ボックスの値も、検索したいデータも、完全一致を想定した「せい」のみです。

と、回答の途中で、謎が解けました!せいのどこかに、濁点が含まれるとヒットしていませんでした。
解決方法がありますでしょうか。

10
名前なし 2019/06/21 (金) 10:44:19 feab0@f966d >> 8

自分も最初そう思ってたんですけどMarkdownのアレかなーってやつですね。
ソース表示したら・・・

9

ありがとうございます。
当初部分一致のつもりで、*も入れていたのですが、
「お」で検索すると、頭に「お」が付く人だけでなく、「あさおか」などもヒットしてしまっていたので、
完全一致に変更したつもりでいました。

8

回答ありがとうございます。
質問のコードには、* が付いてないので、完全一致での検索かと思います。

部分一致なら、どうせインデックスは無効になるので、下記でもOKですね。

DoCmd.SearchForRecord,,acNext,"社員番号 & ';' & せい & ';' & 姓  Like '*" & Me!検索 & "*'"

ひょっとすると、質問者さんは部分一致での検索を想定していて、うまくいかないといっているのかも、と思ってきますか。

7

社員番号がテキスト型のとのことですが、数字のみでしょうか。それとも数字以外も含まれてますか。
数字のみなら、下記のように修正すればいいかと思います。

    If Not Me.検索.Value Like "*[!0-9]*" Then
        DoCmd.SearchForRecord , , Rec, "社員番号 = '" & Me!検索 & "'"

せいでは、検索できる人とできない人がいます。条件は不明です。

出来ないときの、検索ボックスの値と、検索したいデータの値の例をいつくか提示してもらえますか。

6
名前なし 2019/06/21 (金) 09:33:50 feab0@f966d

行儀悪いのは承知で

次へ
DoCmd.SearchForRecord,,acNext,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"

前へ
DoCmd.SearchForRecord,,acPrevious,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"

なんかどうですかね

5

ありがとうございます。社員番号はテキスト型でした。
ご回答いただいたコードで、社員番号検索が不可能なことを承知の上で試したところ、
せいでは、検索できる人とできない人がいます。条件は不明です。
姓では全て検索できました。また、前へ、次へのボタンも問題なく動作しました。

4

社員番号フィールドのデータ型はなんでしょうか。テキスト型または数値型どちらですか。

私の回答したコードも試してもらえますか。

3

いつもありがとうございます。

現在、クエリで社員番号昇順で表示されます。
質問に記載した条件ですと、
検索ボックスが空白だった場合ですが、
次へを押すことで、社員番号を1つ飛ばしで表示されることがわかりました。
原因はわからないのですが、コードの訂正を試みています。

鈴木の姓が3人いると仮定して、
検索ボックス内が、
すずき でも 鈴木 でも、
前後できるようにしたいのですが、
すずきだとレコードの移動ができるのに、
鈴木だとできない、といった具合です。

2

自分が書くなら下記のようなコードになります。
社員番号フィールドのデータ型は数値型の前提です。
完全一致の場合は、Like ではなく = の方がいいでしょう。
検索ボックスのテキストが数字だけなら 社員番号、ひらがなだけなら せい、それ以外なら を対象に検索するようにしてます。

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
8
みずき 2019/06/20 (木) 13:57:59 a63a9@dbd20

お返事遅くなりまして、申し訳ございません。

Set rs = Me.subForm.Form.Recordset.Clone

にしたらうまく動作しました。

ご指摘の点も注意きたします。

1

サンプルを作成して提示のコードで試してみましたが、前へボタンで戻れないという症状は再現できませんでした。
そのレコードより前に該当レコードがあるのに移動しないのでしょうか。
その場合、検索ボックスにはどのようなデータが入力されてますか。

7

提示のコードですが、行儀のいいコードではないので、下記の手順で修正してください。
そうすることで、不具合の原因を追究しやすくバグの発生しにくいものになります。

  • まず、VBAウィンドウのメニューの[ツール]-[参照設定]をクリックしてMicrosoft Excel 16.0 Object Library(数字部分はバージョンによって異なる)にチェックを入れて[OK]をクリックしてください。

  • [ツール]-[オプション]をクリックして開くダイアログで[編集]タブの[変数の宣言を強制する]にチェックを入れて[OK]をクリック。

  • 提示のコードが記述してあるモジュールの先頭に下記の1行を挿入。(既にある場合はそのままで)

    Option Compare Database
    Option Explicit    'この行の挿入
    

    これの意味は変数を使う場合は必ず宣言することを強制します。

  • ここでメニューの[デバッグ]-[`*****`のコンパイル]をクリックします。(*****はプロジェクト名)
    もし、構文間違いや変数宣言がないとその部分を指摘してくれます。

  • 提示のコードには、xlApp、xlBook の変数宣言がないので、ここでエラーが出るはずです。
    でないなら、モジュールの先頭か、標準モジュールの先頭で宣言しているはずです。
    その変数宣言を削除してください。(そのような場所で宣言する変数をグローバル変数といいますがこれはバグの元ですのでなるべく使用しないようにします。)

  • クリック時のイベントプロシージャの先頭で、この変数の宣言をします。

Private Sub Excel出力_Click()
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook 

    '以下略

Dim xlApp As Object というように宣言することもできますが、上記のように宣言するのを推奨します。
そうすると xlApp.まで入力するとプロパティやメソッドがリスト表示されますので入力が楽になるしタイプミスが減らせます。

  • MyFocus関数はとりあえず削除してください。高速化のためのものですが、今回の処理にはなくても影響は少ないと思います。うまく動作しない場合は、なるべく余計なことはしないようにした方が原因を特定しやすいです。安定して動作するようになってから、処理が重たいと感じたなら、その時に導入すればいいでしょう。

以上、を試してみてください。

6
hatena 2019/06/15 (土) 06:45:15 修正

簡単なサンプルを作成して、実験してみました。

Set rs = Me.subForm.Form.RecordsetClone

でも、問題なく動作しました。
うまくいかない原因は他にあると思われます。

5
みずき 2019/06/14 (金) 21:46:23 5ec36@d6973

アドバイスありがとうございます。
月曜日に試してみます。

すみません、もう1点教えてください。

MyFocusという関数で、ScreenUpdating 、Calculation等のプロパティを設定していますが、
タイミングの違いで、DisplayAlertだけこのMyFocusという関数で定義できず、スマートな
コーディングができません。
確か、CalculationプロパティはBookを開いてから閉じる間に書かなければならないが、
DisplayAlertはBookを保存する前後に入れなければならなかったと思います。

この点アドナイスいただけますと幸いです。

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

5

お返事書かせてしまってすみません。
書いて下さった情報は貴重なので覚えておきます。
たびたびのご助言、本当にありがとうござました。

4
hatena 2019/06/14 (金) 19:53:56 修正

2Bの方法は件数か多いと重いかもしれません。選択リストをテキストで保存してますので、検索や削除処理が重くなりそうです。リストをDictionaryオブジェクトに格納すると、検索/削除は高速になるので8000件ぐらいならいいかも知れません。
テーブルに格納するなら、フロントエンド側のワークテーブルにする設計にするのが楽だし、速度的にも有利かと。
バックエンドに格納してしまうと複数ユーザーの更新の衝突の危険性が増してしまいます。

※投稿してから、上の投稿に気が付きました。

3

自己レスです。

「ベストが明らかだという感じがしない」と書きましたが、
考えてみれば特別な業務以外で True の数が大きくなることはないので、
やはり hatena さんの方法で行けそうな気がします。

そちらで納得したいと思います。
ありがとうございました。

2

ご回答ありがとうございます。
いわゆるひとり情シスなもので、助言があるだけでありがたいのですが、
hatena さんのような Access 界の有名人からは特別な感じがします。

書き損なってすみませんでしたが、
有線 LAN・共有人数一桁でした。
バックエンド非連結くずしは、
正規化に対する正規化くずしのように加減が分かりにくい世界だと
認識しておりまして、
TOP 句と外部結合を使った SQL から
2, 30 レコードぐらいのワークテーブルを作って、
帳票フォームでページを切り替えていかないといけないのかどうか、
ずっと悩んでおりました。
がしかしそこは、おかげさまで解決です。

ところで、上記 "2b" につき、リンク先拝読しました。
ただ、テーブルに 8,000 件ぐらいはあって今後も増え続けるので、
十分な速度が出(続け)るか分からないところはあります。
「テーブルに Yea/No型のフィールドを追加して、チェックボックスをそれと連結させましょう」の場合、
ユーザ人数分のフィールドをバックエンドに持つか、
ローカルで生成してリンクテーブルと結合になりそうですが、
個人的にはベストが明らかだという感じがしません。
ご意見を伺えれば幸いです。

4

一方、サブフォームのRecordsetConeプロパティを元にレコードセットを開くと動かなくなりますね。

なんとなくその辺があやしそうそうな気がしたのですか、当たったようですね。

   Set rs = Me.subForm.Form.Recordset.Clone

というようにしてみたらどうだろう。

RecordsetCloneRecordset.Clone の違いは下記を参照してください。

フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは? - hatena chips

3
みずき 2019/06/14 (金) 16:46:28 a63a9@dbd20

普通に定義済みクエリを指定してレコードセットを開くと問題ないです。

一方、サブフォームのRecordsetConeプロパティを元にレコードセットを開くと動かなくなりますね。

2
    'レコードセットを開く
'    Set rs = db.OpenRecordset("サンプルクロス集計クエリ")

    Set rs = Me.subForm.Form.RecordsetClone

の部分のコメント行を下記のように入れ替えたらどうなりますか。

    'レコードセットを開く
    Set rs = db.OpenRecordset("サンプルクロス集計クエリ")

'    Set rs = Me.subForm.Form.RecordsetClone
1

1 データを一覧として閲覧(のみ。CRUD の R のみ)

共有する人数、更新の頻度、ネットワーク環境(有線/無線など)によって異なるので、一概には言えません。
共有人数が一桁で閲覧のみなら、データベース分割、連結フォームでたいていは問題なく運用できると思います。

2 例外的に、各行が持つチェックボックスのチェック。このチェックボックスには 2 タイプあって、
 a 論理削除のように、バックエンドにも要るもの。
 b 各ユーザが自分が印刷したいレコード(複数)を指定する時に使うフィールドのように、バックエンドには要らないもの。

b に関しては下記で紹介している方法が使えます。

非連結のチェックボックスでレコードを選択する
帳票フォームでチェックボックスを配置して、チェックしたレコードのみ選択して印刷したいのですが、一つのレコードをチェックするとすべてのレコードが選択されてしまいます。 掲示板でたまにみかける質問です。気持ちは分かりますが、非連結コントロールでの更新はすべてのレコードに反映されてしまいます。一つのコントロールにプロパティ値は一つしかもてませんので。各レコード毎にプロパティ値を持つような設計にしたら大量...
fc2

a に関しては、1で示した条件内なら普通に連結で問題ないと思います。
実際運用してみて、頻繁に破損したり不具合が出るなら、上の非連結チェックボックスでチェックして、更新クエリでまとめて更新するという運用にするといいでしょう。その場合は、トランザクションをかけておくとより安全です。

共有人数か何十人もいるなら、そもそもAccdbでは無理なので、SQL Server等の本格的なRDBMSへの移行を検討すべきでしょう。

1

問題のコードを提示してもらえますか。
質問は編集できますので、質問の方に追記してもらうと後々見やすいです。

あと、「切替のダイアログ」とは具体的にどのようなダイアログでしょうか。

2
みずき 2019/06/13 (木) 22:00:14 a63a9@dbd20

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

キーブレイク処理ですか。
一瞬で採番できてしまったのでビックリしました。

縦を横展開もクロス集計で解決しました。

どうもありがとうございます。、

1
hatena 2019/06/13 (木) 12:32:51 修正

DCountでの連番演算は重い処理になります。
テーブルに、Gid フィールドを追加して、VBAで連番を入力するようにすると高速になります。

下記で、自動で連番を入力する関数を紹介していますので、それを使うといいでしょう。

グループ毎連番を自動入力する関数
クエリで連番を表示する場合、DCount関数やサブクエリを利用する方法はあちこちで紹介されています。 しかし、この方法は自分より前のレコード件数をカウントするというロジックなのでレコード件数が多くなると幾何級数的に重くなります。また、グループ毎に連番を振るという仕様になると、条件式も複雑になってきます。 クエリは使わずにテーブルに連番フィールドを持たせて、そこに VBA で連番を書きこむようにすると高速...
fc2

それができたら、関係者社員番号の横展開は、クロス集計クエリで可能です。