Microsoft Access 掲示板

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

ありがとうございます。
情報が不足しており申し訳ありません。
D1~ 日付に見立てたフィールドで~31まで用意し、別のフィールドで月、年を用意をしています。
ユーザとしては 入力フォームで
製品ごとに ある年月の 1日~31日 フィールドへ入力する形にしています。
入力したデータは 別のテーブルで日付に変換して 日付順に所要展開できるように考えています。
クロス集計クエリを逆にしている形です。

ご指摘があったように A,Bが同じ部品であることをバージョン情報として持たせるようにしたいと思います。

やはり、クエリでの計算は難しく
バージョン管理品 の場合は 変更順に Aが0となった場合は、Bから引くといった
VBAでの処理が必要と理解しました。

8
nokonoko 2021/05/19 (水) 16:01:49 653a6@54883
Private sub コンボボックスB_GotFocus()
 Me.Requery
End Sub
7
hatena 2021/05/19 (水) 15:23:43 修正

私の場合はこの方法でうまくいってます。

コンボボックスの「フォーカス取得時」のイベントプロシージャを提示してください。


コードはマークダウンのコードブロックにいれてください。

Like "*" & [Forms]![フォーム1]![テキストボックスA] & "*"

マークダウンの使い方の詳細は下記を参照ください。

Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa

6
nokonoko 2021/05/19 (水) 15:13:04 653a6@54883

コンボボックスのイベントなら、「フォーカス取得時」のイベントがいいでしょう。

変更したところ、最初はリストが変更されましたが、
テキストボックスAの書き込みを消去して改めてコンボボックスを更新しようとしたところ、
イベントは起きましたが、リストの更新はできませんでした。
(一度コンボボックスのリストを表示させると、リストが更新されなくなった)

絞り込みは
Like "" & [Forms]![フォーム1]![テキストボックスA] & ""
としているだけです。

3

テーブル設計がまずいですね。

画像「計画のテーブル」のD1,D2,D3~というフィールドは日付をあらわしているのですよね。このような日々追加されているようなデータをフィールドにしてはいけません。データベース設計のセオリーから外れます。
「日付」というフィールドに日付を追加してく形にすべきです。

※BはAの次バージョン品のため、在庫がなくなった後に使用する。

AとBは同じ部品でバージョン違いであるという情報をテーブルに持たせる必要があります。

情報が不足しているで全体像が分かりませんが、とりあえず、下記のような感じのテーブル設計になると思います。

製品マスター
※製品CD
 製品名

部品マスター
※部品CD
 部品名

部品バージョンマスター
※部品CD
※バージョンCD
 バージョン名

製品構成マスター
※製品CD
※部品CD
 必要数

生産計画
※日付
※製品CD
 生産数

部品在庫履歴
※日付
※部品CD
※部品バージョン
 使用数
 在庫数

部品在庫履歴 をクエリだけで計算するのは難しいので、
VBAでDAOを使ってレコードセットとして開いて、
レコード移動しながら累計値を入力していくことになると思います。

29
hiroton 2021/05/19 (水) 11:20:16 db65e@f966d

『用法・容量がすごく長くてその薬品一つだけで1ページを超えるようなデータ』はない為、ダメな例を勉強してみます。

今のコードも突っ込みどころはいろいろあるんですが、いったん完成ということにしてしまいますか。ダメな場合があるということだけは覚えておいてください。

見栄えがよくありません。

元々見栄え自体はあまり気にしなくてもいい方法のようですから。見栄えを気にするならhatenaさん指摘のように、索引専用のレポートを作ることも検討してみましょう
ちなみに「薬品名(文字数は制限なし)」とすると発生する問題があります。どんな問題が出るのか確かめて、どうしたいか考えてみてください


索引にページ数が入るのは仕方がないことですか?

ページフッターのページ数表示ですよね?索引のページ(レポートフッター)だったら非表示にすればいいと思ったんですが意外とめんどうでした

Private Sub レポートヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me!ページ数表示.Visible = True
End Sub

