Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,641 から 4,680 までを表示しています。
2
ニンジャ 2020/10/03 (土) 13:01:32 f1ed8@83c58 >> 1

ありがとうございます!やってみてうまくいかなかったらまた質問させていただきます。
ところで、こういったことをきちんと理解するにはSQLの勉強をすべきなのでしょうか…

4
どんぐり 2020/10/03 (土) 09:21:07 f1ed8@83c58 >> 3

そうだったんですね!とても助かりました。ありがとうございます。

3

メイン/サブフォーム形式のフォームをデータシート表示させれば、サブフォームはサブデータシート表示になります。
サブフォームのテキストボックスのダブルクリック時で該当フォームを開くようにすれば、データシート表示したときも反応します。。

2
どんぐり 2020/10/03 (土) 09:08:46 f1ed8@83c58 >> 1

ありがとうございます。リンクさせたいならデータシートではなくて、テキストボックスを配置するしかないということですよね。

1

データシートにボタンを置くことはできません。
テキストボックスのダブルクリック時のイベントプロシージャでOpenFormメソッドでフォームを開くことになるでしょう。

4
5流クン 2020/10/02 (金) 17:12:29 aac31@79d1a

連絡遅れました。
指摘していただいた箇所が、全部間違っていました。
正しく、計算してくれるようになりました。
ありがとうございました。

1
hatena 2020/10/02 (金) 16:50:28 修正

下記の記事が参考になると思います。

サブフォームのフィールドを対象にメインフォームにフィルタをかける - hatena chips

上記はメインフォームのFilterに抽出条件を設定していますが、今回はOpenFormメソッドの第4引数に抽出条件を設定すればいいだけです。

上記を読んでも、どうしたらいいか分からない場合は、
メインフォームのレコードソースのテーブル名(orクエリ名)と、それの主キーと主なフィールド名、
サブフォームのレコードソースのテーブル名(prクエリ名)と、それの主キーと主なフィールド名、
また、サブフォームコントロールのリンク親フィールド、リンク子フィールドの設定を教えてください。

1
セロハン 2020/10/02 (金) 11:39:42 0029a@1c915

1つずつ、まったく同じクエリをもう1つ作ったところテキストが切れずに表示させることができました。

2
ふせん 2020/10/02 (金) 08:15:54 0029a@1c915 >> 1

色々とこの方法を応用して使えそうです!ありがとうございました。

5

kitasue 様

ご回答いただき誠にありがとうございます。

コードを使用させて頂きましたところ、
▲後の複数ワードで除外検索が出来ました。

ご親切に教えていただき、本当にありがとうございます。
教えて頂いたコード、勉強させて頂きます

1
hiroton 2020/09/30 (水) 17:07:52 1c7e9@f966d

本物のボタンを被せてしまうのが簡単だとおもいます
ボタンの透明プロパティを「はい」にすると、見えないボタンが配置できます

3
5流クン 2020/09/30 (水) 16:13:10 aac31@79d1a

式の後にAS句をつなげてフィールド名を記述するのですか
試してみます。
InStr(~)=""と使っていました。
比較なので、>0 =0なのですね。
ありがとうございます。

2
トマト 2020/09/30 (水) 15:42:45 0029a@1c915 >> 1

単純なことだったんですね…スミマセン。ありがとうございました!

7

あっ、間違ってますね。ご指摘ありがとうございます。
回答を修正しておきます。

6
初めまして。 2020/09/30 (水) 14:13:36 0227b@96e2f >> 5

 早々にご回答頂きまして、ありがとうございます。
早速試してみたところ、思うように作動致しました。
今度は、文字列での絞り込みもトライしてみようと思います。

3行目の
If Not IsNull(Me.年度検索) And Not IsNull(Me.年度検索) Then
の二つ目の Me.年度検索を Me.年度検索2 に変更しました。

本当にありがとうございました。

5
hatena 2020/09/30 (水) 12:51:36 修正

レポートのレコードソースには、"年度登録"テーブルを設定します。

コマンドボタン「プレビュー」を配置します。このボタンのクリック時のイベントプロシージャを下記のように記述します。

