Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,921 から 2,960 までを表示しています。
2
hideki 2021/12/11 (土) 23:53:10 7cbc1@96514

hatena様 

エラーの場所の記載をしなくて申し訳ありません。

.ToExcel⇒ここで、デバックが発生します。

,,,jp

 If SaveBookName <> "" Then
        ex.ActiveWorkbook.SaveAs SaveBookName
    Else
        MsgBox "保存するブック名をSaveBookNameプロパティで設定してください"
    End If

,,,

F8で実行していくと、ここの部分でエラーが発生します。

8

そのフィールド構成なら、リレーションシップで、下記のように結合して、

T伝票.伝票ID 1→∞ T売上.伝票ID

フォームウィザードで、2つのテーブルから必要なフィールドを選択して進めていけば、自動でメイン/サブフォームが作成されます。

ウィザードを使わない場合は、メインフォームのレコードソースは T伝票、サブフォームのレコードソースは T売上、
リンク親フィールド、リンク子フィールドは 伝票ID に設定しておけばいいはずです。

7
ろうにん 2021/12/11 (土) 18:16:26 58219@8ffb0

T伝票
伝票ID(主キー) 売上日 取引先名 請求日 支払日

T売上
売上ID(主キー) 伝票ID 商品名 個数 単価ID

です。日付でリレーションしていたといっていましたが、うまくいかなし、間違った運用みたいなので
T売上からは削除しました

1

このコードを実行すると、

どのコードですか。
Excel_Close() のことですか。
これは、クラスモジュール内に記述しているのですか。

だとしたら、ex変数はモジュールレベルで宣言する必要があります。

Option Compare Database

'プロパティ設定
Public QryName As String        '開くクエリ名の設定
Public SaveBookName As String  '保存するブック名の設定

'オブジェクト変数
Dim QryBook As Excel.Workbook
Dim ex As Excel.Application 'ここで宣言

Public Sub ToExcel()
'    Dim ex As Excel.Application これは削除
    
    Set ex = CreateObject("excel.Application")
    ex.Visible = True
        
    DoCmd.OpenQuery QryName, , acReadOnly
    DoCmd.RunCommand acCmdOutputToExcel
    DoCmd.RunCommand acCmdClose
    
    If SaveBookName <> "" Then
        ex.ActiveWorkbook.SaveAs SaveBookName
    Else
        MsgBox "保存するブック名をSaveBookNameプロパティで設定してください"
    End If
    
'    Set ex = Nothing これも削除
End Sub

Public Sub Excel_Close()
    If ex Is Nothing Then Exit Sub 'これを追加 

    'excelを終了する
    ex.Quit
    
    Set QryBook = Nothing
    Set ex = Nothing
End Sub
6

1日に伝票1枚だけならそれでいいですが、そうではないですよね。

現状の T伝票 と T売上 のフィールド構成を提示してもらえると、何かアドバイスできると思います。

5
ろうにん 2021/12/10 (金) 17:50:49 58219@06dbe

ユニークキーでやりたかったのですが、ACCESSだけで入力するわけではなく
別途EXCELで入力されたデータもインポートする必要があります
そのときに
T伝票に重複のない日付のみをインポートしてユニークキーが作成されるようにして
T売上に、それ以外のデータをインポートするとき、T伝票のユニークキーをT売上にもってくる(紐付ける)方法がわからず
1対多の状態でインポートできませんでした
それで日付でリレーションしようとしていました

12
MM 2021/12/10 (金) 15:42:15 faf36@28a7a

訂正
killExpiredTaskByPid.ps1
プロセスIDを指定して、指定秒数待機後に強制終了させます。
Access終了時に外部プロセスから自分自身を遅延強制終了させるのに使います。
https://carbon.now.sh/5JBoWByWsQFrDSuawvAs

11
MM 2021/12/10 (金) 15:38:51 faf36@28a7a

同様の問題が特定PCのみで発生しています。
Powershellにて対応しています。

killNoWindowMsaccess.ps1
プロセスが存在し、かつウィンドウが存在しない MSACCESS.EXE を強制終了します。
プロセス残留のせいでAccessが起動しない際に、問題のあるプロセスを手動で強制終了させるために使います。
https://carbon.now.sh/jVlhZh9jXK6uKvAjYoLI

