Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,841 から 4,880 までを表示しています。
3

ペイントで切り貼りしたところやはり線の太さも違うようです
画像
コードで書いたので同じラインが引かれるはずですが不思議です

このサイト様で、レコードがない部分にも枠線を書くというテクニックがありますが
あちらでは正常に表示されていましたでしょうか?
私ほど神経質に見る人もそんなにいないのか気にならないだけでしょうか?

2

やってみましたがやはりおかしくなります
画像では視認しやすいように太さを7に設定しました
画像
画像のように行により若干太さも変わり左先端がまちまちの不揃いになってしまいます

右端は丸みを帯びた先端ですがやや不揃いです
画像

原因がわかりますでしょうか?
よろしくお願いいたします

1

その現象は発生するのは、画面上ですか、それとも実際に印刷したときですか。

とりあえず当てずっぽうですが、

   Left = Me.ScaleLeft + 10
   Top = Me.Height - 10

としたらどうですか。この数値を増減させてみて変化はありますか。

5
とり 2020/08/29 (土) 11:39:50 bb981@b3e19

同じようなエラーが出てました。
私の場合、あるフォーム1のボタンをフォーム2にコピペして、マクロビルドしたら、フォーム2でエラーになりました。コピペではなく、フォーム2でボタンを新規作成さしたら正常に動きました。

16
nokonoko 2020/08/28 (金) 11:34:11 653a6@54883

わかりました。ありがとうございました。

2
ポンタ 2020/08/28 (金) 09:58:35 0029a@1c915

ありがとうございました。教えていただいたURLを参考にコードを作成してみます!
作成した後、壁にぶちあたったら具体的なソースをアップして相談させていただきます。

1
名前なし 2020/08/28 (金) 09:33:52 c6165@f966d

②についてがわかりません・・・

問題はなるべく細かくすると解決の糸口も広がります(回答側としてどこまで「これはできるだろう」と思っていいのかわからないので悩みます)

②-1.アクセスの帳票で登録している各レコードフォルダパスを取得する
VBAでRecordsetを操作するのが王道です。これも「わからないこと」ですか?
解説しているサイトも多いので適当に検索してみるといいです。これについても回答が欲しいのであれば具体的なデータ(テーブル名、フィールド名、実際に操作するタイミング(フォーム名、ボタン名)等)を上げてください

②-2.ACCESSでファイルの保存をする
VBAでのフォルダ・ファイル操作について、公式ドキュメントなら
ディレクトリとファイルのキーワード サマリー
FileSystemObject オブジェクト
あたりですが、さすがにアレなので有名どころをひとつ

VBAでファイルの操作(Office TANAKAさん)
EXCEL VBAの内容ですが大部分はACCESSでも同じです

15

弊害というかフォームで使える機能が使えないということです。
例えば、更新前に入力値をチェックするとか、いろいろ細かい制御がフォームならできます。

14
nokonoko 2020/08/27 (木) 17:27:46 653a6@54883

 サブフォーム内のコードでレコードを更新するようなことをしていませんかね。
連結コントロールに値を代入するとか。

サブフォームにはイベントやコードがありませんでした

フォームの「レコードロック」プロパティを「すべてのレコード」に設定しているとか。

All Records(すべてのレコード)になっていました。
No LocksまたはEdited Recordに変更したら、Error3008が消えました。
つまり、解決しました。ありがとうございます。
そのプロパティをいじったことがなかったので、勉強します。

ソースオブジェクトをクエリにすると、フォームで使えるいろいろな機能が使えなくなる

そうなのですね。どういう弊害が出るのでしょうか。

13
hatena 2020/08/27 (木) 14:31:48 修正 >> 12

サブフォーム内のコードでレコードを更新するようなことをしていませんかね。
連結コントロールに値を代入するとか。

あるいは、フォームの「レコードロック」プロパティを「すべてのレコード」に設定しているとか。

ソースオブジェクトをクエリにすると、フォームで使えるいろいろな機能が使えなくなるので、将来、機能を拡張したいときに困るかもしれません。

12
nokonoko 2020/08/27 (木) 13:16:48 653a6@54883

