Microsoft Access 掲示板

views
4 フォロー
6,349 件中 2,881 から 2,920 までを表示しています。
4
りんご 2022/02/04 (金) 21:18:28 c564b@0e907

 セオリーはわかりませんが、どうでしょう。

普段は月末にまとめて抽出

毎日、売上テーブルに売上データを登録。月末などになったら請求テーブルに請求データを登録。売上テーブルを絞り込んで請求テーブルに紐付けて更新。

たまに、今発生した売上をすぐに請求書にする

 請求テーブルに請求データを登録。売上テーブルに売上データ登録&請求テーブルに紐付けする。

 わざわざとか、複数になるのでとか、気にしたほうがいいのでしょうか。悩むならデータモデルを悩みたいですよね。

3
りんご 2022/02/04 (金) 18:13:25 c564b@0e907

 迂回出来るか、作り直すしかないのか、という事ですけれど、テーブル構造やVBAで何をやろうとしていたかなど追加情報が出てきたほうが、誰か回答するかも。

3

説明が下手ですみません

普段は売上テーブルにフォームで入力して月末にまとめて抽出して請求書にしています
たまに、今発生した売上をすぐに請求書にする、ということがあり、
そのときは一度上記の売上テーブルに入力して、抽出条件を設定して請求書を発行しています
すぐに請求書を発行する場合に、わざわざ抽出をしなくていいように
いま入力したものだけを請求書にして、その売上データも売上テーブルにいれる仕組みにしたいです

一般的にはそのようなわざわざそのような仕組みにせず(複雑になるので)ワンクッションおいてやるものでしょうか?

2
カルナ 2022/02/04 (金) 12:06:04 03236@afa8b

ありがとうございます。
多分このブログに当てはまるようです。
ということは、作り直すしかないということになるのでしょうか?
他に解決策はないでしょうか?

2

下記の動画などが参考になりませんか。

明細欄のある請求書を簡単に作成したい(Access 2019動画解説)
請求書のようなレポートはレポートウィザードを使用して原型となるレポートを作成し、それを基にレイアウトを調整していくと効率よく作成できます。ここでは2つのクエリを基にレポートを自動作成する方法を説明します。
できるネット

1
りんご 2022/02/03 (木) 18:49:47 c564b@0e907

 上手く汲み取れたかわからないけれど、手順の自動化、サブフォームの作り方、レポートの作り方を聞きたいのでしょうか?

8
すー 2022/02/02 (水) 10:06:42 cd14b@b9210

皆様 返信ありがとうございます。
hirotonさまに提示していただいた

Private Sub Form_Timer()
    Me!点滅用納期.Visble = Not Me!点滅用納期.Visble
End Sub

の方法がうまくいきそうです。
ありがとうございました。

4
塾長 2022/02/01 (火) 08:34:42 c04e3@ba492

みなさんいろいろアドバイスありがとうございます。がんばってみます。

2
カルナ 2022/02/01 (火) 08:11:53 03236@cb203

ありがとうございます。
大変勉強になります。
ご指導いただいた内容に沿って頑張って見ます。

1

通常はそのような線は出ないので、何か特別なことをしているはずです。
アドインを入れてるとかないですか。

思い当たることがない、ということなら、Officeをアンインストールしてから、再度インストールしてみてください。

1
hiroton 2022/01/31 (月) 14:13:20 53823@f966d

この掲示板でコードを表記する場合はコードブロックの記述を使うとわかりやすくなります

strWhere = "([請求締日]='" & Me![締日] & "')" & _
" AND ([請求先カナ] BETWEEN '" & Me![開始請求先] & "' AND '" & Me![終了請求先] & "')" & _
" AND ([施工者コード] BETWEEN '" & Me![開始施工者] & "' AND '" & Me![終了施工者] & "')" & _
" AND ([工事コード] BETWEEN '" & Me![開始工事] & "' AND '" & Me![終了工事] & "')" & _
" AND ([試験工場コード] BETWEEN '" & Me![開始試験] & "' AND '" & Me![終了試験] & "')"

If in_kbn = "w" Then

If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", , , strWhere

'//R_請求書10を印刷したときならここ

ElseIf PrinterGRP.Value = 2 Then

'//R_請求書控を印刷したときならここ

DoCmd.OpenReport "R_請求書控", , , strWhere

  End If

'//どちらでもいいので印刷したときならここ

Else

If PrinterGRP.Value = 1 Then
DoCmd.OpenReport "R_請求書10", acPreview, , strWhere 'プレビュー
ElseIf PrinterGRP.Value = 2 Then
DoCmd.OpenReport "R_請求書控", acPreview, , strWhere

End If

End If

また、コードの書き方を工夫すると理解しやすくなります

strwhere = "(省略)"

'//印刷・プレビューに使うレポートを決める
Dim reportName As String
Select Case PrinterGRP.Value
Case 1
    reportName = "R_請求書10"
Case 2
    reportName = "R_請求書控"