Private Sub レポートフッター_Format(Cancel As Integer, FormatCount As Integer)
    If FormatCount = 1 Then Me!ページ数表示.Visible = False

(後略)

※ページ数表示は実際のコントロール名に合わせてください

2

起動時実行マクロ(AutoExecマクロ)でリボン非表示のVBAを実行してもいいでしょう。

標準モジュールに下記のプロシージャを作成します。

Public Function HideRibbon()
    DoCmd.ShowToolbar "Ribbon", acToolbarNo
End Function

マクロを新規作成する。
リボンの「すべてのアクションを表示」を選択。
「新しいアクションの追加」で「プロシージャの実行」を選択。
「プロシージャ名」に「HideRibbon()」と設定。
マクロを保存する。名前は「AutoExec」とする。

トップページフォームのDoCmd.ShowToolbar "Ribbon", acToolbarNoは削除しておく。

以上です。

28
norinori 2021/05/19 (水) 10:24:52

hiroton さん、確認しましたが、やはり索引に印字されているページが本文のページと一致していました。完璧です。
『用法・容量がすごく長くてその薬品一つだけで1ページを超えるようなデータ』はない為、ダメな例を勉強してみます。
グループヘッダーのセクション繰り返しの設定 → 画像を添付しました。画像1

索引の印刷プレビュー画面も添付しました。3段組、30行、文字数も制限しいている為、見栄えがよくありません。現在の薬品集が薬品名(文字数は制限なし)・・・ページ数となっている為、そのようにしてみようと思っています。自分で変えてみようと思いますが、無理だったらまた質問をさせて頂きます。
索引にページ数が入るのは仕方がないことですか?
画像2

27

条件を付けている通りで特別なデータ(用法・容量がすごく長くてその薬品一つだけで1ページを超えるようなデータ)があるとうまくページを取得できません

そんなデータあるわけない!なら多分うまくページが取れてると思います。適当に用法・容量が1ページを超えるようなデータを作って試してみてください。ダメな例がわかると思います

「データ」は今は良くても、今後、誰がどのように登録するかわからないなので

データに依存する仕組みじゃ使いにくいですね。対策します

という方針を示しています。今後についても「そんなデータあるわけない!」なら今のコードで完成でもいいかなぁとは思います


追加の対策を考える場合、ちょっとテストしていたらグループヘッダーのセクション繰り返しの設定で動作を変えないといけないようでした。このプロパティの設定も教えてください。

1
ゲッキョク駐車場 2021/05/19 (水) 08:51:56 cb55f@f6500

私はこちらのサイトのmindwoodさんのやりかたを採用しております。
https://qiita.com/mindwood/items/062cde46b848d0c9e96a
「コンテンツの有効化」をクリックしてもらうために の欄です。

26
norinori 2021/05/19 (水) 08:22:04

hiroton さん、索引に印字されているページが本文のページと一致しているかもです。ページに跨ぎになっている薬剤を全て確認し、また報告をさせて頂きます。

7
りんご 2021/05/18 (火) 19:13:15 48103@0e907

 例えば、最初の行2020,AAA,10000を選ぶと、集計前のクエリが絞り込まれて、2020,AAAのレコード一覧が表示されるという方針はいかがでしょうか?
 この方針でやってみるならば、スレを閉じて、集計前のクエリを絞り込むフォーム作りから始めましょう。

25

•詳細セクションの同一ページ印刷プロパティは「はい/いいえ」どちらですか?→ はい
•詳細セクションに印刷時拡張の設定はありますか? → はい
       となっています。

6
エアー 2021/05/18 (火) 16:51:56 58219@6dd7b

基本的には取引先ごとの年間集計が必要になると思うので、前もってクエリを作成しておき
年間集計ボタンを押すとそれを表示させるのがよさそうですね
集計なので基本的に編集することもなさそうですし

集計なので個々のレコードが表示されないと思うのですが、なぜその集計金額になったのかを確認するために、

年数 取引先 金額  
2020 AAA  10000  詳細
2020 BBB   20000  詳細
2021  AAA  2000   詳細

