Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,481 から 4,520 までを表示しています。
1
hiroton 2020/10/30 (金) 08:37:32 c36bc@f966d

コードはコピペするようにしてください

Forms!F診断リスト.refresh

Forms!F診断リスト.Requery

ではどうですか?

Form.Refresh メソッド (Access)

Requery メソッド (Access)

Requery メソッドは、フォームやコントロールの基になるデータを更新して、最後にレコード ソースに再クエリを行った後に追加または削除されたレコードを反映します。 Refresh メソッドを使うと、カレント レコードセットに加えられた変更だけが表示され、レコード ソースで新しく追加されたレコードや削除されたレコードは表示されません。 Repaint メソッドを使うと、指定したフォームとそのコントロールが再描画されます。

6
hiroton 2020/10/30 (金) 08:20:58 c36bc@f966d >> 1

カレントレコードとは現在選択中のレコードです
DAO レコードセットからレコードを削除する
カレントレコードを削除した状態で再度(カレントレコードを)削除しようとすれば当然「カレントレコードが存在しません」となります。時々ということは他の処理の影響でカレントレコードが移動しているのでしょう(エラーが出ないほうがたまたまうまく動いているというだけです)

リンク先にある通り

Me!サブフォーム.Form.Recordset.Delete
Me!サブフォーム.Form.Recordset.MoveNext

のようにカレントレコードを移す処理を入れてあげればエラーは出ないと思います

5
nankyoku 2020/10/30 (金) 07:47:36 f1ed8@73413

ありがとうございます。
昨日書いたあとも削除を何度も試していて、動きが不安定なので(ちょいちょいエラーになる)この機能は取り外そうかと悩んでいました。
最新のレコードから順に消すとエラーが出ない気がしたんですが…エラーが出る法則まではわかりませんでした。

サブフォームがデータシートビューのものと、帳票だけどヘッダーがフィールドタイトルの罫線区切りで埋まってるものの2種類があり、それについては削除ボタンの配置をメインフォームにしていました。

〉ちょっと怖い
危険性があるなら外そうと思います!
チェックボックスをつけて削除クエリで処理するようにしたいと思います。
アドバイスありがとうございました!

4
hatena 2020/10/29 (木) 20:36:55 修正

時々「カレントレコードが存在しません」というデバッグエラーが発生します。

下記で回避できそうな気がします。

On Error Resume Next
Me!サブフォーム.Form.Recordset.Delete

しかし、

現在メインフォームから、「削除ボタン」を押すとサブフォームのカレントレコードを削除できるようにしています。

そもそも、この仕様が無理があるように気がします。
サブフォームのレコードを削除するならサブフォームに削除ボタンを置いた方が自然ではないですか?

メインフォームに削除ボタンがあるとメインフォームのレコードごと削除されそうな気がしてクリックするのがちょっと怖いです。
マウス移動も大きくになりますし。

3
hatena 2020/10/29 (木) 20:30:07 修正

ちなみに、前期のマクロをVBAに翻訳すると下記のよにうなコードになります。

Private Sub コマンド9_Click()
    Me.日付.SetFocus
    DoCmd.FindRecord Me.検索窓口, acAnywhere
    If Me.日付 = Me.検索窓口 Then
    Else
        MsgBox "該当データがありません"
    End If
End Sub
1

マクロでやりたいですか。
VBAはわかりますか。
そろそろ、マクロからVBAへ移行しようという気持ちはありますか。

今回の質問内容から判断するにそろそろVBAへ移行すべきレベルにきているように感じます。

3
nankyoku 2020/10/29 (木) 18:34:59 0029a@1c915 >> 2
Me!サブフォーム.Form.Recordset.Delete

このコードで続けざまにサブフォームのレコードを選択して(どこかのテキストボックスにカーソルを置いて)削除を実行していると、時々「カレントレコードが存在しません」というデバッグエラーが発生します。
何か解決方法はありますでしょうか。

2
nankyoku 2020/10/29 (木) 17:51:21 0029a@1c915 >> 1

ネットで検索したコードで削除処理しておりましたが、教えていただいたコードで解決しました。ありがとうございます。

2
hatena 2020/10/29 (木) 17:48:42 修正

