プロが教えるわが家の防犯対策術!

みなさま、助けてください。
VBAのサンプルを教えて頂けると助かります。

【やりたいこと】
下記①のテーブルがあります。
フォームからボタンを押したら 組店コード別にテーブルを作成したいです。
なお、テーブル名は、下記②のテーブルを読込んで【作成テーブル名称】の名前を付与したいです。
ただし、組店コードDのように、下記②にはありますが、下記①にはないケースもあります。


【ボタン押下後にできるテーブルのイメージ】
  T_A  ←下記①の組店コードAのデータのみ格納されているテーブル
  T_B  ←下記①の組店コードBのデータのみ格納されているテーブル
  T_C  ←下記①の組店コードCのデータのみ格納されているテーブル


① テーブル名:T_明細

【組店コード】  【金額】
  A       100
  A       500
  B       200
  C       600
  C       150
  C       200


②テーブル名:パラメータテーブル
 
【組店コード】 【作成テーブル名称】
   A      T_A
   B      T_B
   C      T_C
   D      T_D

A 回答 (11件中1~10件)

参考に私が作ったフォームを紹介します。

こんな感じになります。メ
ニューの変更と言うボタンをクリックするとメニューの更新が出来ま
す。

ここに後日の更新されたメニューを作る事が出来ます。

確認をして下さい。これは、Accessのメニューから作る事が出来ます。
余力があったら挑戦して見て下さい。

宜敷くお願いします。
「種類別のテーブル作成方法について」の回答画像11
    • good
    • 0
この回答へのお礼

USUIさんへ

この度は、アクセス初心者のわたしにいろいろと、丁寧・親切にありがとうございました。

おかげさまで、やりたかったことが100%できました♪

これもUSUIさんのおかげです。

アクセスの勉強を続けていきますので、USUIさん、ご指導よろしくお願いします。

最後に、ほんとうに、ほんとうに USUIさん、ありがとうございました♡

お礼日時:2016/12/28 08:39

別解が見浸かりましたので、それで確認願います。



path = Application.CurrentProject.path
上記の設定でAccessのは言っているホルダーがpathに入ります。

file_nameを下記の様に変更して下さい。
file_name = path & "\" & rs![code] & ".csv"

これで、上手く行く筈です。


確認願います。
    • good
    • 0
この回答へのお礼

USUIさんへ

USUIさんに教えて頂いた上記方法で なんと

できました !(^^)!

朝から、すごくうれしいです。

ありがとうございます♡

お礼日時:2016/12/28 08:35

失礼しました。

若しかしたら、path="..."の所をそのまま一字一句その
通りに入力されたのでしょうか。それならば、動きません。この引用符
と引用符の間は、各個人の環境で違うので敢えて書いていません。

デスクトップのpathを確認を取るほう法はデスクトップに作ったホル
ダーをダブルクリックしてexplorerを立ち上げます。

その時に一番上の所にホルダー名が表示されています。そこをクリック
するとCドライブからのパス名が表示されます。それをコピーして下さ
い。それをpath=""の引用符と引用符の間にコピペして下さい。

最後に、\を付加して下さい。それで上手く行く筈です。
    • good
    • 0
この回答へのお礼

USUIさんへ

おはようございます♪
今日も一日、がんばりましょう!

USUIさんの言うとおり、path="..." としていました。

path="..." は、ACCESSファイルの保存されている先を自動的に取得してくれるものだと、勘違いしていました...(動かない訳ですね (^_^;))

お礼日時:2016/12/28 08:31

私もデスクトップにホルダーを作り、そこにAccessを移して実行しまし


たが正常にCSVのファイルは出来ています。私のデスクトップのpathは
下記の様になっています。

path = "C:\Users\usui\Desktop\test\"

今一度pathの確認をお願いします。
    • good
    • 0

頑張ったね。

大変良く出来ました。

今回のは、出力先は固定です。CSVファイルの出力先を、今回作成し
たACCESSファイルが保存されている同じ場所に出力する為には単
にpath="..."の指定を変更するだけです。

これをデータによって違う場所に出力をしたいと言う事に関しては一切
の考慮はしていません。それは、それでご苦労が耐えません。♡♡♡♡