killExpiredTaskByPid.ps1
プロセスIDを指定して、指定秒数待機後に強制終了させます。
Access終了時に外部プロセスから自分自身を遅延強制終了させるのに使います。
https://carbon.now.sh/jVlhZh9jXK6uKvAjYoLI

6
かずや 2021/12/10 (金) 13:06:28 d73a2@d4478

この考え方、思いつきませんでした。
>レコードの最初から見てグループが変わったら最小と同様にレコードの最終から見てグループが変わったら最大です

目から鱗でした。こちらで実装いたしました。

SQLでここまでできるのかと感嘆しております。
こちらもじっくり勉強させていただきます。

りんご様のご指摘もっともです。
すみません、そちらは記載ミスです。

よろしくお願いいたします。

7
takatada72 2021/12/10 (金) 12:17:51

お世話になります。
ハテナさん、ヒロトンさん 
返信をありがとうございました。
確認して見て、分からない場合には、質問をさせて頂きますので宜しくお願い致します。
ACCESSが会社のPCしか入っていないため、勉強時間が欲しいです。
引き続き宜しくお願い致します。

1
hiroton 2021/12/10 (金) 10:09:34 21302@f966d

フォーム作成で新規レコード追加のボタンを作成するところはできた

これはどうやって?

VBAでコピーしたりフォルダ作成するsub~end subはかけました

ならこれを呼び出せばいいですね。

「日付」「議題」のフィールドに入力された値を用いて

ならば、プロシージャに引数を設定して渡してあげればいいです

