Private Sub btnInput_Click()
On Error GoTo ErrHandler
If Nz(Me.cmbP_Name, "") = "" Or Nz(Me.txtQty, "") = "" Then
MsgBox "Fill P_Name and transaction Quantitiy", vbExclamation, "Caution"
Exit Sub
End If
Dim sngQty As Single
If Nz(Me.opgTzT, "") = "" Then
MsgBox "Choice transaction type", vbExclamation, "Caution"
Exit Sub
ElseIf Me.opgTzT = 21 Or 22 Then
sngQty = Me.txtQty
Else
sngQty = Me.txtQty * -1
End If
' フォームのレコードセットに直接データ入力
With Forms!F_Display!sbf_Display.Form.RecordsetClone
.AddNew
!T_Time = Me.txtTzDate.Value
!P_ID = Me.cmbPName.Column(0)
!TID = Me.opgTzT
!Qty = sngQty
!Memo = Me.txtMemo
.Update
End With
db.Execute strSQL
MsgBox "Already Inputed"
Call initilizeForm
Exit Sub
ErrHandler:
MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
Err.Description, vbCritical, "Error"
End Sub
Private Sub btnInput_Click()
On Error GoTo ErrHandler
If Nz(Me.cmbP_Name, "") = "" Or Nz(Me.txtQty, "") = "" Then
MsgBox "Fill P_Name and transaction Quantitiy", vbExclamation, "Caution"
Exit Sub
End If
Dim sngQty As Single
Dim strSQL As String
If Nz(Me.opgTzT, "") = "" Then
MsgBox "Choice transaction type", vbExclamation, "Caution"
Exit Sub
ElseIf Me.opgTzT = 21 Or 22 Then
sngQty = Me.txtQty
Else
sngQty = Me.txtQty * -1
End If
' SQLによる、データ入力
strSQL = _
"INSERT INTO T_SeihinTorihiki (T_Time, P_ID, TID, Qty, Memo) " &
"VALUES(" &
"#" & Me.txtTzDate & "#, " &
"'" & Me.cmbPName.Column(0) & "', " &
Me.opgTzT & ", " &
sngQty & ", " &
"'" & Me.txtMemo & "' );"
Dim db As DAO.Database
Set db = CurrentDb
ペイントで切り貼りしたところやはり線の太さも違うようです
コードで書いたので同じラインが引かれるはずですが不思議です
このサイト様で、レコードがない部分にも枠線を書くというテクニックがありますが
あちらでは正常に表示されていましたでしょうか?
私ほど神経質に見る人もそんなにいないのか気にならないだけでしょうか?
やってみましたがやはりおかしくなります
画像では視認しやすいように太さを7に設定しました
画像のように行により若干太さも変わり左先端がまちまちの不揃いになってしまいます
右端は丸みを帯びた先端ですがやや不揃いです
原因がわかりますでしょうか?
よろしくお願いいたします
その現象は発生するのは、画面上ですか、それとも実際に印刷したときですか。
とりあえず当てずっぽうですが、
Left = Me.ScaleLeft + 10
Top = Me.Height - 10
としたらどうですか。この数値を増減させてみて変化はありますか。
同じようなエラーが出てました。
私の場合、あるフォーム1のボタンをフォーム2にコピペして、マクロビルドしたら、フォーム2でエラーになりました。コピペではなく、フォーム2でボタンを新規作成さしたら正常に動きました。
わかりました。ありがとうございました。
ありがとうございました。教えていただいたURLを参考にコードを作成してみます!
作成した後、壁にぶちあたったら具体的なソースをアップして相談させていただきます。
問題はなるべく細かくすると解決の糸口も広がります(回答側としてどこまで「これはできるだろう」と思っていいのかわからないので悩みます)
②-1.アクセスの帳票で登録している各レコードフォルダパスを取得する
VBAでRecordsetを操作するのが王道です。これも「わからないこと」ですか?
解説しているサイトも多いので適当に検索してみるといいです。これについても回答が欲しいのであれば具体的なデータ(テーブル名、フィールド名、実際に操作するタイミング(フォーム名、ボタン名)等)を上げてください
②-2.ACCESSでファイルの保存をする
VBAでのフォルダ・ファイル操作について、公式ドキュメントなら
ディレクトリとファイルのキーワード サマリー
FileSystemObject オブジェクト
あたりですが、さすがにアレなので有名どころをひとつ
VBAでファイルの操作(Office TANAKAさん)
EXCEL VBAの内容ですが大部分はACCESSでも同じです
弊害というかフォームで使える機能が使えないということです。
例えば、更新前に入力値をチェックするとか、いろいろ細かい制御がフォームならできます。
サブフォームにはイベントやコードがありませんでした
All Records(すべてのレコード)になっていました。
No LocksまたはEdited Recordに変更したら、Error3008が消えました。
つまり、解決しました。ありがとうございます。
そのプロパティをいじったことがなかったので、勉強します。
そうなのですね。どういう弊害が出るのでしょうか。
サブフォーム内のコードでレコードを更新するようなことをしていませんかね。
連結コントロールに値を代入するとか。
あるいは、フォームの「レコードロック」プロパティを「すべてのレコード」に設定しているとか。
ソースオブジェクトをクエリにすると、フォームで使えるいろいろな機能が使えなくなるので、将来、機能を拡張したいときに困るかもしれません。
開発中で、完全にローカルサイトです。(データすら共用していません)
ほかのコードで開いていることもないような気がします。
昨日の報告通り、サブフォームをほかのフォームの埋め込みから、ソースオブジェクトをクエリに変更したところエラーの発生がなくなりましたので、(どういうことは私にはわかっておりませんが)、とりあえずこのやり方で構築していきます。
ありがとうございました。
罫線の描画に関しては Access の弱点の一つですね。
太さの細かい調整が難しいし、プリンターが変わると太さが変わったりとか、、、
私はこの点に関してはある程度妥協しています。
この点に拘りがあるなら、エクセルにエクスポートしてエクセルの方で印刷するようにした方がいいと思います。
どこかでT_Seihin_Torihikiを排他的に開いているということですので、コードのどこかで開いているとか、あるいはマルチユーザーで共有していて他のユーザーが開いているとか、・・・何か心当たりはないですか。
そして実際の印刷とデザインレイビュー以外では正常に表示されませんね(いろんな太さを何本か並べていますが消えるものがあります)
連投すみません
EXCELでオートシェイプを書いてACCESSにコピペしたら表示できるようです
”OLEサーバーが登録されていません”と何度か表示されましがOK押しまくるとコピペされます
ただ0.5と0.75はいけましたが0.25だけなぜか直線ではなく長方形になってしまうようです
間違えてアンカー書き込みになってしまいました
プリンタを借りてきました
プリンタの性能もあるかもしれませんがモノクロレーザーで
細線はかすれてほぼ印字なし
次の1だと太すぎるといった印象でした
EXCELのオートシェイプで書いてみたところ
0.25 0.5 0.75 あたりを使い分けるので仕切り線やヘッダーとの境界にちょうど良い感じでした
VBAで書く場合のやり方がよくわかりませんでしたがコピペしてみました
レイアウトに線が出現するわけではなく印刷プレビューなどを表示したときに表示されるようでした
ページフッターと詳細の間に0.75の線を、各レコード毎に仕切り線として0.25の線を挿入するにはどのようにしたらよいでしょうか?
プリンタを借りてきました
プリンタの性能もあるかもしれませんがモノクロレーザーで
細線はかすれてほぼ印字なし
次の1だと太すぎるといった印象でした
EXCELのオートシェイプで書いてみたところ
0.25 0.5 0.75 あたりを使い分けるので仕切り線やヘッダーとの境界にちょうど良い感じでした
VBAで書く場合のやり方がよくわかりませんでしたがコピペしてみました
レイアウトに線が出現するわけではなく印刷プレビューなどを表示したときに表示されるようでした
ページフッターと詳細の間に0.75の線を、各レコード毎に仕切り線として0.25の線を挿入するにはどのようにしたらよいでしょうか?
あっ、ポイントではなくピクセル単位でした。
とりあえず簡単に自宅のプリンタで試してみましたが、1ピクセルにしても細線よりは細くならないですね。
プリンターの解像度に依存しそうな気がします。
自宅にプリンタがないので出社したときに試してみます
テレワークなのでまだ先ですが(笑)
私もあまり検証したことはないので、とりあえず実験してみてください。
1ポイントというのは
標準でかく線の1や細線よりも細いのでしょうか?
標準機能の1〜6はポインではないんですか?
よくわかりません。
しかし、InputフォームのCall Initialize Formの後に
Forms!F_Display!sbf_Display.Requery
を挿入して更新させています。
VBAの Line メソッド で線を描画すると、DrawWidth プロパティで線の幅を1ポイント単位で設定できます。
Report. Line メソッド (Access) | Microsoft Docs
DrawWidth プロパティ (Access) | Microsoft Docs
Q_Dislay クエリを直接開いたときにそのクエリで更新できますか。
更新できないなら、更新できるような設計にする必要があります。
いままで
サブフォームsbf_DisplayのソースオブジェクトがF_Display_2(そのフォームのレコードソースがQ_Dislay)
となっていました。
(お伝えし忘れていました。すいません)
これを、
サブフォームsbf_DisplayのソースオブジェクトがQ_Display
にしたところ、エラーの発生が解消されました。
理由が全く分からないのですが、何が違うのでしょうか。
だめでした(変化ありません)
!T_Time = Me.txtTzDate.Value
のところで、Error3164 Field cannnot be updatedが出ました。
別案
下記の1行を追加するとどうでしょうか。
帳票フォームです
Docmd.OpenForm "PF_Input1",,,,,acDialog
Private Sub btnInput_Click()
On Error GoTo ErrHandler
If Nz(Me.cmbP_Name, "") = "" Or Nz(Me.txtQty, "") = "" Then
MsgBox "Fill P_Name and transaction Quantitiy", vbExclamation, "Caution"
Exit Sub
End If
Dim sngQty As Single
Dim strSQL As String
If Nz(Me.opgTzT, "") = "" Then
MsgBox "Choice transaction type", vbExclamation, "Caution"
Exit Sub
ElseIf Me.opgTzT = 21 Or 22 Then
sngQty = Me.txtQty
Else
sngQty = Me.txtQty * -1
End If
' SQLによる、データ入力
strSQL = _
"INSERT INTO T_SeihinTorihiki (T_Time, P_ID, TID, Qty, Memo) " &
"VALUES(" &
"#" & Me.txtTzDate & "#, " &
"'" & Me.cmbPName.Column(0) & "', " &
Me.opgTzT & ", " &
sngQty & ", " &
"'" & Me.txtMemo & "' );"
Dim db As DAO.Database
Set db = CurrentDb
db.Execute strSQL
MsgBox "Already Inputed"
Call initilizeForm
GoTo Finally
ErrHandler:
MsgBox "Error #: " & Err.Number & vbNewLine & vbNewLine & _
Err.Description, vbCritical, "Error"
Finally:
If Not db Is Nothing Then
db.Close
Set db = Nothing
End If
End Sub
以上です。
インプットフォームはほかにこれといったコードがありません。初期化のためのInitialize Formと、閉じるボタンくらいです。
書式プロパティはフィールドに対して一つしか設定できませんので、「単位」フィールドは必要ですね。
表計算ソフトのEXCELとデータベースソフトのAccessでは根本的に違いますので、Excelでの発想は捨てて取り掛かりましょ
う。
「単位」フィールドをテキスト型にしてユーザーに自由に入力させると、km ㎞ Km Km などと表記ぶれが発生します。これはデータベースにとっては致命的ですので、マスターの方に単位フィールドを持たせるようにします。
テーブル例
T商品マスター
商品コード 主キー
商品名
単価
単位
T受注
受注コード 主キー
受注日
商品コード
数量
クエリを作成して、上記の2つのテーブルを追加して、商品コード同士で結合します。
T受注 の全フィールドを表示させて、T_商品マスターからは、商品名、単価、単位 を表示させます。
このクエリからフォームウィザードで入力フォームを作成します。
このフォームで商品コードを入力すると、商品名、単価、単位 が自動で表示されます。
このような設計にすると、表記ぶれは発生しません。
どの単位かはフィールドごとに固有でつけます
距離をいれるフィールドにはkmといった具合です
単位フィールドは作っていませんがそのようにするものですか?
EXCELの書式のようなイメージで質問しました
どの単位にするかはどのように決定されるのですか。
「単位」のフィールドが別にあるなら、コントロールソースを下記のように設定すればいいでしょう。
=[数値フィールド] & [単位]
メイン/サブフォーム形式でサブフォームは帳票フォームかデータシートですよね。
だとしたら連結フォームにするしかないです。(非連結では1レコード分のデータしか表示できない。)
これも連結フォームになります。レコードソースをデザインビューで設定するかVBAで設定するか、だけの違いですので。
とりあえず一部分のコードだけでは、全体像が把握できませんので、
インプット用のフォームを呼び出すイベントプロシージャ全体。
インプット用のフォームのコード全体を提示してもらえますか。
ご回答ありがとうございます
テーブルと連結させる必要はありません。(簡単に表示させるために連結というスタイルをとりました)
sbf_Displayとテーブル(クエリ)の連結を取り、F_DisplayのLoadイベント時に
[Forms]![F_Display]![sbf_Display].Form.Recordsource = (SQL文)として表示させましたが、これも同じでした。
(この場合も連結になってしまうのでしょうか)
サブフォームに直接打ち込む方法でなく、インプットフォームを利用したいとする場合はどうするのでしょうか?
あ、次回の案件を作る際部分的にフィールドを引っ張る際に、既に冗長になりますね…
改めて考え直します…
そういうことだったんですね!おかげさまでうまくいきました。
F_Displayおよびsbf_Displayがテーブル(またはクエリ)と連結しているフォームなら、フォームでデータを入力するという考えかたにすべきです。
VBAで新規レコードに移動して、そこでフィールドに代入するか、
フォームのRecorsetプロパティでレコードセットを取得してそれに対してAddNewするのが王道です。
FollowHyperlink は本来はURLからWEBページを開くものなので、URLには使えない文字は受け付けないのだと推測。
URLで使用可能な文字、使用できない文字
フォルダーを開くなら、Shell関数でエクスプローラーを起動すればいいでしょう。
下記でどうてしょうか。
リッチテキスト形式を使ってみては?
リッチテキストフィールドを作成または削除する
リレーション組めれば楽なのにってパターンですね。あるあるです。が、データベース的にはあまり考えたくない特殊な条件なので質問時点で記載があるとよかったかなぁと思います
この条件だと、最後に提示したメイン-サブフォーム形式は使えないので「T_モニタリング(ケアプランID)」と「T_ケアプラン(プランID)」で(想定とは逆向きの)一対多でクエリを組んで計画日を拾うためだけの形で運用します
ケアプランIDは計算で求めることになる(求められる)のでフィールドに持つ必要はないともいえるのですが、結構複雑な処理になるので必要なタイミングで取得したらデータとして保存する(「ケアプランID」フィールドを設ける)というのがやはり扱いやすいと思います
質問では評価記入の基準のために「評価日」を設ければいいのではないか?としていますが、ケアプランIDがあればその計算は簡単なのと、ケアプラン側から評価の一覧を見たいとなった場合、ケアプランIDでモニタリングのデータが抽出できる等のメリットもあります
こうすると問題点が2つ上がってきます
1.どのタイミングでケアプランIDを取得するか、その求め方
求め方については、モニタリングの計画日がケアプランの計画期間内になるようなケアプランIDを拾えばいいので次のような式で求められます
「計画期間終」の入力が実際のプラン終了時(それまでは未入力)なんて場合は
Nz([計画期間終], DataAdd("m", 6, [計画日])-1)
等、手入れが必要になると思いますタイミングは、まず、モニタリングのデータ入力時に「計画月」を入力したタイミングで更新後処理イベントを使って
これで、ケアプランが存在しない場合はNullチェックで警告が出せますね
もう一つは、モニタリング入力時にケアプランが存在しなかったデータについて「後から入力する」ことですが、これはケアプラン入力時に更新クエリを発行すればいいでしょう
2.ケアプランIDがない場合、「評価」の入力可否をどのように決めるか
ケアプランIDがある場合は、
DateDiff("m", [計画日], [計画月])
で何か月目なのかが判断できますない(nullの)場合は、「ケアプランが不明です」として入力不可にしてしまうか、推定3か月目等、それでも入力すべきタイミングを計算するかを考える必要があります。後者の場合は、ケアプランの最後のデータを拾ってきて仮の計画日として計算させる形になります