もう取り敢えずは出来ているので、ここから先は余裕を噛ませて挑戦す
るのも良いのかも。頑張って見て見て。
    • good
    • 0
この回答へのお礼

USUIさん、お返事ありがとうございます♪


path="..."に変更しました。

デスクトップにフォルダを作成して、その中にACCESSファイルを移動して、実行しました。

正常に終了しました。

やった~♪

と思い、フォルダの中のみたら・・・CSVファイルはありません
でした(どこにいってしまったの、CSVファイル!)

USUIさん、助けてください~~

お礼日時:2016/12/27 18:08

標準モジュールにコピペしたら、下記の操作でCSV作成が出来る事を確


認してください。実行出来ないのは、上手くコピペ出来ていないです。

標準モジュールの関数の所にカーソルを移動してメニューバーより[実
行]をクリック。

サブメニューの[Sub/ユーザーフォームの実行]をクリックして関数を実
行する。CSVが出来ている事を確認願います。

ここ迄が出来ないと、次のステップには行けません。これが出来て初め
て次のマクロの処理に入ります。

モジュールの中で関数が実行出来れば、もう出来たも同じです。後は単
に操作性だけの問題です。最悪今の状態でも不便ですが、目標のCSV作
成は出来ます。

もう少しで完成です。一踏ん張り頑張って下さい。
    • good
    • 0

実装について説明します。

少しだけ複雑です。初めての人には敷居が高
いかも知れませんが。分からなかったらその都度質問して下さい。私は
暇です。もう現役を引退したしがない老人です。

① 標準モジュールに私のvbaのコードをOption 文の次の行からをコピ
ペして下さい。

② マクロを作ります。
作成方法は、「作成」の「マクロ」をクリックします。アクションに「プ
ロシージャの実行」を指定します。プロシージャ名に付いては、[...]
のボタンをクリックして「関数」をクリックして、組み込み関数の下の
ホルダーをクリックします。

2番目のペインにモジュール名が、3番目のペインに関数名が表示されま
す。関数名をクリックして貼り付けのボタンをクリックします。[OK]を
クリックします。

閉じると保存しますかと聞いて来るので「はい」をクリックしてマクロ
の名前を入力します。

これだけでも、私は最初の内は良いとは思いますが。慣れて来たらフォーム
で実行するのも良いとは思いますが。ここ迄来たら、後はマクロで今作った
マクロをクリックで指定してダブルクリックするだけでcsvが勝手に作られ
ます。当初は、この操作に漕ぎ着ける事が重要なのではと思います。業務優先
です。

フォームに付いては、最初はこのマクロで運用が出来てから次にやれば
と思います。

フォームでボタン操作で同様の事を処理をしようと思えば
これは、これでまた覚える事が増えます。もう少し慣れてからでも遅く
は無いのではないでしょうか。それよりも業務優先でCSVを最速で出す
事をここでは優先すべきだと思います。

フォームのボタンを押しての実行については、ここまでの操作が出来て
無いとここから先のフォーム処理には行けませんので。ここで止めま
す。

ここから先はこのマクロでの実行が出来てからの話とします。

頑張って下さい。
    • good
    • 0
この回答へのお礼

USUIさんへ

ありがとうございます。
できました♪
本当に助かりました。

もうひとつだけ、わたしのわがままに 付き合っていただけますか...

CSVファイルの出力先が固定になっています。
できれば、CSVファイルの出力先を、今回作成したACCESSファイルが保存されている同じ場所に出力されるようにしたいですが...

可能でしょうか?

お礼日時:2016/12/27 16:56

①の回答


標準モジュールに私が回答したvbaのコードを挿入します。コピペし
て下さい。尚、最初の行のOption Compare Databaseを除いた全ての
行を複写して下さい。

Option Compare Databaseと言うのは最初から入っていますから。こ
れは、便宜上説明の為に表示しました。

標準モジュールの開き方は、「作成」から「マクロ」の下矢印を押し
て標準モジュールをクリックして下さい。標準モジュールのウインド
ウが開きますのでそこに複写して下さい。

②の回答
path="..."の指定は任意です。

③の回答
追加クエリです。項目名を指定しています。

csvは普通にExcelで読めます。Excelで処理が出来ます。

宜しいでしょうか。
    • good
    • 0
この回答へのお礼

