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
'exは最初に開いた空っぽのエクセルで、ブック自体存在しないので、エラーになる
Else
MsgBox "保存するブック名をSaveBookNameプロパティで設定してください"
End If
Set ex = Nothing
End Sub
If SaveBookName <> "" Then
ex.ActiveWorkbook.SaveAs SaveBookName
Debug.Print SaveBookName
MsgBox SaveBookName
Else
MsgBox "保存するブック名をSaveBookNameプロパティで設定してください"
End If
[ファイル]-[オプション]-[現在のデータベース]で、[ドキュメント ウィンドウ オプション]が、
「ウィンドウを重ねて表示する」になっていたら「タブ付きドキュメント」にすれば、すべてのウィンドウがアプリケーションウィンドウいっぱいに広がります。
ご教示ありがとうございました!
その通りですよ。ただ、データベースでやるならデータベースの作法があるだけです。質問のタイトルは「特殊な売上管理をするときの構成について」ですが、内容を聞く限りデータベース的には至ってシンプルな内容です
ただし、「月ごと」の集計が必要なんですよね?となると、「日報の記録はどの月に属する配送なのか?」という問題が発生します。「日報の日付を基準」でいいのか、「取引先の受注データを基準」にする必要があるのか、2つのテーブルの間で間違いのないルール付けが必要です
現実的に計算できているのだから目に見える設定が無いだけで何かしら(仕事上のルールであるとか、取引先との契約内容であるとか)で紐づいているんですよ。
「関係性をうまく説明できること」
「データベース(ACCESS)でその関係性を設定できること」
理論と実装ですね。順を追って考えていきましょう
データベースとはなにか?という話なら、難しいモノかもしれませんね
結構テンプレネタだと思うんだけど有名どころのサイトでも解説ないよね
連結されたコンボ ボックスに値を追加する
コンボボックスのリスト外入力処理(システムコマコさん)
コンボボックスから値集合ソース編集画面を表示する方法(T'sWareさん)
ご回答ありがとうございます。
>これはどうやって?
元になるテーブルをインポートしたあと、そのテーブルを選択しつつ作成リボンのフォームボタンを押し、
その後フォームレイアウトのデザイン、のリボンでボタン作成し、
コマンドボタンウィザードで新しいレコードの追加を割り当てたらできました。
この場合、ボタンを一回押すとレコード追加はできるのですが、
ボタンを一回押すだけでレコード追加だけでなくSub hoge~End Subも一気に実行されるようにしたいです。
(機能追加したい)
どこにSub hoge~End Subを記述すればよろしいでしょうか?
→(自己解決したのでメモ代わりに)
レコード追加で作ったボタンにSub hoge~End Subだけでなく、レコード追加のコードも入れたらできました。
また質問させていただくこともあるかもしれませんが、よろしくお願いいたします。
現在は2つのテーブルは紐付いていません
集計してexcelにコピペしてexcelで計算しています
たんに、テーブルにデータをいれているだけでほぼexcelのシートに保存しているのとかわらない状態です
取引先ごとの利潤が分かればいいので
それぞれのテーブルの取引先ごとの集計でたし引きすればいいのかな?とか思ってましたがそんな単純なものでもないみたいてすね
取引先だけでは一意に特定できないですよね。
取引先と日付で特定できるのですか。
現在はどのような手順で2つのテーブルを紐づけて、計算しているのでしょうか。
まずは、2つのテーブルのデータ例を提示して具体的に、そこからどのように計算しているか、
説明してもらえませんか。
売上テーブル
配送テーブルに
共通しているフィールドは”取引先”があります
(売上テーブルではどこに請求するか把握するため、配送テーブルでは給与明細にどのどこからの配送をどれだけ配送したかを把握するためです)
これと日付でリレーションすると、11月のA社の売上はいくら、そのうち従業員への歩合はいくら、と計算できるでしょうか?
帳票フォームにすればいいでしょう。
同じ値が連続する場合が多いフィールドはVBAで規定値プロパティを設定すればいいでしょう。
同じ値のデータを連続して入力したいなら、連続入力のVBAをショートカットキーなどに割り当てるなど工夫します。
テーブル構成や詳細な仕様が不明なので、とりあえずのアドバイスはこんなところです。
売上テーブルと配送テーブルを紐づけするフィールドはありますか。
あるなら、クエリでそのフィールド同士で結合すればいいだけです。
ないなら、各テーブルにどのようなフィールドがあって、現状はどのように対応させているかの説明してください。
に近いようなものはできています。上記のようなものは紙の伝票をベースにしたものだと思うのですが
複数の日付が連続して存在するデータの入力には適していないような気がします
今日のデータを入力しているときでも、その上には昨日のデータが表示されているようなレイアウトのほうが適している気がするのですが、どのようにしたらよいかまではわからなくて質問しました
データベースがやりたいのであれば、とりあえず、Excelに新しいシートを作り、日付、取引先、商品名を手入力して下さい。この時、組み合わせが同じものは1つだけとします。
画像のシートにデータを登録する際は、まず、新しいシートに画面を切り替えます。登録したい日付・取引先・商品名の組み合わせがあるか探して下さい。なければ登録した後、画像のシートに戻ります。日付・取引先・商品名、その他のフィールドを手入力したら、新しいシートに切り替えて次の組み合わせを探します。以後、繰り返します。
ちらつく、視覚的にわかりにくい、Excelインポートのほうが早い、これらを土台にデータベースは成り立ちません。今までのExcelの何倍も手間暇かけたら、やっとデータベースが始まると思います。
Accessではどこまで出来ていて、どこからが分からないのでしょうか。
それとも、Accessの方はまったく手を付けていない状態ですか。
とりあえずは、Accessで構築するなら下記のような手順になります。
どこまで出来ていますか。
オブジェクト指向の流行はピークを過ぎたんじゃないでしょうか?得意分野と伸び代の目処がついたという意味で。少なくとも、データベースの設計にはイマイチみたいですよ。
詳しくないですが、無いという事で特に問題ないと思います。流行り廃れの過渡期にあるだけでしょう。あとから振り返ると、正しくなかった、発展性しなかった、なんてね。古くなったからリセットして海外モノに飛び付こう。お察しな感じですね。
『オブジェクト指向やSQL99はもう古いしナンセンス、新クラシック回帰の時代に乗り遅れるな』
hatena様
詳しい回答ありがとうございました。
まずはテーブル設計をどうするか、から考えましょう。
一例ですが、
※とりあえず質問で出ているデータのみでテーブル化した場合の例です。
実用的には科目マスターとかいろいろ必要になります。
上記テーブルから入力フォームを作成する場合、
帳票フォームを作成して入力する、科目はコンボボックスで選択できるようにする。
とか、
メイン/サブフォーム形式にして、メインフォームで科目を選択して、サブフォームのにその科目の詳細を入力する。
などになりますが、運用実態で適切なものを選択します。
レポートで
修理費 10000円
部品 5000円
技術料 5000円
保守点検 8000円
分解費 5000円
技術料 3000円
というような出力するなら、レポートのグループ化の機能を使えば簡単です。
hirotonさんの紹介しているできるネットさんのリンク先などが参考になるでしょう。
hatena様
クラスモジュールを勉強しようと、思ったのは、オブジェクト指向という言葉に出会ってからです。
今思えば、ACCESSが、まったく理解できていないとき、yahooの知恵袋で、本当に丁寧に回答してくれたのが、hatena様でした。
hatena様は、どのようにスキルを習得したのか?
きっと、hatena様なら、色々な技で、スマートな短いコードで、やりたいと事を実現できるんだろうなと、
今も、そう考えながら、コードを書いています。
クラスモジュールを理解できたら、きっと、また、違った世界が見えるかもしれないと思い、勉強しようと思いました。
クラスモジュールは、今の私には、難しく、yahooの知恵袋で、クラスモジュール、hatenaで検索したら、HITしたので、その回答を、何度も読んで、ブログも読んで、紹介していただいたリンク先のブログも読んでいました。
また、わかないところがあれば、図々しく、質問させていただきます。
また、この掲示板で、回答してただいた、hatena様、りんご様をはじめ、全ての方に、感謝申し上げます。
ありがとうございました。
ToExcelでなぜエラーが出るかを解説(コメント)しておきますと。
対処法としては、CreateObjectで新規エクセルを開くのではなく、
GetObjectで開いているエクセルを取得して操作することになると思います。
前にも言いましたが、DoCmd.TransferSpreadsheetメソッドで1行でできることをわさわざクラスモジュールですることはないし、上記のような間違いもあるし、古い記事なので、クラスモジュールの学習サンプルとしては適切ではないです。
りんご様
ありがとうございます。
参考にさせていただきます。
そのリンク先、確かに私の回答ですね。
「ざっと検索してみました」といっているように中身までは検証していません。
その時は紹介しましたが、今、サンプルファイルをダウンロードしてみましたが、2010以降のバージョンではサポートされていないデータアクセスページを使用していて、動作を確認できないものなので今から学習するサンプルとしては適切でないです。記事内のコードだけでは完結しないのでサンプルで確認する必要もありますので。
なぜ、クラスモジュールの勉強しようと思い立ったのか分かりませんが、Accessはデータベースとしての強力な機能を持っていますので、クラスモジュールを使う場面はほとんどありません。
かなり、大きなシステムを構築するなら活用できる場面があるかも知れませんが、このような質問で出てくるようスキルレベルでは必要な場面に出会うとこもないし、使いこなせないと思います。
私自身も、テーブル数、フォーム数、レポート数がそれぞれ2桁以上の大がかりてシステムを作成しましたが、クラスモジュールは使ってません。
なかなか聞かない言い回しですね。データ構造としてはイメージしているモノかもしれませんが、データ登録でその部分にサブフォームが使われることはないと思います。「テーブルの設計」という視点を持ちましょう
Accessのレポートでグループごとに金額の合計を印刷する方法(できるネットさん)
レスありがとうございます。
booleanにNullが無いことから、お察しな感じはありますね。
本格的なDBMSのエンジニアから軽く見られるのは悔しいですが、
ともあれありがとうございました。
>> 3
>> 7>> 9>> 10
ごめんなさい、私の勘違いと力不足がありました。
もしかしたら、こちらが参考になるかもしれません。
Application.Workbooks.Add.SaveAs “ほにゃらら”みたいな感じになるのかしら?
"C:\Users\Desktop\20211201\Desktop\QryData.xlsx"です。
指定したデータを、出力できないというような、エラーがでました。
ACCESS2003でしたし、Excelの保存形式も違っていたので。
SaveBookNameを使ってあれこれやりたいと書いているのに、肝心の中身が表示されないってどういう事でしょう?
>> 8
QryData.xlsxって、急に何処から出してきたの?
りんご様
QryData.xlsxが、おかしいと思いました。
りんご様
回答ありがとうございます。
イミディエイトウィンドウには、何も表示されませんでした。
リンク
この記事です。
多分、丁寧な回答を読んでいるとhatena様かと思います。
紹介されたURLのExcelは、リンク切れでした。
hatena様のブログは全部読みました。
時間のある時は、分からなくても読んでいます。
ACCESSに関しての、クラスモジュールは、DAOや、ADOのものが少しNETにあるだけでした。
このyahoo知恵袋で、hatena様が、紹介されているなら、間違いない教材と思って勉強してました。
ご提示していただいた、コードは知っています。
単純にクラスモジュールで記載したらどうなるのかと思い、ご無礼を承知で、質問しました。
T伝票
売上日 取引先名(複合主キー) 請求日 支払日
T売上
売上ID 売上日 取引先名(複合主キー) 商品名 個数 単価ID
>> 10
>> 11
T伝票
伝票ID(主キー) 日付 …
1 12/13
2 12/14
Excelから取り込んだテーブル(仮)を作ります。
日付 商品名 個数 単価ID …
12/13 …
12/14 …
新しいクエリを作って、日付で紐付ければ、
Q売上(仮)
伝票ID(主キー) 日付 商品名 個数 単価ID …
1 12/13 …
2 12/14 …
これを追加クエリに変更、T売上に追加。
「中身の個人情報を含むデータ」と言うのが何を指しているのか不明瞭ですが、
テーブルデータということなら、テーブルを空にすればいいと思います。
あと、
[ファイル]-[情報]-[データベースのプロパティの表示および編集]の
[ファイルの概要]に作成者とか管理者とか会社名の項目がありますので、
そこを削除しておくか仮名にしておくといいでしょう。
yes/no型なら実体は-1/0(/Null)でホンモノの真理値ではないですね
DataType プロパティ
エクセルのデータはどうなっているのですか。
エクセルのデータには伝票IDはないのですか。
ない場合、伝票と売上はどのように紐づける仕様になっているのですか。
売上日 取引先名 の組み合わせで一伝票という仕様なら、売上日 取引先名 の組み合わせで、複数フィールド主キーを設定すればいいですね。
その辺りの情報を提示してもらわないと、、、、
インポートとの兼ね合いでどうしたものかと悩んでおります
おっしゃるとおり
インポートするときにそれがないから悩んでます
EXCELにあるならそれぞれのテーブルにインポートすればいいんですけど
提示のコード、試してみましたが、いろいろおかしいですね。
参考にした下記の記事、
Access 2003 VBAではじめるクラス入門 (1/4):CodeZine(コードジン)
Access 2003とあるようにかなり古い記事のようです。
私自身、この記事を紹介した記憶がないのですが、どの掲示板で紹介しましたか。
そのURLを提示してもらえますか。
とりあえず、ACCESSのクエリを、Excelに保存するだけなら、クラスモジュールを使う必然性はないです。
DoCmd.TransferSpreadsheetメソッドで簡単にできますので。
クラスモジュールの勉強なら、他にもっと適切なものがありそうです。
>> 3
いいね、と言いたいところですが、なんだかなぁ。単独主キーの是非、発注名の定義域が気になります。
もしかして、伝票IDがExcelの元データに無いから、T売上に直接インポート出来ないって悩んでます?
とりあえず、これくらい試しましたか?