Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,001 から 4,040 までを表示しています。
1
hiroton 2021/02/24 (水) 09:45:06 83be0@f966d

パスにコマンドとして認識されてしまうような文字が含まれている場合はパス全体を「"」ダブルクオーテーションで囲む必要があります

Shell "Explorer.exe """ & freePath & """, vbNormalFocus

半角スペースが含まれてるパスなんかもよくあるパターンですね

6
hiroton 2021/02/24 (水) 08:50:38 83be0@f966d

分かりにくかったようですみません。実際に修正すべき部分だけを示すならば

[Me]![商品コード]
↓
[商品コード]

です。前後の変更しない部分を表記したほうが分かりやすいかなと思ったんですが余計でした


'"&の使い方

解決してそうですがせっかくなので技術的な話を
DLookUpの第三引数にはWHERE句に相当する文字列を指定します。「文字列」なので実際に処理されるSQL構文を「"(ダブルクオーテーション)」で囲みます

SQL構文(一部)
[商品コード]='A10'

ACCESS上(VBA)での該当する部分の表記(前後を「"」で囲む)
"[商品コード]='A10'"

今回の目的は「A10」を変数(フォーム上のテキストボックスの値)にしたいということなので、文字列の途中を抜き取るような形になります。元の文字列でそっくり残したい部分は前後に分割されて、それぞれで独立した文字列として「"」で囲みなおすことになります

SQLの文字
(文字列の前半)        => [商品コード]='
(変数化したい文字部分)=> (任意の文字)
(文字列の後半)        => '

ACCESS上(VBA)での表記
(文字列の前半)        => "[商品コード]='"
(変数化したい文字部分)=> [商品コード]
(文字列の後半)        => "'"

そうして最後にそれぞれに分割した内容を文字列として連結するために「&」でつなぎます

結果
"[商品コード]='" & [商品コード] & "'"

1

更新削除が目的なら、連結フォームでやれば簡単ですが、非連結フォームでやる理由はなんでしょうか。

下記のように抽出条件を設定して開けば、目的のレコードが表示されます。更新削除フォーム側のコードは不要になります。

Dim args As String
args = Me.商品コード
DoCmd.OpenForm "F05_更新削除", acNormal, , "商品コード='" & args & "'", , acDialog
5

hatenaさま
ありがとうございました。'"&の使い方がまだいまいち混乱してしまいます。
オートルックアップクエリも参照させていただきました。
まだ難しいですが勉強してみます。
ありがとうございました😄

解決

2

例えば日付のところにLike""&[Date]&""とやったり。
[Date]Or Is Nullとか頑張りましたが。

クエリで日付フィールドの値が、今日の日付のものとNullのものを抽出したいということでしょうか。
日付の抽出条件欄に、
[Date] Or Is Null
でいいと思いますが、だめでしたか。

それとも、別の結果を期待していますか。その場合、どのような結果を期待していますか。

クエリの抽出条件は、日付フィールド以外に複数設定していますか。

現状のクエリのSQL文も提示してもらえますか。

1

①のSQLは「値集合クエリ」に設定しているということですか。

まず、このSQLの
Format(Year([満了日]) & "/" & Month([満了日]),"yyyy/mm")
は、
Format([満了日],"yyyy/mm")
で十分ですね。

②のコードは下記でいいでょう。

Private Sub cbo満了日検索_AfterUpdate()
   DoCmd.ApplyFilter , "Format([満了日],'yyyy/mm')=[Forms]![F_管理リスト]![cbo満了日検索]"
End Sub

VBAのコードにSQL条件式を埋め込む場合は、引用符として'(単引用符)を使います。

詳細は下記を読んでください。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

1
ワッフル 2021/02/23 (火) 19:37:28 0223d@73dc6

一応自分でも努力して。
例えば日付のところにLike""&[Date]&""とやったり。
[Date]Or Is Nullとか頑張りましたが。

ダメでした。
ヨロシクお願い致します。

4

Meが使えるのは、はフォームかレポートのモジュールのみです。コードの記述してあるオブジェクトという意味です。

フォームのコントロールソースプロパティでは使えません。大昔から現在まで使えません。

下記の式でいいと思います。

=DLookUp("[在庫数]","T01_商品","[商品コード]='" & [商品コード] & "'")

DLookUpは重いので、オートルックアップクエリを使うのをお勧めします。

ACCESSの基本技 オートルックアップクエリは超便利

オートルックアップクエリの利用 - もう一度学ぶMS-Access

3

追伸。フォームのプロパティソースにmeが使えないってことでしょうか?以前使った例を見たことある気がしますがバージョンによるものでしょうか?

2

ありがとうございます。
=DLookUp("[在庫数]","T01_商品","[商品コード]=& [商品コード] &)
ということでしょうか?
こちらもエラーになってしまいます。
よろしくお願い致します。

1

うまくいかないものでもいいので、現状のフォーム構成、VBAコードを提示してもらえますか。
それで、どこが「きれいに」いかないのか説明してください。

1
hiroton 2021/02/23 (火) 09:55:56 4451d@b1cd0

構文はVBAと同じで問題ないけどほとんどのキーワードは使えません
Meも使えないので単に& [商品コード] &と記述して参照しましょう

8
hanpen 2021/02/22 (月) 10:01:57 ee87a@c4422

りんごさん
こんにちは。コメントをありがとうございます。
また検証もしてくださったのですね。

解決策ですが、りんごさんも書かれていますように(hatenaさんが教えてくださった)
「クエリの結合プロパティを『T_顧客の全レコードと…』に変更する」で良いと思います。
(SQL的には内部結合から、T_顧客をメインとする外部結合に変更することになります。)

これで、担当者IDが空欄でも問題なく登録ができております。
取り違えていましたら申し訳ありませんが、ご返信までいたします。

7
りんご 2021/02/22 (月) 01:45:22 48103@0e907

担当者IDをDELETEして更新しようとするとエラーが出る、という事ですが、
クエリの段階でエラーを確認しました。
結合プロパティを変更すると、クエリとフォームでエラーが消失する事を確認しました。
解決策は、ごめんなさい、わかりませんでした。
迂回策ですが、此方、素人でパッと思いつくのは
担当者が未定の場合、空欄にして登録したい→担当者0(未定)を登録するみたいな感じか、
担当者が未定の場合、登録しない方向で、めっちゃ悩む感じか。
以下、駄文ですが
顧客テーブルの変更(顧客ID、顧客名)※担当者IDの削除
新しいテーブルの作成(顧客ID、担当者ID)
担当者テーブル(担当者ID、担当者名)
主キーどうする?、、、重複、ユニーク、、、
不一致クエリ、、、履歴どうする、、、そもそもテーブル設計的にどうなんだ?

6
hanpen 2021/02/22 (月) 01:21:51 ee87a@c4422

>hatena様

ありがとうございます。
フォームでのエラーの件ですが、解決いたしました。

原因ですが、F_顧客のレコードソースが下記のSQLになっていました。
クエリの結合プロパティを変更したのは良かったのですが、フォームのレコードソースのSQLは以前のまま「INNER JOIN」になっていました。

SELECT [T_顧客].[顧客ID], [T_顧客].[顧客名], [T_顧客].[担当者ID], [T_担当者].[担当者名] FROM T_担当者 INNER JOIN T_顧客 ON [T_担当者].[担当者ID] =[T_顧客].[担当者ID];

このSQLの「INNER JOIN」を手動で「RIGHT JOIN」に変更、もしくはレコードレースに「Q_顧客」を設定することで、フォーム上でもエラーが出なくなりました。

当方の単純ミス&確認ミスで度々お手数をお掛けいたしました。
申し訳ありません。

今回の件は本質的には「クエリの結合プロパティの設定」に拠るものと分かりました。
色々と勉強になりました。大変ありがとうございました。御礼申し上げます。


別案「レコードソースにテーブルを設定&コンボボックスの値利用」もありがとうございます。
こちらでも問題なくできました。
状況によって、クエリVerと使い分けできそうです。
hatena chipsの方も時々拝見して勉強させて頂いています。有用な記事を惜しげもなく公開して頂いてとても参考になります。ありがとうございます。

5

そのようなフォームは普通によく作成しますが、そのような現象にあったことがないので不思議です。

解決策ではなく、別案の提案ですが、下記のようにしてみたらどうでしょうか。

フォームのレコードソースは、T_顧客 にします。
担当者ID のテキストボックスは右クリックして[コントロールの種類の変更]-[コンボボックス]でコンボボックスにします。
このコンボボックスのプロパティを下記のように設定します。

コントロールソース 担当者ID
値集合ソース T_担当者
列数 2
列幅 3cm;0cm
名前 cb担当者ID

「担当者名」のテキストボックスの設定を下記のようにします。
コントロールソース =[cb担当者ID].Column(1)

これで担当者名が表示できます。

これだとレコードソースはテーブルなのでエラーが出ることはないと思われます。


あるいは、下記で紹介しているような方法をつかってみるのもいいかと思います。

コードでも名称でも入力できるコンボボックス - hatena chips

4
hanpen 2021/02/21 (日) 21:16:11 ee87a@c4422

>hatena様

お忙しい中、度々ありがとうございます。
はい。「フォームの担当者IDと結合したテキストボックスの規定値プロパティ」は空欄になっております。
困りました。どこがマズいのか、未だ検討がついておりません。。。

3

フォームの担当者IDと結合したテキストボックスの規定値プロパティの空欄になってますか。

2
hanpen 2021/02/21 (日) 15:48:41 ee87a@c4422

>hatena様

お忙しい中、早々にご返信をありがとうございます。
全て試してみました。フォーム上では同じエラーが出てしまい、ダメでした。(しかしながら「Q_顧客」のデータシートビュー上ではエラーが出なくなりました。)

・「T_顧客」の「担当者ID」フィールドのプロパティで「値要求」は「いいえ」になってますか。
→はい。

・「規定値」は空欄になってますか
→はい。

・「クエリのデザインビューで結合線をクリックして、結合プロパティを表示させて、
「T_顧客の全レコードと・・・」というオプションを選択してください。」
→こちらは少し変化がありました。Q_顧客をデータシートビューで開いて、担当者IDを空欄にしても当該エラーは出なくなりました。しかし、フォーム上で空欄にしますと以前として当該エラーが出てしまいます。

・そのフォームでVBAが設定されてませんか。
→はい、VBAは記述しておりません。(検証用に新規DBも作成しまっさらな状態でテストしています。Accessが勝手に追加したacwwzlib, acwzmain, acwztoolモジュールはあります。)


クエリの結合線プロパティでInner joinからLeft Join等に変更できるのですね。SQLベースで考えるとこれで納得できます。大変勉強になります。ありがとうございます。
あとはフォーム上では何故かまだエラーが出ております。これが解消できれば良いのですが。

1
hatena 2021/02/21 (日) 14:41:42 修正

「T_顧客」の「担当者ID」フィールドのプロパティで「値要求」は「いいえ」になってますか。
「規定値」は空欄になってますか。

クエリのデザインビューで結合線をクリックして、結合プロパティを表示させて、
T_顧客の全レコードと・・・」というオプションを選択してください。

上記の点を確認ください。もし、それでも解消しない場合は、そのフォームでVBAが設定されてませんか。設定れていたら、いちどそれを削除してみて試してみてください。(コードはバックアップしておいてください。)

3

①②ともOKのはずですのでまずは試してみてください。
それでうまくいかなければ、その時にどのようにしてどのようにうまくいかないか質問してください。

2

早速のご回答ありがとうございます。
試す前に再度質問してしまい申し訳ないのですが、
この、Sub SetFilter()を使えば

①例えば項目を先に選択した状態で、結果を表示した状態で内外を選択しても有効でしょうか?
②実際はもっと選択肢が多い状態ですが、教えていただいた内容で適当な順番で選択肢分増やしていけば大丈夫でしょうか?

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

1

「別のコンボボックス」の名前を「cbo項目検索」、対象フィールド名を「項目」と仮定して。

Sub SetFilter()
   Dim stFilter As String
   
   If Me.cbo内外検索 <> "" Then
       stFilter = " And [内外]=[cbo内外検索]"
   End If
   If Me.cbo項目検索 <> "" Then
       stFilter = stFilter & " And [項目]=[cbo項目検索]"
   End If

   DoCmd.ApplyFilter , Mid(strFilter, 6)
End Sub

Private Sub cbo内外検索_AfterUpdate()
    SetFilter
End Sub

Private Sub cbo項目検索_AfterUpdate()
    SetFilter
End Sub
3
どんぐりず 2021/02/17 (水) 21:33:58 0029a@1c915

色々とご検討いただいており、恐縮です。本当にありがとうございます。
ちょっと時間を見つけて試してみます。
お待ちください。

3
きなこもち 2021/02/17 (水) 16:45:46 561e2@c8e67 >> 2

遅ればせながらおっしゃっていることが把握できました。
連結フォームになっていないという初歩なミスでした。

ご指摘ありがとうございました。解決いたしました。

2
hiroton 2021/02/17 (水) 16:03:21 130d7@f966d

こちらの「F_メンバー」を削除しようとすると

「F_メンバー」で表示しているレコードを削除しようとすると、ですよね?
やはり、こちらでは再現しませんでした(エラーメッセージが出ることなくデータを削除できました)

「移動ボタン」の件もですが、ちょっと想定できない動作をしているので、詳しく状況を合わせる必要がありそうです

試してほしいことですが、新規にフォームを作成して、この機能だけのフォーム・サブフォームにしたら同じ問題が発生しますか?

1
hiroton 2021/02/17 (水) 16:01:07 130d7@f966d

その他の追加分

追加で質問ですが、現在登録済みだった所属部署は表示されるのですが、新規で所属部署を登録する画面の作成方法がわからず…

回答

Private Sub 所属部署タブ_Change()
    If Me!所属部署タブ = 4 Then
        Me!部署データ.Form.Recordset.AddNew
    Else
        If Me!部署データ.Form.NewRecord Then Me!部署データ.Form.Recordset.MoveFirst
        Me!部署データ.Form.Recordset.Move 所属部署タブ - (Me!部署データ.Form.CurrentRecord - 1)
    End If
End Sub

こっちは発生している問題が解決したら煮詰めるということで

2
きなこもち 2021/02/17 (水) 14:08:57 561e2@c8e67 >> 1

情報不足していて済みません。
非連結で作成しています

13
どんぐりず 2021/02/17 (水) 13:34:43 0029a@1c915 >> 8

結構大掛かりになってきたのですね。ちょっと一旦考え直してみます。ありがとうございます!

12
どんぐりず 2021/02/17 (水) 13:33:09 0029a@1c915 >> 4

ちなみにこのとき、「移動ボタン」を表示していると1つ目のタブの状態でレコード2へ移動可能です。

11
どんぐりず 2021/02/17 (水) 13:31:59 0029a@1c915 >> 4

コードを全て削除すると、1つ目のタブのみ表示される状態になりました。

1

回答の前に確認ですが、
「F_申請一覧」フォームは連結フォームですか、非連結フォームですか。

ラベルにデータを表示させているので、非連結フォームのようですが。
 

3

ちなみに、ハイパーリンク型フィールドの場合、# で区切った各セクションは下記の意味になります。

表示テキスト#リンクアドレス#リンクサブアドレス#ヒントテキスト

10
どんぐりず 2021/02/17 (水) 12:13:51 0029a@1c915

hiroton様ありがとうございます。
いただいた内容を確認してまいります。

新たに問題が発生しました。
こちらの「F_メンバー」を削除しようとすると
以下エラーが起きて削除できません。
実行時エラー 2101
プロパティの設定値として指定した値が正しくありません。

デバッグで指定される色が付くコードの部分は
me!所属部署タブ = 0

1

Access - 連動するコンボボックスについて|teratail
と同じ質問ですね。
そちらの方で回答してますのでそちらを参照してください。

3
l2102 2021/02/17 (水) 07:01:55 5e96a@6cf95

ありがとうございます。

>編集する方法と謳う上記リンク先のようなことをしても編集できないということでしょうか?

はい。なお私がいじり回して分かったのは、

・「インポート操作の保存」は、システムテーブルへのレコード追加と関係が無いらしい。ウィザードで、例えば 1 フィールドでもデータ型を既定以外のものに指定すると、全フィールドについてレコードが追加されるらしい
・「1 フィールドでもデータ型を既定以外のものに指定」は、システムテーブルに間違いなく反映されている。が、その後ここを直接に修正しても、その修正は「保存済みのインポート操作」の実行で無視される

という感じです。

2

hatenaさん ありがとうございました、無事にできました。実は添付ファイルで作ってたらファイルサイズがとんでもないことになってしまいハイパーリンク型に変えていました。本当に助かりました。

2
hiroton 2021/02/16 (火) 17:35:36 1ab75@f966d

せっかくなので少し調べてみました

保存済みのインポート操作」の内容はImportExportSpecificationオブジェクトにXML形式で保存されているようです

ImportExportSpecification object (Access)