USUIさんへ

NO3の質問の件、原因分かりました。
ダブルクォーテイションの前に空白が必要なんですね♪

ご迷惑おかけしました。


strsql = "INSERT INTO 配付先 ( 組合コード )" & _
"SELECT T_01004_マスタ.組合コード" & _
"FROM T_01004_マスタ" & _
"GROUP BY T_01004_マスタ.組合コード" & _
"ORDER BY T_01004_マスタ.組合コード;"

お礼日時:2016/12/27 13:56

前回の掲載したvbaの中身を説明します。

テーブルは
① 入力
② 配布先
③ 配分

①は、下記のデータと仮定します。
id code money
1 A \100
2 A \150
3 A \300
4 B \250
5 B \100
6 C \50
7 C \150
8 C \400

②は、①を処理した結果の配布先のcodeが入ります。

③は、個別のCSVのエキスポートするデータが入ります。

vbaの処理フローは下記です。

1. ①の入力を読んで、②の配布先を作ります。下記のデータが作られ
ます。
code
A
B
C

2. ②の配布先のメイン入力ループで、codeの値でcsvのファイル名を決
めます。例えば、codeが"A"の値で有ればファイル名は"A.CSV"となりま
す。以下同様に他のcodeに対しても順次このファイル名となります。

この処理でcodeの値に応じたファイル名となります。

3. ②の配布先のメイン入力ループの二番目の処理は、エキスポートす
るデータを共通の配分のテーブルを利用する為に予めデータを初期化し
てデータを受け入れる準備をします。

4. 3番目の処理は現在読み込んだ配布先のテーブルのcodeの値で、入
力のデータをフィルター処理をしてその内容を配分と言うテーブルに追
加します。

5. 4番目の処理はDoCmd.Transfer.Textで、区切り符号付きのエキス
ポートを指定して、配分のテーブルを、file_nameと言う変数に格納さ
れているファイル名にエキスポートします。

上記をvbaの処理で行なっています。これは、確実に動きます。

サンプルのテーブルは違いは有りますが。考え方は同じです。実装に関
しては。最初に標準モジュールにvbaのコードを挿入して。次にマクロ
でプロシージャの実行で関数の名前を指定します。

後は、Switch Boardsのメニューでマクロの実行で、先程作られたマク
ロを指定すればメニューの出来上がりです。

後は、メニューの画面からボタンをクリックすればデータが何件でも勝
手にcsvのファイルが出来上がります。

理解出来たでしょうか。余りにも冗長しすぎてクドい説明になって分か
りにくかったも知れませんが。

よろしくお願いします。

vbaの理解については失敗してコツを掴む事が理解の早道です。頑張っ
てやって見て下さい。
    • good
    • 0
この回答へのお礼

USUIさんへ

教えて頂いた内容を、ただいま、実行しましたが...

行き詰ってしまいました。(-_-;)

下記のところで「実行エラー3075(下記の式)演算子がありません。」のメッセージが出力されてしまいます。

USUIさんのサンプルと比較したり、クエリで作成してSQL文に変更して貼りつけたりとしましたが、原因がどうしても分かりません。

サポートをお願いします。<m(__)m>


strsql = "INSERT INTO 配付先 ( 組合コード )" & _
"SELECT T_01004_マスタ.組合コード" & _
"FROM T_01004_マスタ" & _
"GROUP BY T_01004_マスタ.組合コード" & _
"ORDER BY T_01004_マスタ.組合コード;"

お礼日時:2016/12/27 13:49

質問の通りにテーブルを作るとなるとどれだけのテーブルが要るのかは


データに遭遇して初めて作成するテーブルの数が分かります。大変で
す。全く機能しないテーブルだらけになるのですから。

また、出来たテーブルをどうするのでしょうか。それは、考えられる事
はExcel以上の事は出来ません。それならば、最初からExcelで処理をす
るべきです。

実際に、この手のテーブルは出来ますが。大変なコストがかかります。
先ず、テーブルのコレクションを求めて該当する全てのテーブルを削除
します。この場合はデータでは有りません。テーブルその物を削除しま
す。

次に、create tableのテーブル定義でテーブルを作ります。次にでデー
タを追加します。これを繰り返しますが。テーブルだけを貰ってどうす
るのでしょうか。

