Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,841 から 2,880 までを表示しています。
1
りんご 2022/01/27 (木) 18:17:01 c564b@0e907

 セオリーは知らないけど、年月で有効期間を表現すればええんじゃない?

3

VBAを使わずともアクセスの基本機能でできることです。
まずは基本機能を習得したうえで、それではできないことをVBAでするという設計にした方がいいでしょう。

その前にテーブルの設計におかしな部分がありますので、
下記のような設計としてください。

T_生徒テーブル
フィールド
 生徒番号 主キー
 名前
 年齢
 性別
 学校名

T_成績管理テーブル
 生徒番号
 日付
 国語
 数学
 英語

現状のフォームをもとに修正するなら下記の手順になります。

フォームのレコードソースを[T_成績管理テーブル]にします。

生徒番号のテキストボックスは右クリックして[コントロールの種類の変更]→[コンボボックス]でコンボボックスに変換します。
プロパティを下記のように設定します。

名前 cb生徒番号
コントロールソース 生徒番号
値集合タイプ テーブル/クエリ
値集合ソース T_生徒テーブル
連結列 1
列数 5
列幅 1cm;3cm;0cm;0cm;0cm
リスト幅 4cm

性別、年齢、学校名などのラベルは削除して、
テキストボックスを4つ配置して、コントロールソースをそれぞれ下記のように設定します。

=[cb生徒番号].Column(1)

=[cb生徒番号].Column(2)

=[cb生徒番号].Column(3)

=[cb生徒番号].Column(4)

これで、各テキストボックスから生徒番号を選択すると対応する名前、年齢、性別、学校名が表示されます。

国語、数学、英語のテキストボックスのコントロールソースも設定しておきます。

以上で、
最後のテキストボックス(英語)まで入力してEnterキーを押せば、
VBAなしに[T_成績管理テーブル]に登録されます。


りんごさんからも指摘がありますが、
本来は科目は縦に並ぶようにテーブル設計にすべきです。
そのような設計を「テーブルの正規化」といいます。

正規化されていないとデータベースの機能を活かせないので、正規化すべきですが、それを説明しだすと長くなるので、WEB検索して調べてみてください。

正規化の実例 - もう一度学ぶMS-Access

あと、Accessの基本機能、特に連結フォームについてもAccessの入門サイトなどで学習してください。

2
りんご 2022/01/26 (水) 23:24:15 c564b@0e907 >> 1

一部修正。

Public Sub 登録ボタン()
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
    Me.教科 = Me.テキストボックス教科
    Me.点数 = Me.テキストボックス点数
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub
1
りんご 2022/01/26 (水) 23:02:31 c564b@0e907

どのようなVBAのコードを書けばよろしいのでしょうか。

 抽出するコード、登録するコード、例えば、こんな感じになるのかも。最近触ってないのでちょっと怪しいですが。
 ただし、フォームのレコードソースを設定したり、クエリの抽出条件にテキストボックスを設定したり、諸々足りていないと動かないので色々ググって下さい。

Public Sub 抽出ボタン()
    Me.Requery
End Sub
Public Sub 登録ボタン()
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNewRecord
    Me.国語 Me.テキストボックス国語の点数
    Me.数学 Me.テキストボックス数学の点数
    Me.英語 Me.テキストボックス英語の点数
    DoCmd.GoToRecord acDataForm,”フォームの名前”,acNext
End Sub

もしくは

Public Sub 登録ボタン()
    DoCmd.OpenQuery “追加クエリの名前”
End Sub

 それはさておき、データベースがちゃんとデータベースである為に、Excelの何倍も手間暇をかけて登録する事になるって知っていますか?
 取り敢えず、主キーの設定が必要です。例えば、生徒とテスト名と教科が決まると、点数が決まるから、生徒とテスト名と教科を主キーとするなど。
 Excelのような通し番号は存在しません。ケースバイケースで並び順は変わります。
 そういえば、縦横自由に登録出来るデータベースは無理です。国語、数学、英語の点数を横方向に14,15,16とするのはNGなので、縦方向に登録しましょう。

教科点数
国語14
数学15
(新規)

 国語の点数を入力したら、登録ボタンを押して登録。数学の点数を入力したら、登録ボタンを押して登録。英語の点数を入力したら、登録ボタンを押す。エラーが発生、英語が教科として事前登録されていません。英語の点数入力を破棄して、教科として事前登録する為に…
 

15

ファイル送信フォームは私だけにメールで届きます。
ここにアップされることはありません。

14
どんぐりず 2022/01/25 (火) 09:23:46 440a7@6f3e7 >> 13