それぞれのテーブルの主キーはどれですか。また、テーブル1、テーブル2というのは実際のテーブル名ですか。テーブル名は内容を表すものにすべきです。

あと、それぞれのテーブルのデータ例も提示してもらえませんか。
フィールド名だけではどのようなデータなのか、データ間でどのような関係があるのか分かりません。

あと、担当者とは、何を担当するのですか。顧客毎に担当者が決まっているのか、グループ毎なのか、それによってもテーブル設計が異なってきます。

5

左右で行の高さがちがうのですね。それなら、リンク先の方法では無理です。
それぞれのレポートを別に作成して、サブレポートしては埋め込んでください。

テーブルはたぶん、伝票のヘッダー部分のテーブルと明細部分のテーブルがあると思いますので、ヘッダーテーブルをメインレポートのレコードソース、明細テーブルをサブレポートのレコードソースとすればいいでしょう。

4
すー 2020/10/29 (木) 16:48:57 becda@b9210

返信ありがとうございます。
ページ全体の罫線の配置を左右別々に設定してみました。
しかし、詳細に設定している印字データの高さが左右で違うため、左側の送り状の明細にそろえられてしまい、右側の受領書の明細に上手く配置されません。
左右明細の高さが違う場合はどうしたらよいのでしょうか?
よろしくお願いいたします。画像1

1
hiroton 2020/10/29 (木) 16:29:45 16ef8@f966d

フォームの一番上を表示する

DoCmd.GoToPage 1, 0, 0

そもそも表示位置が変わるような削除処理をしない

Me!サブフォーム.Form.Recordset.Delete
3

明細を持つ伝票とその複写を同じページに2分割して表示する - hatena chips
のサンプルファイル内の「R_納品書_左右」と同じ方法を使っているということでしょうか。

だとしたら、ページ全体の罫線はページヘッダーに配置してますので、そこの罫線の配置を左右別々に設定すればいいだけです。
ただし1ページの明細データが17件を超えないようにしましょう。
17件を超える場合があるときは、17件で改行するようにページフッターの高さを調整するといいでしょう。

6
リモコン 2020/10/29 (木) 10:58:52 1d451@2b9f5 >> 4

標題の質問にお答えいただきありがとうございます!確認します。

5
リモコン 2020/10/29 (木) 10:37:44 1d451@2b9f5 >> 2
Private Sub btn閉じる_Click
me.refresh
DoCmd.Close acform,"F診断カルテ",acSaveYes
Forms!F診断リスト.refresh
End Sub

上記のコードでもうまくいきませんでした。

また、F診断カルテで情報を追記し、診断テーブルで情報が追記されていることを確認できている状況で
F診断リストで「me.refresh」を試みても更新ができませんでした。
F診断リストを一回閉じて開きなおすと、更新ができます。
閉じて開きなおす、というVBAを実行するべきなのでしょうか…?

4
hiroton 2020/10/29 (木) 10:34:33 16ef8@f966d

クリックしたボタンならMe.ActiveControlで取得できます

Private Sub btn診療リスト_click
    MsgBox Me.ActiveControl.Name '//->「btn診療リスト」が表示される
End Sub

ボタン名:btn診療リスト
フォーム名:F_診断リスト

MsgBox IIf("btn診療リスト" = "F_診断リスト", "同じ", "異なる") '//->異なる

質問の内容だとボタン名とフォーム名は同じではないですね
ボタンの画面上に表示している文字ならそれは標題です。VBAならCaptionで取得できます

ユーザー定義関数とする場合、一つのフォームで使うだけならそのフォームのモジュールに記述してMeキーワードでいいですが、様々なフォームで使おうとするなら標準モジュールに記述することになりMeは使えません。そんなときにはCodeContextObjectを使います

あとはまぁ、どうしてもフォーム名を直接指定したいなんて場合もでるでしょう

Public Function myFormOpen( Optional formName As String)
    DoCmd.OpenForm IIf( formName <> "", formName, CodeContextObject.ActiveControl.Caption ), , , , ,acDialog
End Function
2
すー 2020/10/29 (木) 10:08:17 becda@b9210