開発中で、完全にローカルサイトです。(データすら共用していません)
ほかのコードで開いていることもないような気がします。
昨日の報告通り、サブフォームをほかのフォームの埋め込みから、ソースオブジェクトをクエリに変更したところエラーの発生がなくなりましたので、(どういうことは私にはわかっておりませんが)、とりあえずこのやり方で構築していきます。

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

10

罫線の描画に関しては Access の弱点の一つですね。
太さの細かい調整が難しいし、プリンターが変わると太さが変わったりとか、、、
私はこの点に関してはある程度妥協しています。

この点に拘りがあるなら、エクセルにエクスポートしてエクセルの方で印刷するようにした方がいいと思います。

11

エラー3008(T_Seihin_Torihikiが排他的に開かれている、云々)

どこかでT_Seihin_Torihikiを排他的に開いているということですので、コードのどこかで開いているとか、あるいはマルチユーザーで共有していて他のユーザーが開いているとか、・・・何か心当たりはないですか。

9
ひよ 2020/08/26 (水) 17:55:05 8e098@02840

そして実際の印刷とデザインレイビュー以外では正常に表示されませんね(いろんな太さを何本か並べていますが消えるものがあります)

8
ひよ 2020/08/26 (水) 17:51:21 8e098@02840

連投すみません
EXCELでオートシェイプを書いてACCESSにコピペしたら表示できるようです
”OLEサーバーが登録されていません”と何度か表示されましがOK押しまくるとコピペされます
ただ0.5と0.75はいけましたが0.25だけなぜか直線ではなく長方形になってしまうようです

7
ひよ 2020/08/26 (水) 17:24:31 8e098@02840

間違えてアンカー書き込みになってしまいました

プリンタを借りてきました
プリンタの性能もあるかもしれませんがモノクロレーザーで
細線はかすれてほぼ印字なし
次の1だと太すぎるといった印象でした

EXCELのオートシェイプで書いてみたところ
0.25 0.5 0.75 あたりを使い分けるので仕切り線やヘッダーとの境界にちょうど良い感じでした

VBAで書く場合のやり方がよくわかりませんでしたがコピペしてみました
レイアウトに線が出現するわけではなく印刷プレビューなどを表示したときに表示されるようでした

ページフッターと詳細の間に0.75の線を、各レコード毎に仕切り線として0.25の線を挿入するにはどのようにしたらよいでしょうか?

6

プリンタを借りてきました
プリンタの性能もあるかもしれませんがモノクロレーザーで
細線はかすれてほぼ印字なし
次の1だと太すぎるといった印象でした

EXCELのオートシェイプで書いてみたところ
0.25 0.5 0.75 あたりを使い分けるので仕切り線やヘッダーとの境界にちょうど良い感じでした

VBAで書く場合のやり方がよくわかりませんでしたがコピペしてみました
レイアウトに線が出現するわけではなく印刷プレビューなどを表示したときに表示されるようでした

ページフッターと詳細の間に0.75の線を、各レコード毎に仕切り線として0.25の線を挿入するにはどのようにしたらよいでしょうか?

5

あっ、ポイントではなくピクセル単位でした。

とりあえず簡単に自宅のプリンタで試してみましたが、1ピクセルにしても細線よりは細くならないですね。
プリンターの解像度に依存しそうな気がします。

4
ひよ 2020/08/26 (水) 14:10:26 aeba8@02840

自宅にプリンタがないので出社したときに試してみます
テレワークなのでまだ先ですが(笑)

3

私もあまり検証したことはないので、とりあえず実験してみてください。

2
ひよ 2020/08/26 (水) 13:21:15 aeba8@02840

1ポイントというのは
標準でかく線の1や細線よりも細いのでしょうか?

標準機能の1〜6はポインではないんですか?

10
nokonoko 2020/08/26 (水) 13:19:42 653a6@54883

Q_Dislay クエリを直接開いたときにそのクエリで更新できますか。

よくわかりません。
しかし、InputフォームのCall Initialize Formの後に

Forms!F_Display!sbf_Display.Requery

を挿入して更新させています。

1

