Microsoft Access 掲示板

6,622 件中 5,361 から 5,400 までを表示しています。
2
肩こり慢性 2020/07/29 (水) 13:33:08 0029a@1c915

望み通りの結果が得られました。ありがとうございました。

5
肩こり慢性 2020/07/29 (水) 13:10:53 0029a@1c915

なるほど。更新クエリでもよいですね。勉強になりました!ありがとうございます。

1

まず、①と②は同じモジュール内に置かないといけない、という認識。

間違ってます。
②のモジュールはレポートのモジュールに記述してください。

具体的にはレポートのデザインビューでリボンの[デザイン]タブ-[ツール]セクション-[コードの表示]をクリックすると表示されます。

3

結局、全レコードを更新するということは、連結しているテーブルの全レコードを更新するということになりますので、レコードセットを移動しながら更新するか、更新クエリで一気に更新するかに、なりますね。

2
肩こり慢性 2020/07/29 (水) 11:40:33 0029a@1c915

仮定いただいたとおり、前者のパターンでした。しかし、こんなに複雑なVBAになるとは。
軽く考えておりました。。ありがとうございました。

1
hatena 2020/07/29 (水) 11:29:29 修正

帳票フォームで表示されている全レコードのチェックボックスのチェックをON/OFFする(=連結フィールドのValueを更新にする。)ということでしょうか。
それとも単票フォームあるいは非連結フォームに複数のチェックボックスか配置されていて、そのすべてのチェックボックスのチェックを外すということでしょうか。

とりあえず前者の方だと仮定して回答します。

フォームのレコードソースのテーブル名を「Tbl1」、
チェックボックスのコントロールソースのフィールド名を「Fld1」と仮定します。

Private Sub btn全チェック_Click()
    Dim rs As DAO.Recordset
    Set rs = Me.Recordset.Clone
    rs.MoveFirst
    Do Until rs.EOF
        rs.Edit
        rs!Fld1 = True
        rs.Update
        rs.MoveNext
    Loop
    Me.Recalc
End Sub

Private Sub btn全チェック外す_Click()
    Dim rs As DAO.Recordset
    Set rs = Me.Recordset.Clone
    rs.MoveFirst
    Do Until rs.EOF
        rs.Edit
        rs!Fld1 = False
        rs.Update
        rs.MoveNext
    Loop
    Me.Recalc
End Sub

あるいは、

Private Sub btn全チェック_Click()
    CurrentDb.Execute "UPDATE Tbl1 SET Tbl1.Fld1 = True;"
    Me.Requery
End Sub

Private Sub btn全チェック外す_Click()
    CurrentDb.Execute "UPDATE Tbl1 SET Tbl1.Fld1 = False;"
    Me.Requery
End Sub

後者の場合は処理後に先頭レコードへ移動します。

14
coffee 2020/07/28 (火) 18:19:42 0029a@1c915

申し訳ありません!!教えていただいたかっこの位置について、訂正したつもりが、
自分の勝手な解釈が入っていたようで、違う場所に移動していました。
きちんと教えていただいた場所に移動することで、結果的にうまく動くようになりました。
本当にありがとうございました。

13

ごめんなさい。下の部分(単純なリンク部分)はいつの間にかうまく動いていたようです。
上の部分が、相変わらず新しいフォームが開いてしまう状況です。

もうしばらく沼にはまってみます…

12
coffee 2020/07/28 (火) 17:53:18 0029a@1c915

>7785世代
ミスをただしたつもりがまだミスがあり、申し訳ありません。(事情がありコピペできないのでミスってしまいました…)
ダブルクォーテーションでくくっておりましたがうまくいきません。

DoCmd.OpenForm "F_特別案件", , , "案件番号='" & Me!txt案件番号 & "'", , acDialog