返信ありがとうございます。
送り状,受領書は伝票が左右に並んでいます。1ページに17行印刷されます。
受領印は受領書の右下に配置しようと考えています。
よろしくお願いいたします。画像1

1

A4横2分割ということは伝票が左右に並んでいるということでしょうか。

明細の行数は同じですよね。
伝票によって明細数が変わったらおかしなことになりますので。

あと、受領印はどの位置に配置しますか。

できれば、印刷イメージの画像をアップロードしてもらうと分かり安いとと思います。

2
リモコン 2020/10/28 (水) 18:01:44 1d451@2b9f5 >> 1

新しいスレッドを立てて違う質問を書くつもりが、うっかり同じスレッドに2つ書いてしまいました。
分けた方がよかったでしょうか?
申し訳ありません。

1
リモコン 2020/10/28 (水) 18:01:01 1d451@2b9f5

現在「診断リスト」から、各「診断カルテ」を開くボタンがあります。
「診断リスト」は開いたまま上に「診断カルテ」を開く状態です。
「診断カルテ」にて、フィールド「タイトル」を変更した際、「診断カルテ」を閉じて
「診断リスト」を見ると、「タイトル」は変更されていません。
「診断カルテ」の閉じるボタンを以下にしてみましたが・・・ダメでした。
どうすればリアルタイムで変更が反映されるようになるのでしょうか。

Private Sub btn閉じる_Click
me.refresh
DoCmd.Close acform,"F診断カルテ",acSaveYes
End Sub
1

グループコードに対しての担当者を登録するテーブルを作成してみました
テーブル2
グループコード、担当者、氏名

紐づけ方がわかりません。
宜しくお願いします。

14
strSQL = "(SQL文)"

(SQL文)はどのように指定していますか?
上で紹介した方法で、実際にクエリを表示してみてください。エラーが表示されると思うので「作品テーブル」に必要なフィールドがないか、SQL文そのものが間違っているか確認してください

やりたいことが理解できていたなら、クエリデザインでクエリを作成し、SQLビューのSQL文をコピーしてVBAコードとして貼り付けという方法で作成するのもありです。
(クエリデザインから自動で作られるSQLは省略可能な部分も表記されるので醜いですが)

13
hiroton 2020/10/27 (火) 18:15:35 7c8fb@f966d

不要列がある場合

1.エラーにして無視する

strSQL = "SELECT タイトル, 感想, 1, 国 FROM 作品テーブル"

実処理部分が

        On Error Resume Next '//エラーを無視する
        For j = 0 To colCount
            rs(j) = Datas(i)
            i = i + 1
        Next
        On Error GoTo 0 '//エラー無視を解除する

となってるのでダミーの列を用意すれば取込はできます(処理的にはエラーが出てるのであんまりよくはない)

2.作品テーブルにダミー列を用意する

フィールド名「ダミー」を作っておきます

strSQL = "SELECT タイトル, 感想, ダミー, 国 FROM 作品テーブル"

余計な列が必要なので残念な感じですが、大きな問題はでないんじゃないかなと

3.取り込まない列制御処理を入れる

上記で問題がある場合ケースバイケースで何かしらの制御を入れることもあるかもしれません(複雑な処理を組むくらいなら次の方法のほうが楽なのであんまりやらない)

4.最初の構想通り一時テーブルを用意する

スタートが違う(個別にデータを解析して取り込む必要がある)ので紹介しなかったですが、個別にテーブルを用意してそれぞれから追加クエリを発行すると、フィールド名の対応を取りつつ不要列は取り込まないようにできます。データ形式が決まりきったファイルでインポート定義を使って取り込めるようなデータならこれをやります

2
ポンタ 2020/10/27 (火) 17:48:35 f1ed8@73413 >> 1

かなりサブフォームが便利そうですね。
グループが必ず発生する訳ではなくグループ数も不定なので、適当な数をタブで作成してみようかと思います。
リンク先を参考にさせていただき、取りかかろうと思います。ありがとうございます!

12
セロハン 2020/10/27 (火) 17:34:16 f1ed8@73413 >> 9

長文ありがとうございます🙇‍♂️
後ほど試させていただきます

11
hiroton 2020/10/27 (火) 16:25:00 7c8fb@f966d >> 9