マクロでプロシージャを実行させる方法(Accessの使い方さん)
参照渡しと値渡し(Office TANAKAさん)
別のフォームのコントロールプロパティを取得する方法(T'sWareさん)

5
かずや 2021/12/10 (金) 09:47:27 d73a2@d4478

みなさま

いろいろご意見ありがとうございます。
お返事が遅くなり申し訳ありません。

まずは確認させていただきます。
よろしくお願いいたします。

6
hiroton 2021/12/10 (金) 09:41:40 21302@f966d

回答したとおり「Outlook VBA」で検索すればいろいろ情報がでてきます。さらに言えば「Outlook VBA "やりたいこと"」で検索すればかなり近いコードも見つかるとは思いますよ

ただ、「ずばり」とするには問題が複雑すぎるため見つけられないと思います。問題を切り分けて探してみて下さい
例えばGoogle検索で以下のような結果が得られます

「VBA outlook msg」
Outlookメッセージファイル(.msg)からデータを取り出す – VBA(SugiBlogさん)

「VBA outlook 送信画面」
エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする(いつも隣にITのお仕事さん)


おまけ
OFT と MSG (および下書き) の違い(OUTLOOK 研究所さん)

5

Excel VBAからOutlookを操作するサンプルです。Access VBAでも、データ保存する箇所をセルからテーブルのフィールドに変更すればほぼ、そのまま使えます。差し込み部分も私の最初の回答のようにReplaceでも置換を利用しています。

Outlookで差し込み印刷のようにメール本文を作成するExcelVBA(メール作成③) | VBA・GAS・Pythonで仕事を楽しく効率化

【VBAでOutlook操作】Excelシートのデータから下書きメールを一括作成する|もりさんのプログラミング手帳

4

双方のテーブルにインポートして、簡単に照合できるのが日付だから、です
リレーションの画面では 1-∞ となっていませんが、それも原因のひとつでしょうか?

これも、1-∞ となるように設計しなおすべきですね。
でないと、データベースとして無意味なデータになります。

1つの売り上げは一つの伝票のみと紐づけられないだめですよね。
複数の伝票に、同じ売り上げが記載されていたら、二重計上になってしまいます。

一側(伝票)のリンクフィールドはユニーク(主キー)でないとダメです。
主キーは、複数のフィールドを組み合わせて設定することもできます。
あるいは、オートナンバー型のフィールドを主キーにするとか。

具体的にどうしたら分からないのなら、現状の伝票テーブル、売上テーブルのフィールド構成を提示してください。

4

( SQL ビュー)

SELECT [Q1].[autoNo_Min] AS [autoNo],
       [所属歴テーブル].[人],
       [所属歴テーブル].[役職],
       [所属歴テーブル].[部門],
       Min([所属歴テーブル].[在籍開始日]) AS [在籍開始日],
       Max([所属歴テーブル].[在籍終了日]) AS [在籍終了日]
FROM [所属歴テーブル],
     (SELECT [所属歴テーブル].[autoNo] AS [autoNo_Min],
             Nz((SELECT Min(tmp2.[autoNo]) - 1
                 FROM [所属歴テーブル] tmp2
                 WHERE tmp2.[autoNo] > [所属歴テーブル].[autoNo]
                   AND (   tmp2.[人] <> [所属歴テーブル].[人]
                        OR tmp2.[役職] <> [所属歴テーブル].[役職]
                        OR tmp2.[部門] <> [所属歴テーブル].[部門])),
                [所属歴テーブル].[autoNo]) AS [autoNo_Max]
      FROM [所属歴テーブル]
      WHERE NOT EXISTS (SELECT tmp.[autoNo]
                        FROM [所属歴テーブル] tmp
                        WHERE tmp.[autoNo] = [所属歴テーブル].[autoNo] - 1
                          AND tmp.[人] = [所属歴テーブル].[人]
                          AND tmp.[役職] = [所属歴テーブル].[役職]
                          AND tmp.[部門] = [所属歴テーブル].[部門])) [Q1]
WHERE [所属歴テーブル].[autoNo] Between [Q1].[autoNo_Min] And [Q1].[autoNo_Max]
GROUP BY [Q1].[autoNo_Min],
         [所属歴テーブル].[人],
         [所属歴テーブル].[役職],
         [所属歴テーブル].[部門]

ORDER BY [Q1].[autoNo_Min];

以上のクエリのような結果を得たい、ということでしょうか。

4
takatada72 2021/12/09 (木) 18:24:12

hirotonさん
お疲れさまです。
ありがとうございました。
VBAのコマンドについて、わかっていればいいのですが、私のようにコピペの利用者
だとマイクロソフトは、敷居が高いです。ずばりってサイトがあれば良いのですが、
念の為、マイクロソフトのサイトで検索してみたいと思います。
引き続き宜しくお願い致します。

3
hiroton 2021/12/09 (木) 16:39:32 ea2fd@f966d

.msgだとOutlookのデータですかね
「Outlook VBA」で検索すればいろいろ情報がでてくるのでうまく組み合わせればできると思いますよ

Outlook VBA リファレンス

3
りんご 2021/12/09 (木) 15:04:10 c564b@0e907 >> 2

 Accessデータベースに連番の概念は合わないと思います。連番を作らずに、日付並び替えや日付範囲抽出で理想を実現出来ないでしょうか?
 

3
hiroton 2021/12/09 (木) 14:01:47 ea2fd@f966d

T伝票とT売上データを日付でリレーション(クエリ1)
T商品マスタと売上データを商品IDでリレーション(クエリ2)

どちらのクエリにもT売上データが使われているからだと思われます
クエリ1を使わずにそのままT伝票を指定したらどうでしょう

2
りんご 2021/12/09 (木) 13:40:10 c564b@0e907

5 bbb 568 いいい 4/1  5/31
6 bbb 568 いいい 6/1  3/31

 何故レコードが追加されているのでしょうか?役職変更や部門移動イベントが発生していないのに。
 とりあえず、終了日を99/3/31にしておくのはどうでしょう。
5 bbb 568 いいい 4/1  99/3/31
 役職変更や部門移動イベントが起きた時に、終了日の更新(確定)と新規レコードの追加をやればいいんじゃない?

1
hiroton 2021/12/09 (木) 13:34:20 ea2fd@f966d

グループで連番を振ったらあとは選択クエリでグループ化して開始の日付は最小、終了の日付は最大を取ったらいいんじゃないでしょうか


フラグを付けること自体が目的なら、最小とは前の値がないこと、最大とは次の値がないことなので2重のチェックが必要なのは仕方がないですね

グループ内連番に加えて最小値転記とフラグを付した後、

最大も同じ考え方でできますよ。レコードの最初から見てグループが変わったら最小と同様にレコードの最終から見てグループが変わったら最大です
ループ処理でrs.eofになっていると思うのでそのまま逆にrs.MovePreviousしながらrs.bofまでチェックすればいいです

2
takatada72 2021/12/09 (木) 13:00:37

お世話になります。
早速の返信をありがとうございました。

言葉足らずで申し訳ありません。
テンプレートは、保管しているメールに書き込みはできないでしょうか
例:テストメール.msg のファイルを作って、ハテナさんが言われている
部分にデータを差し込むような感じにしたいのです。

お忙しいとは思いますが宜しくお願い致します。

2
りんご 2021/12/09 (木) 01:28:00 c564b@0e907

日付でリレーションしているのは、データをEXCELからインポートするので、
双方のテーブルにインポートして、簡単に照合できるのが日付だから、です

 A社としか取引しないから、日付だけ見れば誰に売り上げたか照合出来る、という事でしょうか?

リレーションの画面では 1-∞ となっていませんが。

例えば、
テーブル1.名前:あ,い,う,え,お
テーブル2.名前:あ,か

クエリの画面:テーブル1.名前 一 テーブル2.名前

これは、リレーションシップではありません。結合しただけ。
リンク切れのデータが表示されない仕組みと思っています。

テーブル1,名前テーブル2,名前

結合線を右クリック、設定変更で遊べるので、これはこれで面白いです。
テーブル1,名前 ← テーブル2.名前とかテーブル1,名前 → テーブル2.名前とか。

1
りんご 2021/12/09 (木) 00:21:18 c564b@0e907

T伝票:顧客No, 日付, …
T売上:顧客No, 日付, 商品No, …
T商品:商品No, …
T顧客:顧客No, …
T伝票(クエリ1)・・・・・・・・・・『Q伝票』:T伝票.顧客No, T伝票.日付, T顧客.顧客名, …
T伝票、T売上、T商品(クエリ2)・・・『Q売上』:T売上.顧客No, T売上.日付, T売上.商品No, T商品.商品名, …,

リレーションシップ:

T顧客T伝票T売上T商品
顧客No1一∞顧客No1一∞顧客No
顧客名日付1一∞日付
商品No∞一1商品No

F伝票(レコードソース『Q伝票』)
顧客No:1
日付     :12/1
サブフォーム(F売上:レコードソース『Q売上』)

(顧客No)(日付)(商品No)商品名
(1)(12/1)(1)あああ
(1)(12/1)(2)いいい
1

テンプレート(定型文)を使って、メール本文を作成する部分が分からないところでしょうか。

下記のようなテーブルに定型文を保存しておきます。

テーブル名
 T_定型文
フィールド
 定型文ID 主キー
 定型文  長いテキスト

定型文の例
下記のような感じで、変更したい部分を【】で囲んで埋め込んでおく。

◯◯◯◯◯◯◯◯◯◯◯◯
◯◯◯◯◯◯【製品名】◯◯◯◯ 【製品番号】◯◯◯◯
◯◯◯◯【担当者アドレス】◯◯◯◯
◯◯◯◯◯◯◯◯

ボタンクリックで、下記のように置換すればメイル本文で完成します。

Dim MailHonbun As String
MailHonbun = DLookup("定型文","T_定型文","定型文ID=1")
MailHonbun = Replace(MailHonbun,"【製品番号】",Me.製品番号)
MailHonbun = Replace(MailHonbun,"【製品名】",Me.製品名)
MailHonbun = Replace(MailHonbun,"【担当者アドレス】",Me.担当者アドレス)
2
りんご 2021/12/02 (木) 15:23:17 c564b@0e907

登録のしようがありません

 イメージなので使えるかわかりませんが。

ほにゃららテーブル

ほにゃらら売上名
下請ABC売上A
下請ABC売上B
下請ABC売上C
下請案件〇〇売上D
下請No〇〇売上E

ほにゃららテーブル

ほにゃらら金額
下請ABC750
下請案件〇〇1500
下請No〇〇1000

 ほにゃららテーブル

ほにゃらら下請先金額
下請ABC工場A250
下請ABC工場B250
下請ABC工場C250
下請案件〇〇工場A1500
下請No〇〇工場C1000
6
takatada72 2021/12/02 (木) 14:42:15

ご心配をおかけしましたが、Officeの再インストールにより、無事、ACCESSが復帰できました。

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

5
takatada72 2021/12/02 (木) 11:17:27

ご返信をありがとうございました。
全てのVBAを使っているACCESSファイルになります。
Officeを再インストールして、NGだったら、教えて頂いたマイクロソフトのコミュニティへ
投稿したいと思います。

1
hatena 2021/12/01 (水) 22:38:46 修正

そのような要件のシステムを作成したことがないので、アイデアだけですが、
下記のようなテーブルでどうでしょうか。


売上テーブル
 売上ID 主キー
 取引先CD
 売上名
 金額


下払テーブル
 売上ID
 下払先CD
 下払金額


データ例
売上テーブル

売上ID取引先CD売上名金額
11A1000
21B2000
32C3000
43D4000

下払テーブル

売上ID 下払先CD 下払金額
1 1 800 1つの下請け
2 1 800 複数の下請けに分散
2 2 900
3 3 1000 1つの下請けに複数の売上
4 3 1100
2
りんご 2021/12/01 (水) 22:32:31 c564b@0e907

 状況がイマイチ伝わらないんですが、もしかして、サブフォームを作りましたが、新規データをサブフォームに追加出来ませんって事でしょうか?
 メインフォーム
メインフォームID:1
リンク親フィールド:1
 サブフォーム

サブフォームIDリンク子フィールド
11
21
(新規)1

サブフォームIDリンク子フィールド
11
21
31
(新規)1
1

抽象的過ぎて回答不能。

それぞれのフォームのレコードソースのフィールド構成、主キー設定、
サブフォームのリンク親フィールド、リンク子フィールドの設定などを、
詳細に説明してください。

「子2のフィールドを追加できません」というのは、デザインビューでフィールドが追加できないという意味ですか。

7
のり 2021/12/01 (水) 16:46:45 d46dd@5536d

いつもお世話になります
レポートのレコードソースを取得する方法を教えていただきましたが
DoCmd.OutputTo acReport, Me.Tag, acFormatXLS, では 
現在出力しようとしているオブジェクトの型式は無効ですのエラーがでます
acReportを acOutputReportにしても acFormatXLS を acOutputXlsにしてもだめでした
acOutputReportではダメで acOutputTableでは出力されます
なぜでしょうか?
ちなみに ACCESS2007です 
2007 Office スイート Service Pack でアップデートしなくてはだめなのでしょうか?

4

不具合が起きているのは特定のデータベースファイルですか。それとも、すべてのデータベースファイルですか。
新規に作成したデータベースファイルではどうでしょうか。

新規のデータベースファイルなら不具合が発生しないなら、新規ファイルに、問題のデータベースファイルからすべてのオブジェクトをインポートしてみたらどうなりますか。

すべてのファイルで発生するなら、Officeのアンインストール、再インストールを試すぐらいでしょうか。

症状は違いますが、下記でも不具合の相談がされています。ただ、まだ解決には至ってないようです。

Windows10UPdate後の不具合 - Microsoft コミュニティ

3
takatada72 2021/12/01 (水) 15:27:48

ごめんなさい
ここの掲示板の使い方がわからなく、プロフィールのつもりで書いてしまいました。

現状で困っているのは、最近のWindows10の更新で、ACCESSのVBEを開くと、画面が
真っ暗になったり、復元したりして使えない状態になるため、解決策を探しております。

お忙しいとは思いますが宜しくお願い致します。

2

具体的にどのような機能の追加を考えていますか。

VBAについての基本の学習はすんでますか。

1
りんご 2021/12/01 (水) 14:52:12 c564b@0e907

Access=データベース作業向きソフト≠効率化ソフトじゃないでしょうか?

1

商品マスタにおける「価格」と「取引先の社名や支店名」は少し性格が異なりますね。
取引先は、取引先マスタというテーブルがあるはずなので(なければ作成すべき)、このマスターの設計をどうするかという話になります。

とりあえず、商品マスターにおける頻繁に変更のある「価格」をどのような設計にするかについて回答します。
方法としては主に2つ考えられます。

「商品マスター」と「商品価格履歴」に分割する

設計例

商品マスタ
 商品コード 主キー
 商品名

商品価格履歴
 商品コード 主キー
 商品サブコード 主キー
 変更日

売上テーブル
 売上ID 主キー
 売上日
 商品コード
 商品サブコード ※入力時の最新のサブコードを自動入力

トランザクションテーブル(売上テーブル)に価格を格納する

商品マスタ
 商品コード 主キー
 商品名
 価格

売上テーブル
 売上ID 主キー
 売上日
 商品コード
 価格 ※入力時の最新の価格を自動入力

 あくまで1例です。

1

サブデータシートがご希望のイメージに近いものかも。

フォーム上にデータシートとサブデータシートを表示する - もう一度学ぶMS-Access

別のフォームを開くのなら、
DoCmd.OpenForm の引数でキーフィールドの抽出条件を設定すればいいでしょう。