Private Sub プレビュー_Click()
    Dim strFilter As String
    
    If Not IsNull(Me.年度検索) And Not IsNull(Me.年度検索2) Then
        MsgBox "[指定年度]と[除く年度]を両方入力することはできません!"
        Exit Sub
    End If
    
    If Not IsNull(Me.年度検索) Then
        strFilter = strFilter & " AND 年度=" & Me.年度検索
    End If
    
    If Not IsNull(Me.月検索) Then
        strFilter = strFilter & " AND 月=" & Me.月検索
    End If
    
    If Not IsNull(Me.年度検索2) Then
        strFilter = strFilter & " AND 年度<>" & Me.年度検索2
    End If
    
    strFilter = Mid(strFilter, 6) '先頭の" AND"を削除
    
    
    If DCount("*", "年度登録", strFilter) = 0 Then
        MsgBox "該当するレコードはありません。"
    Else
        DoCmd.OpenReport "レポート名", acViewPreview, , strFilter
    End If

End Sub

OpenReportの第4引数に抽出条件を設定できます。

4
初めまして。 2020/09/30 (水) 11:38:24 0227b@96e2f >> 3

 ご回答頂き、ありがとうございます。

入力1カ所と入力2か所で、条件として矛盾するところは選択しない。と、いうのが希望なのですが、
はじめたばかりで、変な事をおたずねしているような質問で申し訳ありません。

検索フォームの作成というところで、VBAでFilterをかける方法が記載されているのを何度か閲覧致しましたが、レポートに出力するにはこの方法しかない!と思いこんでおりまして、クエリで、フォームのテキストボックスの値を参照してレポートに出力という方法しか行っていませんでした。

VBAでFilterをかける方法を勉強したいです。
どうぞよろしくお願いいたします。

1

クエリを新規作成して「Qピックアップ」を追加して、更新クエリにすれば「Qピックアップ」で絞り込まれたレコードが対象になります。
「Qピックアップ」で条件を変更すれば、上記の更新クエリにも反映されます。

3

指定年度検索:テキストボックス名:年度検索
月検索:テキストボックス名:月検索
除く年度検索:テキストボックス名:年度検索2

いろいろな場合が考えられますので、それぞれの場合でどのようにしたいのか具体的に説明してください。


入力一か所

指定年度検索: 入力
月検索: 未入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 未入力
除く年度検索: 入力

指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力


入力二か所

指定年度検索: 入力
月検索: 入力
除く年度検索: 未入力

指定年度検索: 未入力
月検索: 入力
除く年度検索: 入力

指定年度検索: 入力
月検索: 未入力
除く年度検索: 入力
※これは条件として矛盾


すべて入力

指定年度検索: 入力
月検索: 入力
除く年度検索: 入力
※これは条件として矛盾

このすべてに対応しようとするとクエリではかなり式が複雑になりメンテナンス性が悪いです。
VBAでFilterをかける方法の方がシンプルにできますが、VBAの使用は可能ですか。

2
初めまして。 2020/09/30 (水) 09:54:56 0227b@96e2f >> 1

 ご回答頂き、ありがとうございます。
自分でも変な書き方だと思いました。
月だけを指定して検索すると、複数の年度が表示されるため 除く年度 で指定した年度を除いたものを表示したいです。
ただ、年度指定の検索項目も有効に残しておきたいし・・・・、同じくクエリ内で、一致検索とNot検索ができないのかなぁ・・・などと簡単に考えていました。
変な質問で申し訳ありません。

1
hiroton 2020/09/30 (水) 09:25:21 1c7e9@f966d

ACCESSはデータベースソフトです。「行数が変わる=データの件数が変わる」のは普通ですが、「列数が変わる=データの構造が変わる」のは基本、想定しません。

正規化をキーワードに調べてみてください。

正規化自体はただの考え方なのでExcelで実装でもACCESSで実装でも変わりません。正規化されたデータの処理ならACCESSのほうが得意です。

ACCESSにデータの取り込みが必要ならそれは正規化が必要で、ACCESSで組んだほうが楽(正規化しつつデータ取込できる)です。

