みなさま、助けてください。
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
No.11ベストアンサー
- 回答日時:
参考に私が作ったフォームを紹介します。
こんな感じになります。メニューの変更と言うボタンをクリックするとメニューの更新が出来ま
す。
ここに後日の更新されたメニューを作る事が出来ます。
確認をして下さい。これは、Accessのメニューから作る事が出来ます。
余力があったら挑戦して見て下さい。
宜敷くお願いします。
USUIさんへ
この度は、アクセス初心者のわたしにいろいろと、丁寧・親切にありがとうございました。
おかげさまで、やりたかったことが100%できました♪
これもUSUIさんのおかげです。
アクセスの勉強を続けていきますので、USUIさん、ご指導よろしくお願いします。
最後に、ほんとうに、ほんとうに USUIさん、ありがとうございました♡
No.10
- 回答日時:
別解が見浸かりましたので、それで確認願います。
path = Application.CurrentProject.path
上記の設定でAccessのは言っているホルダーがpathに入ります。
file_nameを下記の様に変更して下さい。
file_name = path & "\" & rs![code] & ".csv"
これで、上手く行く筈です。
確認願います。
USUIさんへ
USUIさんに教えて頂いた上記方法で なんと
できました !(^^)!
朝から、すごくうれしいです。
ありがとうございます♡
No.9
- 回答日時:
失礼しました。
若しかしたら、path="..."の所をそのまま一字一句その通りに入力されたのでしょうか。それならば、動きません。この引用符
と引用符の間は、各個人の環境で違うので敢えて書いていません。
デスクトップのpathを確認を取るほう法はデスクトップに作ったホル
ダーをダブルクリックしてexplorerを立ち上げます。
その時に一番上の所にホルダー名が表示されています。そこをクリック
するとCドライブからのパス名が表示されます。それをコピーして下さ
い。それをpath=""の引用符と引用符の間にコピペして下さい。
最後に、\を付加して下さい。それで上手く行く筈です。
USUIさんへ
おはようございます♪
今日も一日、がんばりましょう!
USUIさんの言うとおり、path="..." としていました。
path="..." は、ACCESSファイルの保存されている先を自動的に取得してくれるものだと、勘違いしていました...(動かない訳ですね (^_^;))
No.8
- 回答日時:
私もデスクトップにホルダーを作り、そこにAccessを移して実行しまし
たが正常にCSVのファイルは出来ています。私のデスクトップのpathは
下記の様になっています。
path = "C:\Users\usui\Desktop\test\"
今一度pathの確認をお願いします。
No.7
- 回答日時:
頑張ったね。
大変良く出来ました。今回のは、出力先は固定です。CSVファイルの出力先を、今回作成し
たACCESSファイルが保存されている同じ場所に出力する為には単
にpath="..."の指定を変更するだけです。
これをデータによって違う場所に出力をしたいと言う事に関しては一切
の考慮はしていません。それは、それでご苦労が耐えません。♡♡♡♡
もう取り敢えずは出来ているので、ここから先は余裕を噛ませて挑戦す
るのも良いのかも。頑張って見て見て。
USUIさん、お返事ありがとうございます♪
path="..."に変更しました。
デスクトップにフォルダを作成して、その中にACCESSファイルを移動して、実行しました。
正常に終了しました。
やった~♪
と思い、フォルダの中のみたら・・・CSVファイルはありません
でした(どこにいってしまったの、CSVファイル!)
USUIさん、助けてください~~
No.6
- 回答日時:
標準モジュールにコピペしたら、下記の操作でCSV作成が出来る事を確
認してください。実行出来ないのは、上手くコピペ出来ていないです。
標準モジュールの関数の所にカーソルを移動してメニューバーより[実
行]をクリック。
サブメニューの[Sub/ユーザーフォームの実行]をクリックして関数を実
行する。CSVが出来ている事を確認願います。
ここ迄が出来ないと、次のステップには行けません。これが出来て初め
て次のマクロの処理に入ります。
モジュールの中で関数が実行出来れば、もう出来たも同じです。後は単
に操作性だけの問題です。最悪今の状態でも不便ですが、目標のCSV作
成は出来ます。
もう少しで完成です。一踏ん張り頑張って下さい。
No.5
- 回答日時:
実装について説明します。
少しだけ複雑です。初めての人には敷居が高いかも知れませんが。分からなかったらその都度質問して下さい。私は
暇です。もう現役を引退したしがない老人です。
① 標準モジュールに私のvbaのコードをOption 文の次の行からをコピ
ペして下さい。
② マクロを作ります。
作成方法は、「作成」の「マクロ」をクリックします。アクションに「プ
ロシージャの実行」を指定します。プロシージャ名に付いては、[...]
のボタンをクリックして「関数」をクリックして、組み込み関数の下の
ホルダーをクリックします。
2番目のペインにモジュール名が、3番目のペインに関数名が表示されま
す。関数名をクリックして貼り付けのボタンをクリックします。[OK]を
クリックします。
閉じると保存しますかと聞いて来るので「はい」をクリックしてマクロ
の名前を入力します。
これだけでも、私は最初の内は良いとは思いますが。慣れて来たらフォーム
で実行するのも良いとは思いますが。ここ迄来たら、後はマクロで今作った
マクロをクリックで指定してダブルクリックするだけでcsvが勝手に作られ
ます。当初は、この操作に漕ぎ着ける事が重要なのではと思います。業務優先
です。
フォームに付いては、最初はこのマクロで運用が出来てから次にやれば
と思います。
フォームでボタン操作で同様の事を処理をしようと思えば
これは、これでまた覚える事が増えます。もう少し慣れてからでも遅く
は無いのではないでしょうか。それよりも業務優先でCSVを最速で出す
事をここでは優先すべきだと思います。
フォームのボタンを押しての実行については、ここまでの操作が出来て
無いとここから先のフォーム処理には行けませんので。ここで止めま
す。
ここから先はこのマクロでの実行が出来てからの話とします。
頑張って下さい。
USUIさんへ
ありがとうございます。
できました♪
本当に助かりました。
もうひとつだけ、わたしのわがままに 付き合っていただけますか...
CSVファイルの出力先が固定になっています。
できれば、CSVファイルの出力先を、今回作成したACCESSファイルが保存されている同じ場所に出力されるようにしたいですが...
可能でしょうか?
No.4
- 回答日時:
①の回答
標準モジュールに私が回答したvbaのコードを挿入します。コピペし
て下さい。尚、最初の行のOption Compare Databaseを除いた全ての
行を複写して下さい。
Option Compare Databaseと言うのは最初から入っていますから。こ
れは、便宜上説明の為に表示しました。
標準モジュールの開き方は、「作成」から「マクロ」の下矢印を押し
て標準モジュールをクリックして下さい。標準モジュールのウインド
ウが開きますのでそこに複写して下さい。
②の回答
path="..."の指定は任意です。
③の回答
追加クエリです。項目名を指定しています。
csvは普通にExcelで読めます。Excelで処理が出来ます。
宜しいでしょうか。
USUIさんへ
NO3の質問の件、原因分かりました。
ダブルクォーテイションの前に空白が必要なんですね♪
ご迷惑おかけしました。
strsql = "INSERT INTO 配付先 ( 組合コード )" & _
"SELECT T_01004_マスタ.組合コード" & _
"FROM T_01004_マスタ" & _
"GROUP BY T_01004_マスタ.組合コード" & _
"ORDER BY T_01004_マスタ.組合コード;"
No.3
- 回答日時:
前回の掲載した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の理解については失敗してコツを掴む事が理解の早道です。頑張っ
てやって見て下さい。
USUIさんへ
教えて頂いた内容を、ただいま、実行しましたが...
行き詰ってしまいました。(-_-;)
下記のところで「実行エラー3075(下記の式)演算子がありません。」のメッセージが出力されてしまいます。
USUIさんのサンプルと比較したり、クエリで作成してSQL文に変更して貼りつけたりとしましたが、原因がどうしても分かりません。
サポートをお願いします。<m(__)m>
strsql = "INSERT INTO 配付先 ( 組合コード )" & _
"SELECT T_01004_マスタ.組合コード" & _
"FROM T_01004_マスタ" & _
"GROUP BY T_01004_マスタ.組合コード" & _
"ORDER BY T_01004_マスタ.組合コード;"
No.2
- 回答日時:
質問の通りにテーブルを作るとなるとどれだけのテーブルが要るのかは
データに遭遇して初めて作成するテーブルの数が分かります。大変で
す。全く機能しないテーブルだらけになるのですから。
また、出来たテーブルをどうするのでしょうか。それは、考えられる事
は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
確認願います。
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ファイルを取り込んで展開するシステムがあるみたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- その他(プログラミング・Web制作) python 3.10で 同じlistに同じ構文で同じデータ代入した結果が異なる現象発生 7 2022/06/18 11:08
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Access(アクセス) テキストボックスの値をテーブルに入力したい 2 2022/06/28 12:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
手動または分散トランザクショ...
-
ADO&mdbで、リンクテーブルの...
-
アクセステーブル、リンクとロ...
-
ワークテーブルの作成について
-
DataGridの中身をDataSetにテー...
-
WORD VBA プログラム修正をお願...
-
ACCESSのテーブル名をリストに...
-
オラクルデータベースへの更新方法
-
VBとアクセスでSQL文に変...
-
DataGridViewに複数テーブルの...
-
エクセルのテーブルを解除する...
-
AccessからExcelへエクスポート...
-
SQL文で在庫推移を得る。
-
Access2003VBA リンクテーブル...
-
Accessで別mdbのテーブルをコピー
-
ExcelVBAからAccessMDB内のテー...
-
CSVファイルのエクスポートでソ...
-
MDBテーブルへの追加変更を教え...
-
asp.net mvcを利用する場合の複...
-
VB.NET データセットとADOレコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WORD VBA プログラム修正をお願...
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
『列名 '担当者CD' があいま...
-
ExcelVBAからAccessMDB内のテー...
-
他のMDBのテーブルに追加したい
-
手動または分散トランザクショ...
-
SQLを発行とは?クエリの作成と...
-
DataGridViewに複数テーブルの...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
エクセルのテーブルを解除する...
-
Excel複数シートをaccessへ一括...
-
HTMLのテーブルの行数が多くな...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
ACCESSのテーブル名をリストに...
-
ACCESS2010 実行時エラー 2766
-
DataGridの中身をDataSetにテー...
-
【ADO】「Execute」を使うと...
おすすめ情報