VBAの Line メソッド で線を描画すると、DrawWidth プロパティで線の幅を1ポイント単位で設定できます。

Report. Line メソッド (Access) | Microsoft Docs

DrawWidth プロパティ (Access) | Microsoft Docs

9

Q_Dislay クエリを直接開いたときにそのクエリで更新できますか。

更新できないなら、更新できるような設計にする必要があります。

8
nokonoko 2020/08/26 (水) 11:59:37 653a6@54883

いままで
サブフォームsbf_DisplayのソースオブジェクトがF_Display_2(そのフォームのレコードソースがQ_Dislay)
となっていました。
(お伝えし忘れていました。すいません)

これを、
サブフォームsbf_DisplayのソースオブジェクトがQ_Display
にしたところ、エラーの発生が解消されました。

理由が全く分からないのですが、何が違うのでしょうか。

7
nokonoko 2020/08/26 (水) 11:51:34 653a6@54883

下記の1行を追加するとどうでしょうか。

だめでした(変化ありません)

別案

!T_Time = Me.txtTzDate.Value
のところで、Error3164 Field cannnot be updatedが出ました。

6

別案

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
5

インプット用のフォームを呼び出すイベントプロシージャ全体。

Docmd.OpenForm "PF_Input1",,,,,acDialog

下記の1行を追加するとどうでしょうか。

Me.Refresh
Docmd.OpenForm "PF_Input1",,,,,acDialog
4
nokonoko 2020/08/26 (水) 10:38:33 653a6@54883

メイン/サブフォーム形式でサブフォームは帳票フォームかデータシートですよね。

帳票フォームです

インプット用のフォームを呼び出すイベントプロシージャ全体。

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と、閉じるボタンくらいです。

3

書式プロパティはフィールドに対して一つしか設定できませんので、「単位」フィールドは必要ですね。

表計算ソフトのEXCELとデータベースソフトのAccessでは根本的に違いますので、Excelでの発想は捨てて取り掛かりましょ
う。

「単位」フィールドをテキスト型にしてユーザーに自由に入力させると、km ㎞ Km Km などと表記ぶれが発生します。これはデータベースにとっては致命的ですので、マスターの方に単位フィールドを持たせるようにします。

テーブル例

T商品マスター

商品コード 主キー
商品名
単価
単位

T受注

受注コード 主キー
受注日
商品コード
数量

クエリを作成して、上記の2つのテーブルを追加して、商品コード同士で結合します。
T受注 の全フィールドを表示させて、T_商品マスターからは、商品名、単価、単位 を表示させます。

このクエリからフォームウィザードで入力フォームを作成します。
このフォームで商品コードを入力すると、商品名、単価、単位 が自動で表示されます。

このような設計にすると、表記ぶれは発生しません。

2
ひよ 2020/08/26 (水) 00:23:28 aeba8@02840

どの単位かはフィールドごとに固有でつけます
距離をいれるフィールドにはkmといった具合です
単位フィールドは作っていませんがそのようにするものですか?
EXCELの書式のようなイメージで質問しました

1

どの単位にするかはどのように決定されるのですか。
「単位」のフィールドが別にあるなら、コントロールソースを下記のように設定すればいいでしょう。

=[数値フィールド] & [単位]

3

メイン/サブフォーム形式でサブフォームは帳票フォームかデータシートですよね。
だとしたら連結フォームにするしかないです。(非連結では1レコード分のデータしか表示できない。)

[Forms]![F_Display]![sbf_Display].Form.Recordsource = (SQL文)

これも連結フォームになります。レコードソースをデザインビューで設定するかVBAで設定するか、だけの違いですので。

とりあえず一部分のコードだけでは、全体像が把握できませんので、
インプット用のフォームを呼び出すイベントプロシージャ全体。
インプット用のフォームのコード全体を提示してもらえますか。

2
nokonoko 2020/08/25 (火) 18:34:48 653a6@54883

ご回答ありがとうございます

テーブルと連結させる必要はありません。(簡単に表示させるために連結というスタイルをとりました)
sbf_Displayとテーブル(クエリ)の連結を取り、F_DisplayのLoadイベント時に
[Forms]![F_Display]![sbf_Display].Form.Recordsource = (SQL文)として表示させましたが、これも同じでした。
(この場合も連結になってしまうのでしょうか)