本件について、他業務に圧迫されなかなか本腰を入れることができず、ご教示いただいていたのに
回答が遅くなってしまい申し訳ありません。上記の記載が核心をついている気がします。
SQLの情報が長く、関係ない情報も入っていてここに記載するのが少しためらってしまうのですが
右下の「ファイル送信フォーム」からお送りした場合、hatena様にだけ届くのでしょうか。
(ここにはアップされない)
お手数をおかけして申し訳ありません。

2
スズ 2022/01/21 (金) 15:55:59 7c53a@f1e80

mae さん

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

2
りんご 2022/01/21 (金) 15:17:01 c564b@0e907

どういったときにそのデータ(=お客様CD)を使用するのでしょうか?

 例えば、売上日2020/4/2、お客様CD1180に紐づいた売上をたくさん登録したい時に使用するのかも。お客様CD:非表示、お客様名:表示、連結列:お客様CDの列として。

1

C:\Windows\System32フォルダに入っているなら、

Private Sub コマンド_Click()
    Dim pe As Long
    pe = Shell("mspaint.exe", vbNormalFocus)
End Sub

でいけると思います。

1
hiroton 2022/01/21 (金) 08:22:39 005b3@f966d

その手順は連結列プロパティを設定します。コンボボックスの値としてどの列を使うのか?の指定です

説明文の要点は「・・・データベースに保存または使用する値は・・・どの列・・・?」です

5
mae 2022/01/20 (木) 14:49:58 修正

hatena様
hiroton様

お世話になっております。
hiroton様のコードを混ぜながらトライしたところ、見事に私がイメージしている形で印刷することが出来ました。
色々なレポートで活用していきたいと思います。

大変助かりました。ありがとうございました。

3
hiroton 2022/01/20 (木) 13:37:21 3c477@f966d

縦線についてはきれいな表形式のレポートならレイアウト機能(レポートデザインツール→テーブル→表形式)を使って縦線の代わりにテキストボックスを使うと印刷時拡張で一緒にサイズが変わるのでちょっと楽かもしれません


最下部の横線考えてたらhatenaさんがいい感じの回答してますが、

Private Sub Report_Page()
    BottomPos = BottomPos - PageTop     '//変更
    Me.DrawWidth = 4 '罫線の太さを設定
    Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    PageTop = Me.Top  '//これだけでいい
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    BottomPos = Me.Top + Me.拡張設定のあるテキストボックス.Height '//追加
End Sub

単に印刷領域上からの位置でいいんじゃないかなぁというのと、Formatイベントは処理が複雑なので実際に描画したPrintイベントで位置を取得すると楽じゃないかなと

見る方向が逆になっているので+-が逆になるのと、印刷時拡張後の高さが欲しいので高さを取得するコントロールをきちんと指定する必要があります
グループヘッダー・フッターについても、ページの最後に印刷される可能性があるならPrintイベントで同様に最下部の位置を取得しておけばいいです
いずれにせよReport_Pageイベント直前のPrintイベントでBottomPosがその「セクションの印刷開始位置(Me.Top)+セクションの高さ」で上書きされていればちょうど最下部に線を描画できます

※大本のコード(その他の目的)部分は考慮していません

2

hatena 様

お世話になっております。
早々のご教授ありがとうございます。
上記コードにてトライしてみます。
また結果ご報告いたします。

1

リンク先のサンプルのコードを下記のように修正しててみてください。

Option Compare Database
Option Explicit

Const A4Height As Long = 29.7 * 567 'A4・スp・ス・ス・スフ搾ソス・ス・ス=29.7cm 1cm=567twips
Dim PageHeight As Long
Dim BottomPos As Long '追加
Dim PageTop As Long   '追加

'ページフォーマット時イベント 追加
Private Sub Report_Page()
    BottomPos = BottomPos + PageTop
    Me.DrawWidth = 4 '罫線の太さを設定
    Me.Line (0, BottomPos)-(Me.Width, BottomPos)
End Sub

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    '印刷可能領域下辺のページ上端からの高さを取得
    On Error Resume Next
    PageHeight = A4Height - Me.Printer.BottomMargin
    PageHeight = PageHeight - Me.Section(acPageFooter).Height
    PageTop = Me.Top  '追加
End Sub

Private Sub グループフッター1_Format(Cancel As Integer, FormatCount As Integer)
    If Me.Top + Me.グループフッター1.Height <= PageHeight Then
        Me.NextRecord = False
        If FormatCount > 20 Then Me.NextRecord = True
        '↑想定外の動作で無限ループになった場合でも、20回で止まる
        BottomPos = Me.Top '追加
    Else
        Cancel = True
    End If