そこから先が無ければ作る意味は有りません。過去に似た様な質問が有
りましたので下記を参照願います。
https://oshiete.goo.ne.jp/qa/9563506.html

この時の最終的なvbaのコードは途中で締め切られたので出せませんで
したが。下記がその時のvbaの回答です。参考にして下さい。これは、
私の主観ですがcsvを出力して最終的にはExcelを利用しての前提だと思
います。その時の相手の人とはもう連絡が取れませんので。

下記にvbaのコードを示します。これを参考にして下さい。但しこの方
法はテーブルは一切作っていませんので。全く同じ問題ではありません
が。参考にはなると思います。

この方法に近いやり方でのテーブルを作る方法はこれ以上に複雑になり
ます。避けた方が懸命です。また、これでないといけないと言う事で有
れば、それはAccessの趣旨からは逸脱しています。それは、Accessでは
無くてExcelの分野です。

長くなりました。コードを示します。
Option Compare Database

Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strsql

Function csv作成()
Dim path
Dim file_name

path = "C:\Users\usui\Documents\Access\教えてGo\161222-1004\"
Set db = CurrentDb

'配布先のテーブルを作る
strsql = "delete * from 配布先;"
db.Execute (strsql)

strsql = "INSERT INTO 配布先 ( code ) " & _
"SELECT 入力.code " & _
"FROM 入力 " & _
"GROUP BY 入力.code " & _
"ORDER BY 入力.code;"
db.Execute (strsql)

Set rs = db.OpenRecordset("配布先")
rs.MoveFirst

While Not rs.EOF
file_name = path & rs![code] & ".csv"

'エキスポートするデータをテーブルに作る
strsql = "delete * from 配分;"
db.Execute (strsql)

strsql = "INSERT INTO 配分 ( id, code, [money] ) " & _
"SELECT 入力.id, 入力.code, 入力.money " & _
"FROM 入力 " & _
"WHERE (((入力.code)='" & rs![code] & "'));"
Debug.Print strsql
db.Execute (strsql)

'CSVをエキスポートする
Debug.Print file_name
DoCmd.TransferText acExportDelim, , "配分", file_name

rs.MoveNext
Wend

End Function

確認願います。
    • good
    • 0
この回答へのお礼

USUIさん、こんにちは♪

いつも、ありがとうございます。

すみません、勉強不足のため、以下のコードの意味があまり分かりません。
教えて頂けませんでしょうか?

①Function csv作成()
 Dim path
 Dim file_name

※.Function csv作成()は、別にCSVを作成するコードが必要ということでしょうか?もし、サンプルがあったら、教えてください。

②path = "C:\Users\usui\Documents\Access\教えてGo\161222-1004\
※.自身のACCESSファイルが置かれている場所でよろしいでしょうか?


③strsql = "INSERT INTO 配分 ( id, code, [money] ) " & _
"SELECT 入力.id, 入力.code, 入力.money " & _
"FROM 入力 " & _
"WHERE (((入力.code)='" & rs![code] & "'));"

INSERT なので、追加クエリ?だと思いますが、配分 ( id, code, [money] ) は入力テーブルの項目名でしょうか?


>この方法に近いやり方でのテーブルを作る方法はこれ以上に複雑になり
>ます。避けた方が懸命です。また、これでないといけないと言う事で有
>れば、それはAccessの趣旨からは逸脱しています。それは、Accessでは
>無くてExcelの分野です。

 今回、会社からの指示で作成しています。
 会社は年配の人だけで、アクセスやエクセルはできません(若い人は私一人です(-_-;))
わたしは、エクセルが苦手です(アクセスはおもしろくて勉強中です♪)。
エクセルのVBAの記述方法が全くわかりませんので、どうしてもアクセスを利用してしまいます(これではいけませんね)。

すみません、USUIさんに愚痴を言ってしまって・

それと、前回、USUIさんから質問がありましたが、文字数オーバーで入力できなかったため、ご返事いたします。

>その意味ではこのデータは貰う方から見れば万能では有りません。もう
>少し詳しい状況を教えて下さい。

CSVファイルで最大150種類の営業所に配付します。先方には、このCSVファイルを取り込んで展開するシステムがあるみたいです。

お礼日時:2016/12/27 10:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!