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
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],
[所属歴テーブル].[人],
[所属歴テーブル].[役職],
[所属歴テーブル].[部門]
hatena様
エラーの場所の記載をしなくて申し訳ありません。
.ToExcel⇒ここで、デバックが発生します。
,,,jp
If SaveBookName <> "" Then
ex.ActiveWorkbook.SaveAs SaveBookName
Else
MsgBox "保存するブック名をSaveBookNameプロパティで設定してください"
End If
,,,
F8で実行していくと、ここの部分でエラーが発生します。
そのフィールド構成なら、リレーションシップで、下記のように結合して、
T伝票.伝票ID 1→∞ T売上.伝票ID
フォームウィザードで、2つのテーブルから必要なフィールドを選択して進めていけば、自動でメイン/サブフォームが作成されます。
ウィザードを使わない場合は、メインフォームのレコードソースは T伝票、サブフォームのレコードソースは T売上、
リンク親フィールド、リンク子フィールドは 伝票ID に設定しておけばいいはずです。
T伝票
伝票ID(主キー) 売上日 取引先名 請求日 支払日
T売上
売上ID(主キー) 伝票ID 商品名 個数 単価ID
です。日付でリレーションしていたといっていましたが、うまくいかなし、間違った運用みたいなので
T売上からは削除しました
どのコードですか。
Excel_Close() のことですか。
これは、クラスモジュール内に記述しているのですか。
だとしたら、ex変数はモジュールレベルで宣言する必要があります。
1日に伝票1枚だけならそれでいいですが、そうではないですよね。
現状の T伝票 と T売上 のフィールド構成を提示してもらえると、何かアドバイスできると思います。
ユニークキーでやりたかったのですが、ACCESSだけで入力するわけではなく
別途EXCELで入力されたデータもインポートする必要があります
そのときに
T伝票に重複のない日付のみをインポートしてユニークキーが作成されるようにして
T売上に、それ以外のデータをインポートするとき、T伝票のユニークキーをT売上にもってくる(紐付ける)方法がわからず
1対多の状態でインポートできませんでした
それで日付でリレーションしようとしていました
訂正
killExpiredTaskByPid.ps1
プロセスIDを指定して、指定秒数待機後に強制終了させます。
Access終了時に外部プロセスから自分自身を遅延強制終了させるのに使います。
https://carbon.now.sh/5JBoWByWsQFrDSuawvAs
同様の問題が特定PCのみで発生しています。
Powershellにて対応しています。
killNoWindowMsaccess.ps1
プロセスが存在し、かつウィンドウが存在しない MSACCESS.EXE を強制終了します。
プロセス残留のせいでAccessが起動しない際に、問題のあるプロセスを手動で強制終了させるために使います。
https://carbon.now.sh/jVlhZh9jXK6uKvAjYoLI
killExpiredTaskByPid.ps1
プロセスIDを指定して、指定秒数待機後に強制終了させます。
Access終了時に外部プロセスから自分自身を遅延強制終了させるのに使います。
https://carbon.now.sh/jVlhZh9jXK6uKvAjYoLI
この考え方、思いつきませんでした。
>レコードの最初から見てグループが変わったら最小と同様にレコードの最終から見てグループが変わったら最大です
目から鱗でした。こちらで実装いたしました。
SQLでここまでできるのかと感嘆しております。
こちらもじっくり勉強させていただきます。
りんご様のご指摘もっともです。
すみません、そちらは記載ミスです。
よろしくお願いいたします。
お世話になります。
ハテナさん、ヒロトンさん
返信をありがとうございました。
確認して見て、分からない場合には、質問をさせて頂きますので宜しくお願い致します。
ACCESSが会社のPCしか入っていないため、勉強時間が欲しいです。
引き続き宜しくお願い致します。
これはどうやって?
ならこれを呼び出せばいいですね。
ならば、プロシージャに引数を設定して渡してあげればいいです
マクロでプロシージャを実行させる方法(Accessの使い方さん)
参照渡しと値渡し(Office TANAKAさん)
別のフォームのコントロールプロパティを取得する方法(T'sWareさん)
みなさま
いろいろご意見ありがとうございます。
お返事が遅くなり申し訳ありません。
まずは確認させていただきます。
よろしくお願いいたします。
回答したとおり「Outlook VBA」で検索すればいろいろ情報がでてきます。さらに言えば「Outlook VBA "やりたいこと"」で検索すればかなり近いコードも見つかるとは思いますよ
ただ、「ずばり」とするには問題が複雑すぎるため見つけられないと思います。問題を切り分けて探してみて下さい
例えばGoogle検索で以下のような結果が得られます
「VBA outlook msg」
Outlookメッセージファイル(.msg)からデータを取り出す – VBA(SugiBlogさん)
「VBA outlook 送信画面」
エクセルVBAでOutlookメールの下書きを作成・表示して送信前に内容チェックする(いつも隣にITのお仕事さん)
おまけ
OFT と MSG (および下書き) の違い(OUTLOOK 研究所さん)
Excel VBAからOutlookを操作するサンプルです。Access VBAでも、データ保存する箇所をセルからテーブルのフィールドに変更すればほぼ、そのまま使えます。差し込み部分も私の最初の回答のようにReplaceでも置換を利用しています。
Outlookで差し込み印刷のようにメール本文を作成するExcelVBA(メール作成③) | VBA・GAS・Pythonで仕事を楽しく効率化
【VBAでOutlook操作】Excelシートのデータから下書きメールを一括作成する|もりさんのプログラミング手帳
これも、1-∞ となるように設計しなおすべきですね。
でないと、データベースとして無意味なデータになります。
1つの売り上げは一つの伝票のみと紐づけられないだめですよね。
複数の伝票に、同じ売り上げが記載されていたら、二重計上になってしまいます。
一側(伝票)のリンクフィールドはユニーク(主キー)でないとダメです。
主キーは、複数のフィールドを組み合わせて設定することもできます。
あるいは、オートナンバー型のフィールドを主キーにするとか。
具体的にどうしたら分からないのなら、現状の伝票テーブル、売上テーブルのフィールド構成を提示してください。
( 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];
以上のクエリのような結果を得たい、ということでしょうか。
hirotonさん
お疲れさまです。
ありがとうございました。
VBAのコマンドについて、わかっていればいいのですが、私のようにコピペの利用者
だとマイクロソフトは、敷居が高いです。ずばりってサイトがあれば良いのですが、
念の為、マイクロソフトのサイトで検索してみたいと思います。
引き続き宜しくお願い致します。
.msg
だとOutlookのデータですかね「Outlook VBA」で検索すればいろいろ情報がでてくるのでうまく組み合わせればできると思いますよ
Outlook VBA リファレンス
Accessデータベースに連番の概念は合わないと思います。連番を作らずに、日付並び替えや日付範囲抽出で理想を実現出来ないでしょうか?
どちらのクエリにも
T売上データ
が使われているからだと思われますクエリ1を使わずにそのまま
T伝票
を指定したらどうでしょう何故レコードが追加されているのでしょうか?役職変更や部門移動イベントが発生していないのに。
とりあえず、終了日を99/3/31にしておくのはどうでしょう。
5 bbb 568 いいい 4/1 99/3/31
役職変更や部門移動イベントが起きた時に、終了日の更新(確定)と新規レコードの追加をやればいいんじゃない?
グループで連番を振ったらあとは選択クエリでグループ化して開始の日付は最小、終了の日付は最大を取ったらいいんじゃないでしょうか
フラグを付けること自体が目的なら、最小とは前の値がないこと、最大とは次の値がないことなので2重のチェックが必要なのは仕方がないですね
最大も同じ考え方でできますよ。レコードの最初から見てグループが変わったら最小と同様にレコードの最終から見てグループが変わったら最大です
ループ処理で
rs.eof
になっていると思うのでそのまま逆にrs.MovePrevious
しながらrs.bof
までチェックすればいいですお世話になります。
早速の返信をありがとうございました。
言葉足らずで申し訳ありません。
テンプレートは、保管しているメールに書き込みはできないでしょうか
例:テストメール.msg のファイルを作って、ハテナさんが言われている
部分にデータを差し込むような感じにしたいのです。
お忙しいとは思いますが宜しくお願い致します。
A社としか取引しないから、日付だけ見れば誰に売り上げたか照合出来る、という事でしょうか?
例えば、
テーブル1.名前:あ,い,う,え,お
テーブル2.名前:あ,か
クエリの画面:テーブル1.名前 一 テーブル2.名前
これは、リレーションシップではありません。結合しただけ。
リンク切れのデータが表示されない仕組みと思っています。
いうえおか結合線を右クリック、設定変更で遊べるので、これはこれで面白いです。
テーブル1,名前 ← テーブル2.名前とかテーブル1,名前 → テーブル2.名前とか。
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商品.商品名, …,
リレーションシップ:
F伝票(レコードソース『Q伝票』)
顧客No:1
日付 :12/1
サブフォーム(F売上:レコードソース『Q売上』)
テンプレート(定型文)を使って、メール本文を作成する部分が分からないところでしょうか。
下記のようなテーブルに定型文を保存しておきます。
テーブル名
T_定型文
フィールド
定型文ID 主キー
定型文 長いテキスト
定型文の例
下記のような感じで、変更したい部分を【】で囲んで埋め込んでおく。
ボタンクリックで、下記のように置換すればメイル本文で完成します。
イメージなので使えるかわかりませんが。
ほにゃららテーブル
ほにゃららテーブル
ほにゃららテーブル
ご心配をおかけしましたが、Officeの再インストールにより、無事、ACCESSが復帰できました。
ありがとうございました。
ご返信をありがとうございました。
全てのVBAを使っているACCESSファイルになります。
Officeを再インストールして、NGだったら、教えて頂いたマイクロソフトのコミュニティへ
投稿したいと思います。
そのような要件のシステムを作成したことがないので、アイデアだけですが、
下記のようなテーブルでどうでしょうか。
売上テーブル
売上ID 主キー
取引先CD
売上名
金額
下払テーブル
売上ID
下払先CD
下払金額
データ例
売上テーブル
下払テーブル
状況がイマイチ伝わらないんですが、もしかして、サブフォームを作りましたが、新規データをサブフォームに追加出来ませんって事でしょうか?
メインフォーム
メインフォームID:1
リンク親フィールド:1
サブフォーム
⬇
抽象的過ぎて回答不能。
それぞれのフォームのレコードソースのフィールド構成、主キー設定、
サブフォームのリンク親フィールド、リンク子フィールドの設定などを、
詳細に説明してください。
「子2のフィールドを追加できません」というのは、デザインビューでフィールドが追加できないという意味ですか。
いつもお世話になります
レポートのレコードソースを取得する方法を教えていただきましたが
DoCmd.OutputTo acReport, Me.Tag, acFormatXLS, では
現在出力しようとしているオブジェクトの型式は無効ですのエラーがでます
acReportを acOutputReportにしても acFormatXLS を acOutputXlsにしてもだめでした
acOutputReportではダメで acOutputTableでは出力されます
なぜでしょうか?
ちなみに ACCESS2007です
2007 Office スイート Service Pack でアップデートしなくてはだめなのでしょうか?
不具合が起きているのは特定のデータベースファイルですか。それとも、すべてのデータベースファイルですか。
新規に作成したデータベースファイルではどうでしょうか。
新規のデータベースファイルなら不具合が発生しないなら、新規ファイルに、問題のデータベースファイルからすべてのオブジェクトをインポートしてみたらどうなりますか。
すべてのファイルで発生するなら、Officeのアンインストール、再インストールを試すぐらいでしょうか。
症状は違いますが、下記でも不具合の相談がされています。ただ、まだ解決には至ってないようです。
Windows10UPdate後の不具合 - Microsoft コミュニティ
ごめんなさい
ここの掲示板の使い方がわからなく、プロフィールのつもりで書いてしまいました。
現状で困っているのは、最近のWindows10の更新で、ACCESSのVBEを開くと、画面が
真っ暗になったり、復元したりして使えない状態になるため、解決策を探しております。
お忙しいとは思いますが宜しくお願い致します。
具体的にどのような機能の追加を考えていますか。
VBAについての基本の学習はすんでますか。
Access=データベース作業向きソフト≠効率化ソフトじゃないでしょうか?
商品マスタにおける「価格」と「取引先の社名や支店名」は少し性格が異なりますね。
取引先は、取引先マスタというテーブルがあるはずなので(なければ作成すべき)、このマスターの設計をどうするかという話になります。
とりあえず、商品マスターにおける頻繁に変更のある「価格」をどのような設計にするかについて回答します。
方法としては主に2つ考えられます。
「商品マスター」と「商品価格履歴」に分割する
設計例
商品マスタ
商品コード 主キー
商品名
商品価格履歴
商品コード 主キー
商品サブコード 主キー
変更日
売上テーブル
売上ID 主キー
売上日
商品コード
商品サブコード ※入力時の最新のサブコードを自動入力
トランザクションテーブル(売上テーブル)に価格を格納する
商品マスタ
商品コード 主キー
商品名
価格
売上テーブル
売上ID 主キー
売上日
商品コード
価格 ※入力時の最新の価格を自動入力
あくまで1例です。
サブデータシートがご希望のイメージに近いものかも。
フォーム上にデータシートとサブデータシートを表示する - もう一度学ぶMS-Access
別のフォームを開くのなら、
DoCmd.OpenForm の引数でキーフィールドの抽出条件を設定すればいいでしょう。