また、データベースというのはデータ自体の順番を重視しません。都度、データの中身を使って並び順を指定します。そのため、データ取込の前にExcelで並び替えをしてもあまり意味がありません。(ACCESSに取り込んだらACCESSでの設定も必要)
ただ、たとえば純粋な記録順というのが欲しい場合、Excelで「並び順」列を用意して連番にして記録しておくというようなことはあるかもしれません。(この場合は記録日時列を作ってタイムスタンプを取るという形のほうがそれっぽいですが)

2
hiroton 2020/09/30 (水) 08:38:33 1c7e9@f966d

管理番号の中にCSDという文字が含まれていなかったらどうしたい?がないと回答も中途半端にしかできないですが

InStr 関数

基本、InStr()は結果が数値ですInStr(~)=""という比較はしません。やるなら「0」と比較して次の形です
IIf(InStr(~)>0,あるとき(,ないとき))
IIf(InStr(~)=0,ないとき(,あるとき))

価格 = Int(価格 - (220 * 0.088 + 100) * 0.95 / 0.934+0.5)」と「価格 = Int(価格 - (220 * 0.088) * 0.95 / 0.934+0.5)」はどちらも
(左辺)=(右辺)
の形になっています。比較の式なので結果はTrueFalseですね。たぶん、フィールド名を「価格」としたいのだと思いますが、この場合は
(式) AS 価格
のように、式の後にAS句をつなげてフィールド名を記述します

1

Likeで指定年度を検索して、除く年度を除外すること自体が矛盾してるのでは?
もしかしてやりたいことは、指定年度から除く年月を除外したいのでしょうか?

1
5流クン 2020/09/29 (火) 20:26:25 aac31@79d1a

 Cd = "管理番号,Int((価格 - IIf(管理番号 = 'csd-',19.36,119.36) 0.95) / 0.934)

と変更して、その場しのぎはできたのですが、
非常に汎用性が低いので、
正しい処理の仕方を、ご教授できたらと思います。

4
kitasue 2020/09/29 (火) 17:20:43 d057a@e9d43
        strSubFilter = Me.txtWord3
        strSubFilter = "*" & Replace(strSubFilter, "。", "* And *") & "*"
        strSubFilter = String(UBound(Split(strSubFilter, "▲")), "(") & strSubFilter
        strSubFilter = Replace(strSubFilter, "、", "* Or *")
        strSubFilter = Replace(strSubFilter, "▲", "*) And Not *")
        strSubFilter = "(" & BuildCriteria("職名", dbText, strSubFilter) & ")"

でいかがでしょうか。

3

kitasue 様

度々のレス失礼します。

別枠で新たに除外検索用に、
txtWord4というテキストボックスを用意し、
除外ワードだけを複数指定するという事は実現できました。

レス2番のように1つのテキストボックスで、
複数の除外ワードを指定する事が、
実現可能でしたらお知恵をお借り出来ましたらありがたいです。
よろしくお願いします。

[▲]区切りで、複数の(not条件)除外検索
    If Not IsNull(Me.txtWord4) Then
        strFilter = strFilter & " AND " & BuildCriteria("職名", dbText, _
        "*" & Replace(StrConv(Me.txtWord4, vbWide), "▲", "* And Not *") & "*")
    End If
2

kitasue 様

回答いただき誠にありがとうございます。

コードを使用させて頂きましたところ、
▲後のワードで除外検索が出来ました。

<質問>
大変恐縮ですが追加で質問させていただきます。

下記のように除外ワードを複数指定し検索は可能でしょうか?
(読点[、]でor条件、句点[。]and条件では、
複数ワードを指定出来たのですが、除外検索では難しいでしょうか?)

職名というレコードに
チーフ
SPチーフ
ADチーフ

というレコードがあったとして、
検索語句例:チーフ▲SP▲AD
→職名でチーフ が含まれるレコードのうちで、SP と AD を除いたレコードが検索表示される

※現在のコードで、上記の検索をすると下記のようなエラーmsgが出ました。
「実行時エラー'2435'
指定した式の閉じかっこが多すぎます。」