End Sub

'詳細のフォーマット時イベント 追加
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    BottomPos = Me.Top - Me.詳細.Height
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    Me.DrawWidth = 1
    Dim ctl As Control
    For Each ctl In Me.詳細.Controls
        If ctl.ControlType = acLine And ctl.Visible = False Then
            If ctl.Width = 0 Then Me.Line (ctl.Left, 0)-(ctl.Left, 14400)
        End If
    Next
End Sub
1
hiroton 2022/01/20 (木) 08:46:04 3c477@f966d

1.「レコードをすべて差し込む方法」で最後のレコード(新規レコード)だけを対象にする

2.作業テーブルを用意し「レコードをすべて差し込む方法」で、常に1レコードだけを対象にする

3.Word文章(テンプレートファイルのコピー)のテキストを直接置き換える

ゼロからWordの差し込み印刷を設定する方法も検索すれば見つかりそうですが必要ないですよね?
(2)は少し特殊ですが、それぞれ簡単な単語で検索して見つかったページをつまみ食いした程度で出来そうな内容です。それぞれメリット・デメリットはあります。どのような問題があり、どういった手法を望んでいるんですか?

2
りんご 2022/01/17 (月) 10:22:08 c564b@0e907

 もしかして、月にいくらを便宜上、1日or月末で登録するという事でしょうか?それとも、1日に登録するか、月末に登録するかという事でしょうか?
 ググっただけですが、会計基準や会社のルールに従い、月にいくら、請求日、入金日を登録する感じになるのかも。

1

一般的には1日にすると思います。
日付/時刻型に年月だけ入力すると自動で1日になりますので。
末日が必要な時は、
DateAdd("m",1,[日付])-1
とか
DateSerial(Year([日付]),Month([日付]),0)
という式で求められます。

あるいは、日付/時刻型でなく、年、月の数値型の2フィールドにしたり、数値型の1フィールドで202101というように6桁にする方法もあります。

1
りんご 2022/01/14 (金) 15:50:17 c564b@0e907

 もう少し具体的に現状を説明すると誰か回答するかも?テーブル構造、SQL、VBAコードなど。

4
hiroton 2022/01/14 (金) 11:27:18 修正 b1700@f966d

ずれについては、グループヘッダーを使っていてそれが拡張した次ページに印刷されない分上にずれてる(ように見える)と予想
これならグループヘッダーセクション繰り返しプロパティを「はい」にすると対応できます

3

「背景がグレー」に関しては、詳細セクションの『代替の背景色』プロパティを「色なし」に設定してみてください。

「表示位置」に関しては現状のレイアウトとか設定が分からないと原因の特定は難しいです。
デザインビューとプレビューの画像をアップしてもらえたら何かわかるかもしれません。

2
m2cta 2022/01/14 (金) 09:46:56 a56f7@b6ded

ありがとうございます。
印刷プレビューで2ページ目も表示されるようになりましたが、2ページ目は背景がグレーになり、表示位置も上にずれています。原因がわかりません。よろしくお願いします。

4
hassy-hhh 2022/01/13 (木) 13:40:32 bf909@6eb0c

ありがとうございます!やりたいことが完璧にできました!

7
chichinpuipui 2022/01/13 (木) 13:21:27 28f2f@3f4b8 >> 6

皆様
ご回答いただきありがとうございます。
りんご様からご紹介いただきましたHatenaさんの方法で対応いたしました。
大変助かりましたありがとうございました。

1

詳細セクションとテキストボックスの「印刷時拡張」プロパティを「はい」に設定してください。

3

フォームのレコードソースがテーブルならば、

    Dim rs As DAO.Recordset    
    Set rs = Me.RecordsetClone
    rs.AddNew
    With Me.Recordset
        Dim i As Long
        For i = 1 To rs.Fields.Count - 1
            rs.Fields(i) = .Fields(i)
        Next
    End With
    rs.Update
    DoCmd.GoToRecord , , acLast

先頭フィールドがオートナンバー型のフィールドという前提です。

2
nokonoko 2022/01/12 (水) 16:28:49 3c8e6@52a60

hiroton様

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

2
hassy-hhh 2022/01/12 (水) 14:04:26 bf909@6eb0c

回答ありがとうございます。勉強になります。
テーブルのレコード自体をまるまるコピーして、新規レコードに貼り付ける方法はないでしょうか?

1