正しく動いているものとの違いは、リンク元リンク先のフォームが同じクエリを参考しているものと、違うクエリを参考しているものになります。
大元のコントロールソースが違うということは関係ありますか?
(今、コントロールソースをあわせてみましたが、関係ないようですね…)

11

あっ、ミスってますね。ご指摘ありがとうございます。

10
7785世代 2020/07/28 (火) 15:32:54 20aee@38a3b

F_特別案件 をしっかり"(ダブルクォーテーション)でくくってもダメでしょうか?

9
coffee 2020/07/28 (火) 15:28:24 0029a@1c915

誤りがありごちゃついてきましたので、書き直します。

DoCmd.OpenForm "F_案件詳細", , , "案件番号='" & Me!txt案件番号 & "'", , acDialog

↑正常に動いているボタン。

 DoCmd.OpenForm "F_特別案件, , , "案件番号='" & Me!txt案件番号 & "'", , acDialog

↑今回の、正常に動かないボタン。(案件が1つもひっかからない。)

8

txt案件NO
↑間違いです。こちらも案件番号としています。

7
coffee 2020/07/28 (火) 15:01:55 0029a@1c915

ご確認ありがとうございました。
エラーは出なくなったのですが、どうもうまくいきません。
案件が1つもない状態で表示されます。

試しに、式の下の部分だけ試してみましたが、やはりうまくいきません。
フォーム上で、隣に似たようなボタンがあり、こちらは案件詳細ページに飛ぶことに成功しています。
どちらも行先のフィールド名を同じ(案件番号)にしているのが問題がありますでしょうか。

DoCmd.OpenForm "F_案件詳細", , , "案件番号='" & Me!txt案件番号 & "'", , acDialog

 DoCmd.OpenForm "F_保守", , , "案件番号='" & Me!txt案件NO & "'", , acDialog

6
7785世代 2020/07/28 (火) 14:29:14 20aee@38a3b

失礼、かぶってました

5
7785世代 2020/07/28 (火) 14:28:34 20aee@38a3b

横から申し訳ありません、
 > 引用テキスト Me.txt案件番号) & "'"

閉じカッコの位置はコチラでよろしいのでしょうか。
多分、修正されたらすぐに走るかと思います。

4
hiroton 2020/07/28 (火) 14:26:50 1eeaf@f966d >> 3

Dcountの括弧の閉じ位置がおかしいですね

If DCount("[案件番号]", "[T_特別案件]", "[案件番号]='" & Me.txt案件番号 & "'") = 0 Then
3

「案件番号」というのは実際のフィールド名ですか。

とりあえず下記で試してみてください。

If DCount("[案件番号]", "[T_特別案件]", "[案件番号]='" & Me.txt案件番号) & "'" = 0 Then
2
coffee 2020/07/28 (火) 14:13:34 0029a@1c915

ありがとうございます。
早速試したところ、(案件番号はテキストです)

実行時エラー 3075
クエリ式'案件番号='12345'の文字列の構文エラーです。

とでました。(12345は任意の案件番号)

わたしの指定に間違いがあるのかと思いますが、思い当たりません…
もし、どのようなミスがあるのか見当がつけば、教えていただけると助かります。

1

DCount関数は下記のような構文になります。

DCount(フィールド名, テーブル名またはクエリ名, 抽出条件)

また、それぞれの引数は文字列で指定します。

DCount 関数 - Access

案件番号フィールドが数値型なら、下記のコードになります。

If DCount("案件番号", "T_特別案件", "案件番号= " & Me.txt案件番号) = 0 Then

案件番号フィールドがテキスト型なら、下記のコードになります。

If DCount("案件番号", "T_特別案件", "案件番号='" & Me.txt案件番号) & "'" = 0 Then
10
hiroton 2020/07/27 (月) 11:41:21 ad4d5@f966d

回答はお二人提示されている通りですので、基本的なところをすこし

自分の載せたリンクは回答の裏付けのためで、そこで勉強してほしいという意図はほぼありません。質問の要点も分からない状態だったし