と集計を出したときに、各集計の横に詳細ボタンを配置して押すと
フォームを開いて、集計元のレコード一覧を表示させることなどはできますか?

5

ところで、コンボボックスのクリックイベントは、使えないイベントなのでしょうか?

リストを変更するという目的にはつかえませんね。hirotonさんも回答している通り、リストから値を選択したときに発生しますので。

コンボボックスのイベントなら、「フォーカス取得時」のイベントがいいでしょう。

テキストボックスAの更新後処理でもいいですが、例えば、レコード移動してテキストボックスの値が変わった場合には対応できません。

4
りんご 2021/05/18 (火) 15:34:28 48103@0e907

うーん、me.コンボボックスB.requeryでどうですか?

3
hiroton 2021/05/18 (火) 15:29:08 f7e14@f966d

コンボボックスの場合、リストから値を選ぶためのクリックをしたときに発生するようです。(値がないとクリックしてもイベントは発生しません)

2
nokonoko 2021/05/18 (火) 15:09:27 653a6@54883

ありがとうございました。その方法がよさそうです。
ところで、コンボボックスのクリックイベントは、使えないイベントなのでしょうか?

1
ゲッキョク駐車場 2021/05/18 (火) 15:06:18 cb55f@f6500

テキストボックスAの更新後処理に再クエリを設定すると良いかもしれません。

24

今後継続して使用していく目的としてはとても便利で、思っていた以上のレポートです。
現にhirotonの回答は次々と問題が出てきて穴だらけですし
→ 私が条件を全て表示していなかったからです。感謝しかないです。

8
nokonoko 2021/05/18 (火) 14:44:28 653a6@54883

ご回答ありがとうございました。
アクセス以上にネットワーク関連の知識が足りず、事業所に迷惑をかけている状態なのですが、アクセス側はどうしようもないようですね。
ありがとうございました。

23
hiroton 2021/05/18 (火) 14:32:23 f7e14@f966d

エラーが出なくなったようなので続きですが、

  • 詳細セクションの同一ページ印刷プロパティは「はい/いいえ」どちらですか?
  • 詳細セクションに印刷時拡張の設定はありますか?

今後の方針について

単独で1ページを超えるような出力に対応する

データに依存する仕組みじゃ使いにくいですね。対策します

同一ページ印刷プロパティ「いいえ」に対応する

一応、対策案はあります。今の想定ではそれなりにコードが複雑になるので同一ページ印刷が「はい」なら対策コードは入れなくていいかなと思っています

詳細セクションの印刷時拡張の設定

今回の手法(『目次(索引)ページを自動作成』)では詳細_formatからページ数を取得するのことがかなり難しいことがわかりました。で、本当に今更な確認ですが、詳細セクションで印刷時拡張の設定が無ければ出力ページ数自体が元データから作れるのでは?と、ふと思ってしまいました。(謎の先入観で印刷時拡張「はい」があるものと思っていたようです)
今の手法も形になりそうなのでhirotonが別手法を挙げることはないですが、一応ここで確認事項としてあげておきます

22

実践あるのみですね。目的を立てて「できた!」までこぎつけてほんのちょっとレベルアップしたかもって思う感じです。
読み物としていろいろ見ておくと「自分のやろうとしてることくらいすでに誰かやっているんじゃないか?」とか「これめんどくさいな。もっと簡単な方法があるんじゃないか?」とかそういう考え方はできるようになるかもしれませんが、これが実力が付いたと言えるかというと微妙なところです。現にhirotonの回答は次々と問題が出てきて穴だらけですし


ページ跨ぎになっている薬剤のページはやはりずれています

限定条件はあるもののその条件下なら今の回答でうまくいくと思っているんですが、うまくいかない部分があるということですか?それともこの条件だと目的のレポートにならないということですか?

21