End Select

'//印刷またはプレビューを行う
If in_kbn = "w" Then
    DoCmd.OpenReport reportName, , , strwhere
    '//印刷したときだけCSV出力をするならここにコードを追加する
Else
    DoCmd.OpenReport reportName, acPreview, , strwhere 'プレビュー
End If

CSV出力の方法はいくつかあります。メリット・デメリット(使える・使えない)があるので組み込みながら調整が必要ですが、一番簡単と思われるのはTransferTextを使った方法でしょう

strwhere = "(省略)"

'//出力設定
Dim reportName As String
Dim queryName As String
Select Case PrinterGRP.Value
Case 1
    reportName = "R_請求書10"
    queryName = "(R_請求書10に対応したクエリ)"
Case 2
    reportName = "R_請求書控"
    queryName = "(R_請求書控に対応したクエリ)"
End Select

'//CSV出力先設定
Dim filePath As String
filePath = "C:\foo.csv"

'//処理実行
If in_kbn = "w" Then
    '//印刷
    DoCmd.OpenReport reportName, , , strwhere
    '//CSV出力
    DoCmd.TransferText acExportDelim, , queryName, filePath
Else
    '//プレビュー
    DoCmd.OpenReport reportName, acPreview, , strwhere
End If

DoCmd.TransferText メソッド (Access)

事前に出力用のクエリを作成しておく必要があります。(上記コードでは(R_請求書10に対応したクエリ)と(R_請求書控に対応したクエリ)。実際にはシステムに合わせたわかりやすい名前にします)

7

hatenaさま 返信ありがとうございます。
背景色は条件付き書式で設定しています。
帳票フォームの最背面にテキストボックス(非連結)を作り
ルールの内容を式にして
[工程]="A工程" のとき 背景色を青 のようにして7工程設定してあります。 

6
hiroton 2022/01/31 (月) 09:12:18 53823@f966d >> 4

改めて考えてみたら条件付き書式を弄るのは大変ですが、条件を弄るのは簡単でした

チェックボックスを配置する(名前:点滅用)

Private Sub Form_Timer()
    Me!点滅用 = Not Me!点滅用
End Sub

条件付き書式の条件を調整する
ex)

書式設定:式
   式:[納期]<Date() And [点滅用]

これでタイマーごとに条件付き書式が反映される/されないを繰り返すので点滅してるように見えると思います

コントロールがチェックボックス一つで済む(位置・表示不問)なのでこっちのほうが楽そうです。点滅させたいコントロールが多いなら断然ですね


hirotonが条件付き書式を好きでないのはスクロールバーを掴んでいると反映されないからという理由があったりします

5
りんご 2022/01/30 (日) 15:22:41 c564b@0e907

 メインフォームの検索条件を増やせば済むようにも見えますが。話題作りとしては、導出フィールドを作って何か出来ないか、なんてどうでしょう。
 工程別に色を変え失敗したものを強調したら、次はどうしますか。例えば、期限間近のものに音を鳴らしたり、数量が大きいものを立体的にしたり、手間と時間を見た目に費やすのでしょうか?
 そういえば、期限を過ぎたものって、データベースでどういう扱いになるのでしょうか。それから、工程フィールドは別に切り出さないの?

4
hiroton 2022/01/29 (土) 19:28:06 9b9bd@68800

タイマーイベントは単純に時間ごとにイベントを実行するだけ。その挙動(すべてのレコードのコントロールが同時に変更される)は帳票フォームの仕様ですね


基本事項の確認ですが、コントロールの「見た目」はいくつかの要素からなっています
・背景色
・前景色
・枠線(スタイル/色)

hatenaさん指摘の通り、背景色前景色であれば条件付き書式を切り替えれば実現できるでしょう。枠線もやりたいとなると案がないこともないですが、そこまでする?って感じです


さて、条件付き書式を変更すれば点滅できそうだ、となりましたが、hirotonは条件付き書式が好きではありませんし、VBAでいじるのは大変です。条件付き書式を使わずにレコードごとに書式を設定する方法を使うと楽ができそうです

カレント行の背景色の変更 その3(hatena chipsさん)

hatenaさんのブログですね。記事では背景色ですが、前景色も同じ考え方で実装できます
背景色に適用したい場合
メインのコントロール>背景色:透明コントロールの配置:前面
書式設定用コントロール>背景色:本来の背景色、コントロールの配置:背面

前景色に適用したい場合
メインのコントロール>背景色:本来の背景色、コントロールの配置:背面
書式設定用コントロール>背景色:透明コントロールの配置:前面

納期コントロールにぴったり重なる点滅用納期テキストボックスを配置します
コントロールソース:=IIf([納期]<Date,[納期])
背景色:透明
前景色:本来の背景色(※1)

このコントロールを表示したり消したりすれば特定のレコードのコントロールだけ点滅しているように見えます

Private Sub Form_Timer()
    Me!点滅用納期.Visble = Not Me!点滅用納期.Visble