最初に記載した通りですが、VBAでは改行(Enterキーを押して入力される画面に見えないモノ)は特別な意味を持ちます。文字列はダブルクオーテーション(「"」)で囲みましょうというルールがありますが、この改行を超えて「改行を改行文字として文字列に含めること」はできません。

ではどうするかというと、今回のようにSQLとして扱う文字列であれば、改行は別に改行でなくともいいので半角スペースに置き換えてVBAの命令文1行で済ませてしまうというのが一番単純です。

strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1 WHERE (ID = 1 And 収入 >= 100) Or (ID = 2 And 収入 >= 60) Or (ID = 3 And 収入 >= 20) GROUP BY 地域 HAVING Count(1) = 3);"

最初のhatenaさんの回答(>> 1)の通りですね。

では、テキストとして改行を入れたい場合どうしたらいいかというと、改行として認識される文字コードを埋め込むという手法をとります。具体的にはkitasueさんが提示されている通り、vbNewLineをテキストの改行したい場所に文字列として連結してあげればいいです。文字列を連結する場合はお互いを「 & 」で繋げます

strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1" & vbNewLine & "WHERE (ID = 1 And 収入 >= 100)" & vbNewLine & "Or (ID = 2 And 収入 >= 60)" & vbNewLine & " Or (ID = 3 And 収入 >= 20)" & vbNewLine & " GROUP BY 地域 " & vbNewLine & "HAVING Count(1) = 3" & vbNewLine & ");"

最初の1行の表示からそうですが長いですね。こうなってくるとVBAコード上の見栄えの問題からコード上で改行を使ってどうにかできないかと考えることになります。

ちなみに、個人的にはアンダースコアを使った方法はいろいろと厄介なのでオススメしません。


ついでにたまに自分がやる手法でも

Sub main()
    Dim strSQL As String
    
    addLine strSQL, "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1"
    addLine strSQL, "WHERE (ID = 1 And 収入 >= 100)"
    addLine strSQL, "Or (ID = 2 And 収入 >= 60)"
    addLine strSQL, "Or (ID = 3 And 収入 >= 20)"
    addLine strSQL, "GROUP BY 地域"
    addLine strSQL, "HAVING Count(1) = 3"
    addLine strSQL, ");"
    
    MsgBox strSQL
End Sub

Sub addLine(str As String, addStr As String)
    str = str & vbNewLine & addStr
End Sub
7
hiroton 2020/07/27 (月) 10:19:32 ad4d5@f966d >> 5

前にACCESS本体をバージョンアップしたらなんかおかしくなったってのを見たことがありますが、セクション最下部に置いた改ページコントロールの下に隙間ができるようになったってのがありました。
2ページ目以降なぜか最上部にわずかな隙間ができて、ページごとの合計がどうも1行分ずれているらしいというのでいろいろ見ていたら前のページの最終行が次のページの先頭の行として重複するようになったって感じでした

今回の例題はセクションの最上部に改ページがあるタイプなので同様の問題が起こることはなさそうですが、行単位で制御したいなら改ページコントロールを使うことにいいことはなさそうですね

2
セロハン 2020/07/26 (日) 13:18:12 1d451@23a22

なるほど!余計な遠回りをしてしまっていました…根本的なことに気づけずお手数をおかけしてすみません…

1

フォームのレコードソースをクエリにして、コンボボックスの値集合ソースのテーブルを追加します。
テーブルを適切に結合して、追加したいテーブルから表示したいフィールドを表示させるようにします。

これで、フォーム上のテキストボックスのコントロールソースで表示したいフィールドを選択することができるようなります。さらにテキストボックスの「編集ロック」を「はい」にして編集できないようにします。そうしないとマスターのデータが編集出来てしまい具合がわるいので。

2

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

1

まずは、文章で状況を説明してください。

1.については、
コントロールソースにどのような式を設定したのか。