ちょっと脱線しますがクエリSQLについての知識を身につけましょう
ざっくりですが、SQLはデータベースを扱うための命令書の仕様、クエリはSQLに従って作成された実際の命令書といった感じです

ACCESSはSQLを意識することなくクエリを扱えるアプリケーションですが、クエリの実態はきちんとSQLです。クエリデザインでリボンの「表示」からSQLビューデザインビューを相互に切り替えることができ、ACCESSのGUI(クエリデザイン)で作成するものがSQLであることが確認できます

つまり、SQL構文を記述するというのはクエリを作成すると同じことをしているわけです

それでは、クエリデザインを起動しテーブルの表示では何も選ばずに閉じて、SQLビューを表示してみましょう

SELECT;

と表示された画面が表示されるはずです。選択クエリを作成しようとし、テーブルを一つも選んでいないので選択クエリであることを表すSQLの命令SELECTのみが表示されている状態です。これを

SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル

に書き換えてデザインビューデータシートビューと切り替えてみましょう。よく使う形のものを見ることができると思います。このデータシートビューをみれば「対応する列を持ったテーブルを作成する」の意味が分かると思います

うまく動いたらSQLビューデザインビューを切り替えて見比べてみてください。何となくSQL構文のどこがどういう意味なのか分かると思います

そうしたら次に

SELECT タイトル, 感想,, 国 FROM 作品テーブル
SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル

も同様にSQLビューにコピペして試してみましょう


掲示板ではクエリデザインでのイメージを伝えるのが難しいものです。SQLビューを使ったSQL文のコピペのやり取りができると間違いのないやり取りができるようになるのでうまく活用できるようになりましょう

1

フォームにはグループ化の機能はないので、

フォームでサブタイトルフィールドを作成し、複数行ごと同じものを設定して
レポート表示する際にサブタイトルフィールドをグループ化する設計になるのでしょうか。

フォームのレコードソースのテーブルにサブタイトルフィールドを追加して、複数行に同じものを繰り返し入力することになりますね。
あるいは、サブフォームにして、非連結の親フォームのテキストボックスでサブタイトルを入力して、リンク親フィールド/リンク子フィールドの設定を「サブタイトル」にしておけばサブタイトルは親フォームで一回入力するだけですみます。

また、グループごとに行番号を振りたい場合は手動になりますでしょうか。

サブフォームを使うのではあれば、下記の方法が使えます。

帳票サブフォームで行番号フィールドの連番を維持する
一対多の関係のデータをメイン/サブフォーム形式で入力する場合、サブフォームのデータに連番(行番号)を振りたい。途中のレコードを削除しても欠番がでることなく連番を維持したい。また、任意に並び替えをしたい。 上記のような仕様を実現する方法を紹介します。  連番(行番号)に関しては、テーブルに持たせなくても、計算やVBAで表示させる手段がありますが、連番のフィールドがあるとクロス集計するときとか、固定...
fc2

サブフォームを使わない場合も上記を改良すればできないことはないですが、かなり難易度は高いでしょう。

10
セロハン 2020/10/27 (火) 15:54:33 0029a@1c915

作成してみたのですが、エラーが出ます。

以下のコードが黄色に反転される
Set rs = db.OpenRecordset(tblname)

実行時エラー'3075'
クエリ式 '国 FROM 作品テーブル' の構文エラー :演算子がありません。

9
セロハン 2020/10/27 (火) 15:10:46 0029a@1c915 >> 3

ありがとうございます。
取込不要の列があった場合にはどうなりますか?以下のように空欄にしてよいでしょうか。
※例えばパターン4の3列目に「取込不要列」があったとする。

パターン4
strSQL = "SELECT タイトル, 感想,, 国 FROM 作品テーブル"

もしくは
パターン4?
strSQL = "SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル"
2
ニンジャ 2020/10/27 (火) 13:56:32 0029a@1c915 >> 1

ありがとうございました!うまくいきました。

1
hiroton 2020/10/27 (火) 13:37:47 7c8fb@f966d

たぶん
If Me.状態.OldValue = "承認前" And Me.状態.Value <> "承認前" Then

If Me.cbo状態.OldValue = "承認前" And Me.cbo状態.Value <> "承認前" Then