hirotonさん、有難うございます。上記の様に設定したところ、漢字、カナ、数字の区別なく五十音順に並び替えることが出来ました。ただ、ページ跨ぎになっている薬剤のページはやはりずれていますが、私としては大満足です。大変な知識不足でお手数をお掛けして申し訳ありませんでした。こういったコードを沢山見ることが向上に繋がるでしょうか?

2

お世話になっております。やろうとしていることがAccess向きではないかもしれませんが・・。すみません。画像1
画像2

添付画像(簡素化)のような テーブル構成・ 実施しようとしていることになります。

4
どんぐりず 2021/05/18 (火) 12:55:19 0029a@1c915 >> 2

参考URLをご教示いただき助かりました。時間を見つけて確認したいと思います。

3
どんぐりず 2021/05/18 (火) 12:54:55 0029a@1c915 >> 1

なるほど、そういう方法もありますね。ありがとうございます。検討してみます。

7

エラー情報を翻訳すると

(フルパス)は有効なパスではありません。パス名のスペルが正しいこと、およびファイルが存在するサーバーに接続していることを確認してください。

ということなので、パスが間違っているか、共有フォルダーの権限の問題で接続できてないか、、、が原因なんでしょう。
Accessの問題ではなさそうです。

6
りんご 2021/05/18 (火) 11:57:13 48103@0e907

Oh…, 本格的に迷子なんですね。
Aceessの問題なのか、リンクステーションの問題なのか、私には力及ばずでした。

2

とりあえずAccessのVBAなら、検索すればFileSystemObjectを使用したサンプルコードがいろいろ見つかりますが、たいてい今でも動作すると思います。

例えば、下記とか。

Excel VBA を学ぶなら moug モーグ | 即効テクニック | データベース自動バックアップ関数 (FSO)

Accessのバックアップを取る - オフィスタナベ

1

現状のテーブル構成はどうなってますか。
各テーブルのテーブル名、フィールド名、主キー設定を提示してください。

5
nokonoko 2021/05/18 (火) 10:44:21 653a6@54883

ご回答、およびご検証いただきありがとうございました。コードの内容はおいおい勉強します。

確認ですが、バックエンドにAccessファイルが3つ置いてあって、あるテーブルはデータベース1から、あるテーブルはデータベース2から、という状況では無いですよね?

はい。データの分割で、一つのファイルからバックエンドを分割をしたもので、データ(複数テーブル)が一つのバックエンドファイルにすべて入っています。

> 伝言ゲームの罠に嵌まっていませんか?みんなで使っているうちに、あるテーブルのデータがおかしくなって、別のエラーが発生している話だったりしませんか?

現地情報は詳細にはわかりません。(外国です)
ただし、"(フルパス)is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides."というエラーなので、本当に迷子なんだと思います。

1
hiroton 2021/05/18 (火) 09:00:39 bdd1b@f966d

要件次第でしょう。ACCESSだけで実現しようとすると、ACCESSはバックアップ用のアプリケーションではないので、どのような動作をすればいいのかをすべて自分で考えて組み立てる必要があります

バックアップを目的としたアプリケーションを別途用意するのではダメなんでしょうか?

20

レポート上にテキストボックスを配置し、名前を「薬品名のフリガナ」、コントロールソースも「薬品名のフリガナ」とします。

印刷するデータではないので可視プロパティは「いいえ」にします。


五十音で並び替えたいということなので五十音のデータが必要です。薬品名から自動で五十音を作るのは現実的ではないので並び替え用に五十音のデータを用意します。>> 10の画像から使えそうなフィールド「薬品名のフリガナ」を用いていますが、見る限り五十音だけでないようなので必要であれば専用のフィールドを追加で用意してください

印刷しないデータなのでレコードセットから直接取れればいいんですが、レポートだとレコードセットを直接参照することができないのでレポート上にデータを読み込んであげる必要があります。そのため、テキストボックスを配置しコントロールを参照します

コントロールの名前プロパティとコントロールソースプロパティ(フィールド名)が同じ場合は意識する必要はないですが、別々にしている場合は注意してください