2. については、現状のVBAコードを提示してください。
また、どのようにうまく動作しないのか具体的に説明してください。
エラーがでるとか、反応がないのとか、・・・

1
kitasue 2020/07/25 (土) 18:15:58 ce705@e9d43

左端の列の、
1, 2, 3, 4, 5
のフィールド名を仮にSEQとすると、(グループ化した上で)SEQの最小でソートすれば良いのでは。

9

あるいは、

Dim strSQL As String
strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1 " _
       & "WHERE (ID = 1 And 収入 >= 100) " _
       & "Or (ID = 2 And 収入 >= 60) " _
       & "Or (ID = 3 And 収入 >= 20) " _
       & "GROUP BY 地域 " _
       & "HAVING Count(1) = 3" _
       & ");"

とか。

8
kitasue 2020/07/23 (木) 18:07:07 ce705@e9d43

    Dim strSQL As String
    strSQL = ""
    strSQL = strSQL & "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1" & vbNewLine
    strSQL = strSQL & "WHERE (ID = 1 And 収入 >= 100)" & vbNewLine
    strSQL = strSQL & "Or (ID = 2 And 収入 >= 60)" & vbNewLine
    strSQL = strSQL & "Or (ID = 3 And 収入 >= 20)" & vbNewLine
    strSQL = strSQL & "GROUP BY 地域" & vbNewLine
    strSQL = strSQL & "HAVING Count(1) = 3" & vbNewLine
    strSQL = strSQL & ");"
でいかがでしょうか。

7

hirotonさんの提示したリンク先にも方法が解説してありますが、
 方法: コード内でステートメントを分割および連結する - Visual Basic

分かりにくい場合は、下記も参考にしてみてください。

ソースコードが長い時に途中で改行する方法[エクセルVBA]

6
naonao 2020/07/23 (木) 12:29:04 09c37@96514

返信遅くなりました。

VBAの文字のコードが赤くなり、正しく記載できていない状態です。
この ")"の記載方法がわからなくて困っています。

記載いただいたURL参考にしてみます

7

ただ、すでに特殊案件にコピーしているのに間違って2回目でコピーするのは防ぎたいため「既に存在しています。本当に追加してよいですか?」とのメッセージを出したく思っています。

追加クエリでは1レコードずつチェックしてメッセージを出してユーザーに選択されるというのは難しいですね。

とりあえず追加クエリで追加してしまってから、重複があったら、重複データを抽出表示して、そのデータをみて必要か不要かをユーザーに判断させて、不要なら、不要な方を削除させる、というようなユーザーインターフェイスがいいのではないでしょうか。

hiritonさんの提案されている重複を判断するルールを明確に決めることかできるならそれをシステムに組み込んだほうがいいでしょう。
そのうえで厳密にルールだけでは決められない、人間の判断が必要という場合は、上記の方法を採用するということになるかと思います。

6
hiroton 2020/07/22 (水) 17:39:59 fc2dc@f966d >> 5

うまく伝わっていないとアレなので

既存のデータと比較して特定フィールドに重複があった場合「追加してよいですか?」と確認し、「はい」を選んだ場合

このようなユーザーの判断が挟まる処理は減らしたほうが楽ができますよという話です

例えば、「特殊案件として案件番号がすでに登録されていたらメッセージを表示して~」というのが質問時点での想定だと思いますが、

「案件番号」と「発送番号」を同時に重複チェックして、全く同じデータがあれば追加不可、「案件番号」に重複があっても「発送番号」が異なっていれば追加する

というような、重複とみなさないルール(=重複としてはじくルール)、つまり、確認メッセージを出したときにユーザーが「はい」と選ぶ基準をそのままシステムに実装しましょうということです。

あまり質問の内容に即した回答でもないので「やりたいこと」はそのままやりたいことリストにしておいてもいいと思いますよ