フォーム上に連結コントロールとして配置していないフィールドはコピーされません。
フォーム上に連結テキストボックスとして配置しておく必要があります。
表示させたくないなら、サイズを小さめにして、他のコントロールの背面に隠しておくといいでしょう。
「タブストップ」を「いいえ」にしておけば、タブキーで移動してもフォーカスしないのでユーザーは見ることができません。

1
hiroton 2022/01/12 (水) 09:38:57 56208@f966d

ComboBox.NotInList イベント (Access)

リスト外入力時イベントで制御できます

Private Sub コンボ_NotInList(NewData As String, Response As Integer)
    Me.コンボ.Undo
End Sub
3
hideki 2022/01/08 (土) 16:36:28 7cbc1@96514

自動では、できませんでしたが、何とか完成しました。
ありがとうございました。

6
名前なし 2022/01/08 (土) 13:48:59 f2dd3@0f6a0 >> 4

いつも、回答ありがとうございます。
今年もよろしくお願いします。

2
hideki 2022/01/08 (土) 13:31:12 7cbc1@96514

りんご様
回答ありがとうございます。
そうですよね。Excelでやるべきですよね。
そう、提案したんですけど、ACCESSの要望が強くて困っています。

1
りんご 2022/01/08 (土) 12:53:39 c564b@0e907

 Excelでやるのはどうですか?
 AccessもSQLも、横並びを使わない、ときに利用するものだと思います。

5
名前なし 2022/01/08 (土) 09:26:46 修正 f2dd3@0f6a0

「3まとめ」には同じ果物で農家がことなるレコードがあります。
例:もも 野田農園 百田農園があり、野田農園に数量40をセットしたいです。

農家テーブルは、

果物名 農家名
もも 野田農園
もも 百田農園

ということですか。
果物テーブルには農家名はないのに、その数量を野田農園にのみセットするという判断基準は何でしょうか。

4
りんご 2022/01/08 (土) 01:39:38 c564b@0e907

 集計クエリを作ったら、テーブル作成クエリに変更・実行。作成されたテーブルと更新したいテーブルで内部結合を組んで更新クエリを作成。取り敢えず思い浮かんだだけなので、動作確認が不十分です。
 余談ですが、僕だったら、明細テーブル:{農家,果物名,品種},数量とするかなぁ。
 ググっていたら、Hatenaさんのブログがヒットしました。流石ですね。
HatenaChips:更新クエリで定義域集計関数を使わずに集計する
 コマンドボタンに設定。明細レコードの先頭レコードに移動、更新クエリの実行、次のレコードに移動、更新クエリ実行、・・・みたいな使い方になるのかしら。
 追伸
 謹んで新春のお喜び申し上げます。今年もどうぞよろしくお願いします。

 

3
chichinpuipui 2022/01/08 (土) 00:35:17 28f2f@3f4b8

お世話になります。
ご回答いただきありがとうございます。
>画像を見ると、「3まとめ」テーブルは「1果物合計」クエリと同じもののようですが、なぜ取得できるものをテーブルにする必要があるのでしょうか。
その理由を聞かせてほしいです。
「3まとめ」には同じ果物で農家がことなるレコードがあります。
例:もも 野田農園 百田農園があり、野田農園に数量40をセットしたいです。

お教えいただいた方法ですと、農家名の指定ができないのでうまくいきませんでした。
もし他に方法がございましたらよろしくお願いいたします。
どうもありがとうございました。

2
名前なし 2022/01/07 (金) 22:52:17 f2dd3@0f6a0

画像を見ると、「3まとめ」テーブルは「1果物合計」クエリと同じもののようですが、なぜ取得できるものをテーブルにする必要があるのでしょうか。
その理由を聞かせてほしいです。

とりあえず、上記の疑問点はおいておいて、回答すると、
集計クエリを含むクエリは更新不可のクエリになります。それを更新クエリにすれば当然そのようなエラーになります。

集計クエリは使わずに、「3まとめ」テーブルから更新クエリを作成して、DSum関数で合計を取得して更新すれば可能ではあります。

更新クエリの設定

フィールド: 合計数
テーブル: 3まとめ
レコードの更新: DSum("数量","[1果物]","果物名='" & [果物名] & "'")
2
chichinpuipui 2021/12/25 (土) 23:55:37 28f2f@12436

お世話になります。
hatena様ご回答いただきありがとうございます。
こちらの方法で対応できました。
ユーザもカレントレコードが確認しやすいとよろこんでおりました。
ありがとうございます。
いつも助けていただきありがとうございます。
また質問させていただくことがあるかと思いますがその際はどうぞよろしくお願い
いたします。