8
hiroton 2020/10/27 (火) 13:26:58 7c8fb@f966d >> 3

メインのデータ取込処理は

        For j = 0 To UBound(Datas)
            rs(j) = Datas(j)
        Next

ですね。ループ処理になっているのでそれっぽく書き直すと

rs(0) = Datas(0)
rs(1) = Datas(1)
rs(2) = Datas(2)
:
:

な感じになります。これの意味するところはrsの0番目にDatasの0番目を入れる、rsの1番目にDatasの1番目を入れる・・・ということで、元データのフィールド名も作品テーブルのフィールド名も関係ありません。列番号だけ見て同じ列に値を入れているだけです。(列を飛ばしたりもできません)

例えばパターン2ならtblnameの1列目に「題名」を入れる、2列目に「作られた年」を入れるという処理をしていて、対応した列になっていればフィールド名は不問です

というわけで、「作品テーブル」から元データの列に対応する列を持ったテーブルをクエリ(SQL構文)で用意してあげます

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル"

パターン2
strSQL = "SELECT タイトル, 製作年 FROM 作品テーブル"

パターン3
strSQL = "SELECT タイトル, 感想, 国 FROM 作品テーブル"
7
セロハン 2020/10/27 (火) 12:53:59 0029a@1c915 >> 5

ありがとうございます。
仰る通り合体テーブルは変更して、「作品テーブル」とさせていただきます。
フィールド名は
タイトル、感想、製作年、国、おすすめ度合い、タイプ
でお願いします。
おすすめ度合い、タイプは後から追記するためのフィールドです。

6
hiroton 2020/10/27 (火) 12:45:22 7c8fb@f966d >> 5

「合体テーブル」のフィールド名を挙げてください
(「合体テーブル」も分割したテーブルがなくなると名前が変わりそうですね)

5
セロハン 2020/10/27 (火) 12:07:18 0029a@1c915 >> 3

仰る通り一連の質問の延長でした。
取り込む際に設定して1つのテーブルにすればよかったのですね。
ごめんなさい、例ではフィールド名を同じにしてしまいましたが、
実際は微妙に違う名前ですのでそれで書いてみます。
下記認識で正しいでしょうか…?

パターン1【フィールド名】タイトル、感想、製作年、国
パターン2【フィールド名】題名、作られた年
パターン3【フィールド名】タイトル、思ったこと、国名

パターンごとに3つボタンを作成。それぞれステートメント3行目を下記内容に変える。

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"

パターン2
strSQL = "SELECT 題名,, 作られた年 FROM 合体テーブル"

パターン3
strSQL = "SELECT タイトル, 思ったこと,,国名 FROM 合体テーブル"

以上、何卒宜しくお願いいたします。

4
セロハン 2020/10/27 (火) 11:55:22 0029a@1c915 >> 2

ユニオンクエリは重い処理になるとのこと。
作成前に教えていただき、とても助かりました。テーブルを1つにするように考えてみたいと思います。

3
hiroton 2020/10/27 (火) 09:59:32 7c8fb@f966d

一連の質問の延長ですかね?
最終的に合体テーブル(タイトル、感想、製作年、国、おすすめ度合い、タイプ、etc...)を作りたい。とか

    Set rs = db.OpenRecordset(tblname)

Database.OpenRecordset メソッド (DAO)

tblnameにはクエリを指定することもできます

'//テーブル1パターン
Private Sub データ追加_Click()
    Dim strSQL As String
    strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"
    Call AddData(strSQL, Me.txtデータ)
End Sub

こんな感じで必要な列と並びを指定してあげればデータごとにインポート用のテーブルを作る必要はないですよ

2
ポンタ 2020/10/27 (火) 09:48:08 0029a@1c915 >> 1

昨日から色々検索しても解決法が見つからず、自分でも完璧なものは作れなそうだったので、助かりました。
作成してみて、またわからなかったら質問させていただきます。ありがとうございます。

2

ユニオンクエリでできると思います。

ただ、ユニオンクエリは重い処理になりますし、更新できないクエリになりますので、テーブル設計の変更が可能なら、最初から一つのテーブルにしておいて、必要に応じてクエリで必要なデータを取り出すようにした方がいいでしょう。