多分やりたいことがいっぱいあって(連番の扱いとか)全部の内容に一発で決まるような回答も難しいと思うので問題点を整理して番号を振ってみるといいと思います。回答側もどの部分についてなのか指摘しやすいので

5
coffee 2020/07/22 (水) 15:20:19 1d451@23a22

そうですね…増やしたい理由もあったのですが、
その方向で考え直してみようかなという気もしてきました。
初心者ながら、設計について周りに相談できる相手がいないので、お言葉いただけてありがたいです。

4
hiroton 2020/07/22 (水) 15:11:37 fc2dc@f966d

個人的な意見ですが、複数フィールドをチェックするようにして、しっかりと重複データは登録しないシステムにしたほうがいいんじゃないかなぁと

簡易チェックで処理の分岐をユーザーに求めて作業が止まるのも、処理の選択に対する人為的なミスを考えるのもいまいちな気がするので

連番についてはオートナンバーのようなキーがあるなら必要になってから作ればいいので質問のような追加クエリを実行する段階ではいらないと思います

10
cerophan 2020/07/22 (水) 13:41:36 0029a@1c915

すみません!今アクセスを立ち上げなおしてコピーしなおしたら「長すぎる」とのエラーが出ず、どうも反映されたようです。原因は不明ですが、とりあえずうまくいきました。お手数をおかけいたしました。正規の件につきましては、なにかありましたらご助言いただけると助かります。
ありがとうございました。

3

現在のところ、特殊案件番号はオートナンバーにしています。
また、T_案件の主キーは案件番号です。

基本的には1つの案件番号に1つの特殊案件番号となる場合が多いのですが、稀に1つの案件番号の中に複数の情報が含まれており、特殊案件テーブルではそこをバラバラにしたい…というイメージです。
ただ、すでに特殊案件にコピーしているのに間違って2回目でコピーするのは防ぎたいため「既に存在しています。本当に追加してよいですか?」とのメッセージを出したく思っています。

T_特殊案件では、主キーを「案件番号+案件番号が存在する数の連番」みたいな形にしたいです。

2
coffee 2020/07/22 (水) 13:26:54 1d451@23a22

今のところVBAは使っておりません。現在、帳票のフォーム(F_案件)で、任意の案件のボタンを押すと、
マクロ実行「クエリを開く」(Q_特殊案件追加という名前の追加クエリが実行される)して、
F_特殊案件に任意の案件データが追加される

という仕組のみとなっております。

追加するデータ(T_案件)は、外部からインポートしたデータ(複数レコード)です。今のところリンクはしていません。
(将来的にはリンクするかも。現在まだ設計中なのでリンクにすると修正が面倒だったのでまだしていません)

●追加先テーブルについて

テーブル名:T_特殊案件
フィールド名:案件番号、顧客番号、発送番号、フォルダパス
主キー:特殊案件番号

以上です。

9
cerophan 2020/07/22 (水) 13:11:21 1d451@23a22

ご確認ありがとうございます。すみません。最後の「)」抜けの件は、投稿したあと気づきました…
仰る通り、式が長すぎるようでエラーが出ます。正規化は考えているつもりなのですが…

ちなみにTDというのはTODOのことで、1つの案件に15個のTODOが存在しており、それらがすべて終わったら「済」が表示されるようにするための式になります。15個すべて1つずつの案件に紐づいているTODOなので、これ以上テーブルは分割できないかと思ったのですが、何か方法がありますでしょうか。。

8

提示の式の場合は、閉じカッコがひとつ少ないです。

=IIf(  ・・・中略・・・ And (IsDate([txtTD15]) Or [chkTD15]),"済","")

,"済" の前に閉じカッコが必要。

ただし、
コントロールソースに設定できる式の長さには制限があったと思います。
また、このような長い式になるということは、テーブルの設計がまずい可能性が高いです。
「テーブルの正規化」ができているかをまずは確認すべきですね。