もし良い案がありましたら、教えて頂けましたら幸いです。

1
hiroton 2020/09/29 (火) 09:23:28 b14ec@f966d

セキュリティが最優先事項ならACCESSはNGじゃないですかね

テーブルデータを保護する(hatena chipsさん)
ACCESSパスワード強制解除とかで検索するとそれなりに情報出てくるし

ある程度妥協できるなら
1.上記リンクのとおり、SharePointとのリンク部分はパスワード付きのACCESSファイルで制限、実行ファイルはパスワード埋め込みつつACCDEファイルにして参照情報閲覧不可

2.VBAでレコードセットを動的に生成&VBAをパスワードで保護( VBAのモジュールにパスワードを設定するには?(T'sWareさん))

3.SharePointにODBC接続できるドライバを用意して実行ファイルに接続情報を埋め込みつつACCDEファイル化する(サードパーティ製のドライバが必要っぽい)


※かるくWebを漁ってみた(試してない)結果なのでご了承を

1
kitasue 2020/09/29 (火) 06:28:42 d057a@e9d43
        strSubFilter = Me.txtWord3
        strSubFilter = "*" & Replace(strSubFilter, "。", "* And *") & "*"
        
        If InStr(strSubFilter, "▲") > 0 Then
            strSubFilter = "(" & strSubFilter
        End If
        
        strSubFilter = Replace(strSubFilter, "、", "* Or *")
        strSubFilter = Replace(strSubFilter, "▲", "*) And Not *")
        strSubFilter = "(" & BuildCriteria("職名", dbText, strSubFilter) & ")"

でいかがでしょう。

1
cerophan 2020/09/27 (日) 22:10:43 f1ed8@2d897

スミマセン。自己解決しました。

7
ポンタ 2020/09/25 (金) 21:45:05 0029a@1c915 >> 5

スッキリしました!教えていただき、ありがとうございました。

6
ポンタ 2020/09/25 (金) 21:40:54 0029a@1c915 >> 4

>デフォルトの仕様を否定するほどのメリットは感じられませんね

今まで参考にしていた本が全て(?)txtなど付けるものだったので
目から鱗が落ちました。
現在作成中のものは付けてしまったので今更変更しづらいですが、今後参考にさせていただきます

5
hiroton 2020/09/25 (金) 19:57:05 88398@358c8

SQLに関わるときがフィールド名になるのでしょうか?

とりあえずはその認識であっています。
フォームのフィルターに指定する文字列や、定義域集計関数(DLookupとか)の条件部分はSQLのWHERE句に相当する文字列を指定することになっています。
WHERE句はその条件指定で(フィールド名)(比較演算子)(値)の形をとれるため、これに従ってフィールド名を要求している部分にフィールド名を記述するというわけです。

で、この時に使えるフィールド名はそのSQL文が実行されるときの対象となるデータ(テーブル、クエリや、フォームのフィルタならレコードソース)のフィールド名となります。

VBAの処理で文字列が生成され、その文字列をSQLとして処理する。「SQLに関わるとき」はそんな処理をしているんだと理解できるとフィールド名の使いどころもわかると思います。

4
hiroton 2020/09/25 (金) 19:06:30 修正 88398@358c8 >> 1

特に間違いはないですが、コントロール名とフィールド名の間に制約はないので、レコードソースの「タイトル」フィールドを参照するコントロールに「タイトル」という名前を付けることは普通にできることです。(コントロール名「タイトル」のコントロールソースに「タイトル」を指定する)

実際、既存のフィールドの追加からコントロールを追加するとデフォルトでフィールド名をコントロール名としたコントロールができるのがACCESSの仕様ですし

テーブル名はTから始めましょう、クエリ名はQから始めましょうのイメージでテキストボックスならtxt、チェックボックスならchkという話はあるのかもしれませんが、デフォルトの仕様を否定するほどのメリットは感じられませんね

3
ポンタ 2020/09/25 (金) 17:51:33 0029a@1c915

ちなみに悩む、というのが

If chkタイトル = True Then    ←この時はコントロール名

DoCmd.OpenForm "F_作品", , , "作品NO='" & Me!txt作品NO  ←フィールド名とコントロール名

上のようなときです。
SQLに関わるときがフィールド名になるのでしょうか?

2
ポンタ 2020/09/25 (金) 17:47:23 0029a@1c915 >> 1

なんだか色々勘違いしていたようで…すみません。

フィールド名は大元の名前(テーブルのフィールド名) 例:「タイトル」
コントロール名はフォームでテキストボックス等につける名前 例:「txtタイトル」
ですよね?

>フィールドを参照するコントロールをフィールド名と異なるコントロール名にすることがまずないので

?認識が間違っているでしょうか…😓

1
hiroton 2020/09/25 (金) 16:55:04 5878c@f966d

フィールドとはテーブルやクエリで設定した列のことを言います。フィールド名はその各列を識別するための名前ですね。

「txtタイトル、みたいなもの」はフォーム上に設置したテキストボックスやコンボボックスにつけた名前ですよね?これらフォーム上に設置するモノのことをコントロールと言います。ですので、「txtタイトル、みたいなもの」はコントロール名です。

「コントロールソースを引用する」ということは通常しません
掲示板でのやり取りの関係上、「txtタイトルのコントロールソースを指定してください」と回答することはありますが、往々にして質問者がコントロール名しか提示していないためフィールド名がわからずそうせざるを得ない。といった理由からです。


局面局面で公式として覚えるものなのか、理屈で語れるものであれば知りたいです。

よく使うので覚えてしまったものもありますが、やりたいことで検索したりMicrosoft公式のドキュメントを見れば書いてあるのでその通りにやるだけです。フィールド名を指定する必要がある場所にはそう書いてあります。

そもそもの話、フィールドを参照するコントロールをフィールド名と異なるコントロール名にすることがまずないので、どうしてそんなことに・・・などと思ってしまいますが

4
hiroton 2020/09/25 (金) 11:36:04 5878c@f966d

コントロールが表示されてもいいのならテキストボックスでそれっぽく代用するとかですかね
大きいチェックボックスを作る(もう一度学ぶMS-Accessさん)

見た目に使ってるのがテキストボックスなので条件付き書式で見た目を変えられます
「見た目使用不可なのにクリックしてしまった」のは更新前処理でつかんでCancelという感じで

ただ、ボタンっぽいテキストボックスは非常に困難そうでした
参考:Yahoo知恵袋

パッと見ボタンですが、ボタン的な動作はありません。マウスを乗せるとハイパーリンク機能でマウスカーソルの形が変わるだけです
リンク先では、条件付き書式で前景色を変えていましたが、コントロールソースでも=IIF(条件,"","標題")とするといいのかなと思いました


代案
ボタンにボタンっぽいテキストボックスを被せます
テキストボックスは条件付き書式やコントロールソースで使用不可の見た目を設定します

テキストボックスのマウスクリック時で、ボタンが使用可能であればSetFocusしつつ、WindowsAPIで再度マウス押し下げイベントを送り込みます
画面上の任意の位置をクリックするVBAコード(VBA(マクロ)で仕事を楽しく効率化さん)

テーマの使用をしたボタンは真似できないのとボタンのポイント時の強調表示ができないあたりがパッと思いつく違いです

2
ニンジャ 2020/09/25 (金) 11:32:07 0029a@1c915 >> 1

ご回答ありがとうございました。
私の環境では、列は6.5列余分にスクロールされて
行は7行余分にスクロールされます。

どちらにしてもどうしようもないとのこと、教えていただきありがとうございました。

1

確認してみたところ、
縦方向だと、最後の1行(新規行かある場合はその行)だけが見えるところまでスクロールできる、
横方向だと、最後の1列だけが見える範囲までスクロールできる、
というような仕様になっていると思いますが、
これ以上にスクロールできてしまうということでしょうか。
それとも、これはスクロールしすぎと感じるということでしょうか。

どちらにしても、スクロールできる範囲を設定できるプロパティはないのでどうしようもないと思います。