4
りんご 2021/05/18 (火) 01:22:55 48103@0e907

 確認ですが、バックエンドにAccessファイルが3つ置いてあって、あるテーブルはデータベース1から、あるテーブルはデータベース2から、という状況では無いですよね?
 上記コードを試して、再リンクで解決できるのかなぁと思いました。
 時々、バックエンドが迷子になるという事でしたが、伝言ゲームの罠に嵌まっていませんか?みんなで使っているうちに、あるテーブルのデータがおかしくなって、別のエラーが発生している話だったりしませんか?

3
りんご 2021/05/18 (火) 00:30:57 48103@0e907

Microsoft Access で Access データベースを手動で分割する方法
 上記記事を参考に、適当なAccessファイルを用意して、バックエンドデータベース「データベース1」、フロントエンドデータベース「データベース2」に分割しました。続けて、もう1つ余分にバックエンドデータベース「データベース3」を用意し、切り替える事ができるか試してみました。(場所は、デスクトップ。パスワードは、設定なし。)

Private Sub コマンド0_Click()
    Dim dbs As DAO.Database
    Dim tdf As DAO.TableDef
    
    Set dbs = CurrentDb
    
    For Each tdf In dbs.TableDefs
      If tdf.Connect <> “” Then
         tdf.Connect = “MS Access; PWD=; DATABASE=C:¥Users¥…¥Desktop¥データベース3.accdb”
         tdf.RefreshLink
      End if
    Next tdf

    dbs.Close
    Set dbs = Nothing

 このFor〜Nextでデータベース1とデータベース3の切り替えはできました。

最後のコードは、データベースを閉じてメモリを解放すると、なっているようです。

19

先週金曜日から何とかご指摘を克服しようと努力はしましたが、今の知識では難しくお知恵を頂こうと思っていました。
13の完コピに、1のSub ArrayListSort以下を合体させたところ”薬品名のフリガナフィールドが見つかりません”とのメッセージに変わりました(前進ですか?)。レポートに「薬品名のフリガナ」がないのは気になっていたのですが、この点は如何でしょうか? 

画像1
Sub ArrayListSort(ary As Variant)
    Dim aryList As Object
    Dim s

    '// .NET FrameworkのArrayListクラスを利用する
    Set aryList = CreateObject("System.Collections.ArrayList")

    For Each s In ary
        Call aryList.Add(s)
    Next
    Call aryList.Sort
    ary = aryList.ToArray
End Sub

5
hatena 2021/05/17 (月) 19:00:07 修正

適材適所で選択できるようになるといいでしょう。

フォームやレポートでグループ単位の集計を表示する場合は、複数の集計が必要になるのでDSumは重くなるので避けた方かいいでしょうか。
ただし、フォームでデータ編集もしたいときだと、集計クエリだと更新できないので、DSumで集計を表示する場合もあります。

フォームやレポート上にあるデータの全体の合計を1つのみ表示する場合はテキストボックスのコントロールソースにDSum関数を使って表示させてもいいでしょうか。

16
もんぞう 2021/05/17 (月) 18:57:13 62ea7@f778d

りんごさんへ

計算式の持ち時間が問題になりそうです。
出荷数の部分の式でIIfを使う発想はなかったので参考になります。
時間の計算の参考になりそうなサイトまで紹介していただきありがとうございます。
いろいろとありがとうございました。

引き続きアドバイス出来る方お願いします。
一か月ぐらいは定期的に覗きに来たいと思います。

4
エアー 2021/05/17 (月) 17:58:09 58219@6dd7b

詳しい解説ありがとうございます
やはりDsumを使わなくてすむなら使わないほうがいいんですね。マスタとかレコードが少ないテーブルで
なんらかの集計をするときにパッと使える関数といった使い方のほうがいいのかもしれませんね

テーブル→クエリ→フォーム→レポート
といった処理にする場合、
テーブルのレコードに対する集計条件(年度や取引先、商品などをテキストボックスに入力して指定する)を都度変えるのなら
テーブル→フォーム→クエリ→フォーム→レポート
ということになりますか?