サブフォームに直接打ち込む方法でなく、インプットフォームを利用したいとする場合はどうするのでしょうか?

1
ポンタ 2020/08/25 (火) 17:27:14 f1ed8@f7e2a

あ、次回の案件を作る際部分的にフィールドを引っ張る際に、既に冗長になりますね…
改めて考え直します…

2
ポンタ 2020/08/25 (火) 16:49:50 0029a@1c915

そういうことだったんですね!おかげさまでうまくいきました。

1

F_Displayおよびsbf_Displayがテーブル(またはクエリ)と連結しているフォームなら、フォームでデータを入力するという考えかたにすべきです。

VBAで新規レコードに移動して、そこでフィールドに代入するか、
フォームのRecorsetプロパティでレコードセットを取得してそれに対してAddNewするのが王道です。

1
hatena 2020/08/25 (火) 15:36:20 修正

FollowHyperlink は本来はURLからWEBページを開くものなので、URLには使えない文字は受け付けないのだと推測。
URLで使用可能な文字、使用できない文字

フォルダーを開くなら、Shell関数でエクスプローラーを起動すればいいでしょう。
下記でどうてしょうか。

Shell "Explorer.exe " & Me!txtフォルダパス, vbNormalFocus
5
hiroton 2020/08/25 (火) 10:01:38 ba56c@f966d

リレーション組めれば楽なのにってパターンですね。あるあるです。が、データベース的にはあまり考えたくない特殊な条件なので質問時点で記載があるとよかったかなぁと思います

この条件だと、最後に提示したメイン-サブフォーム形式は使えないので「T_モニタリング(ケアプランID)」と「T_ケアプラン(プランID)」で(想定とは逆向きの)一対多でクエリを組んで計画日を拾うためだけの形で運用します

ケアプランIDは計算で求めることになる(求められる)のでフィールドに持つ必要はないともいえるのですが、結構複雑な処理になるので必要なタイミングで取得したらデータとして保存する(「ケアプランID」フィールドを設ける)というのがやはり扱いやすいと思います


質問では評価記入の基準のために「評価日」を設ければいいのではないか?としていますが、ケアプランIDがあればその計算は簡単なのと、ケアプラン側から評価の一覧を見たいとなった場合、ケアプランIDでモニタリングのデータが抽出できる等のメリットもあります


こうすると問題点が2つ上がってきます

1.どのタイミングでケアプランIDを取得するか、その求め方

求め方については、モニタリングの計画日がケアプランの計画期間内になるようなケアプランIDを拾えばいいので次のような式で求められます

DLookup("プランID", "T_ケアプラン", [計画月] & " Beteen [計画日] AND [計画期間終] AND お客様ID=" & [お客様ID])

「計画期間終」の入力が実際のプラン終了時(それまでは未入力)なんて場合はNz([計画期間終], DataAdd("m", 6, [計画日])-1)等、手入れが必要になると思います

タイミングは、まず、モニタリングのデータ入力時に「計画月」を入力したタイミングで更新後処理イベントを使って

Private Sub 計画月_AfterUpdate()
    me!ケアプランID = DLookup("プランID", "T_ケアプラン", me!計画月 & " Beteen [計画日] AND [計画期間終] AND お客様ID=" & me!お客様ID)
End Sub

これで、ケアプランが存在しない場合はNullチェックで警告が出せますね

もう一つは、モニタリング入力時にケアプランが存在しなかったデータについて「後から入力する」ことですが、これはケアプラン入力時に更新クエリを発行すればいいでしょう

2.ケアプランIDがない場合、「評価」の入力可否をどのように決めるか

ケアプランIDがある場合は、DateDiff("m", [計画日], [計画月])で何か月目なのかが判断できます

ない(nullの)場合は、「ケアプランが不明です」として入力不可にしてしまうか、推定3か月目等、それでも入力すべきタイミングを計算するかを考える必要があります。後者の場合は、ケアプランの最後のデータを拾ってきて仮の計画日として計算させる形になります