End Sub

注意事項として、前面のコントロールなので普通に触れます。フォーカスがあるときにコントロールを消そうとするとエラーになります。触れないコントロールにするか、即座に納期.Setfocusするような仕掛けが必要でしょう

※1
本来の背景色と同じ色のテキストを前面に配置する≒背景と同化して見えなくなる。です。「文字を消す」ことが目的なら背景色のテクニックで完全にかぶせてしまってもいいですね。前景色でやると、調整によって薄めの文字との点滅とかができたりします

6
やまさん 2022/01/29 (土) 17:08:34 58219@0f11a

価格などはみなさんのアイデアでやるのがいいのかもしれませんね

・商品名の変更
・取引先の社名などの変更
・婚姻などで従業員の名字の変更
などはどのようにやるものでしょうか?
考えていたらありとあらゆるものが変更の可能性があるな、と

5
りんご 2022/01/29 (土) 08:04:07 c564b@0e907 >> 2

有効期限をつけて同じ内容で一部を変更したレコードを追加するということでしょうか?
同じIDは登録できませんよね?

同じIDは登録出来ないので、確かにこれは無理ですよね。

商品ID(主キー)商品名開始年月ほにゃらら
1りんご2022/1ほにゃらら
1 りんご2022/2ほにゃらら

どのようにやるということですか?

 最初にざっくり思い浮かべたのはこんな感じのでした。

商品ID商品名
1りんご
商品ID開始年月ほにゃらら
12022/1ほにゃらら
12022/2ほにゃらら〜
12022/3ほにゃらら〜〜

 商品名や社名も何とかならないか考えたんですけど、力不足でまとまらなかったです。見た目の履歴は残すとして、中身が変わらないのに見た目を参照する必要ってあるのかな、従来通り中身を参照出来ないかしら?
 プロに任せれば、マスタ全部に開始年月を組み込んで、複雑なデータベースを作ることが出来るのかもしれません。

リレーションするときの主キーはIDにすることが多いですが

 ググったり本を読んだりするとだいたいそんな感じなので自然にそうなっちゃいますよね。主キーはIDの泥沼から抜け出すなら早い方が良いですよ。頭を柔らかくしないと無理なので大変苦労します。

4

頻繁に変更があるものなら、トランザクションテーブルの方にデータを持たせるというのもありだと思います。

例えば、生鮮食品の価格とかは、売上履歴テーブルに価格も格納してしまえばいいと思います。
マスターには常に最新の価格を入力して、売上テーブルに入力するときに、VBAでマスターの価格を売上テーブルの価格に代入します。

あるいは、マスターとは別に価格変更履歴テーブルを作成するという方法もあります。

17
hatena 2022/01/28 (金) 23:31:05 修正 >> 15

届いています。ちょっと忙しかったので今、SQLを確認しました。

かなり複雑なSQLなので、それだけで原因を特定するのは難しいです。

症状の発生するファイルを送ってもらえたら、原因を特定できるかもしれません。(できないかもしれませんが)

3
hatena 2022/01/28 (金) 23:14:01 修正

各工程ごとに背景色が変えてあります。

これはどのように実現していますか?
帳票フォームでレコード毎に背景色を変更するのは、条件付き書式しかないですが。

点滅させるなら、その条件式を変更することになります。

現状の条件付き書式の設定を提示してもらえますか。

2
すー 2022/01/28 (金) 17:18:25 cd14b@b9210

hirotonさま 返信ありがとうございます。
サブフォームのモジュールに

Private Sub Form_Open(Cancel As Integer)
    Me.TimerInterval = 1000

End Sub

Private Sub Form_Timer()
    
    If Me!納期 < Date Then

            If Me!納期.ForeColor = RED Then
                Me!納期.ForeColor = DARKYELLOW
            Else
                Me!納期.ForeColor = RED
            End If
    End If

End Sub

と記述しましたが、サブフォームの1件目の納期を参照しているようで
全ての納期のコントロールが同じ動きをしてしまいます。
どのように記述すればよいのでしょうか?

1
hiroton 2022/01/28 (金) 16:55:10 17ac2@f966d

サブフォームもフォームです。適切にプロパティを設定すればその通り動作します


親フォームのタイマーイベントでサブフォームのコントロールを弄るということもできますが、今回の例ではそうすることもないでしょう

2
やまさん 2022/01/28 (金) 15:00:24 58219@c3b67

どのようにやるということですか?
有効期限をつけて同じ内容で一部を変更したレコードを追加するということでしょうか?
リレーションするときの主キーはIDにすることが多いですが同じIDは登録できませんよね?

16
どんぐりず 2022/01/28 (金) 13:01:46 440a7@6f3e7 >> 15

先日こちらのフォームからお送りしておりました。届いておりましたでしょうか。
ご回答はメールでいただけそうでしょうか。特に急ぎという訳ではありません、
届いたか不安だったため…ご連絡お待ちしておりますね!

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