office personal plus 2019 Access
での質問です。
OSは、Windows10です。
Accessのマクロデザインを利用して、Accessのテーブルにある
【図1】のCSVデータを【図2】のようなデータに変換したいと考えています。
イメージとしては、テーブルデータに空白セルがある場合のみ、
前行の値を空白セルに自動でコピーしたいです。
下図1の例では、「得意先」と「支払方法」の列です。
可能であれば、マクロそのもののVBAの記述ではなく、
アクションカタログで、「新しいアクションの追加」を利用して
作成できる方法が知りたいです。
※もしアクションカタログが難しければ、Access2019のVBAの直接記述方法も合わせて
教えていただけると助かります。
お手数ですが、よろしくお願いいたします。
【図1】
日付 得意先 商品名 支払方法 数量 金額
2021/11/2 A得意先 商品A 現金 1 500
2021/11/2 商品N 2 1,000
2021/11/2 商品X 1 500
2021/11/2 商品J 3 1,500
2021/11/2 B得意先 商品B VISA 1 500
2021/11/2 C得意先 商品A JCB 2 1,000
2021/11/2 商品H 2 1,000
2021/11/2 D得意先 商品X 現金 1 500
2021/11/2 E得意先 商品J 現金 3 1,500
2021/11/2 商品Q 1 500
2021/11/2 商品A 1 500
2021/11/2 商品Z 2 1,000
【図2】
日付 得意先 商品名 支払方法 数量 金額
2021/11/2 A得意先 商品A 現金 1 500
2021/11/2 A得意先 商品N 現金 2 1,000
2021/11/2 A得意先 商品X 現金 1 500
2021/11/2 A得意先 商品J 現金 3 1,500
2021/11/2 B得意先 商品B VISA 1 500
2021/11/2 C得意先 商品A JCB 2 1,000
2021/11/2 C得意先 商品H JCB 2 1,000
2021/11/2 D得意先 商品X 現金 1 500
2021/11/2 E得意先 商品J 現金 3 1,500
2021/11/2 E得意先 商品Q 現金 1 500
2021/11/2 E得意先 商品A 現金 1 500
2021/11/2 E得意先 商品Z 現金 2 1,000
ACCESS(データベース)の仕事じゃないです
マクロ(アクションカタログ)を駆使して実現する方法があるのかもしれませんがVBAを覚えるよりも難解な手法になるでしょう
データベースの場合、データの並び順は指定した並び順となります。指定がない場合の並び順は不定です
質問のデータの場合、ACCESSに取り込んだ瞬間前後という関係性が失われます。前後の関係性がないので、空白が出た場合の前の行といってもその行がどの行なのか特定することができません。何か前後を参照できるような仕組みが必要です
VBAであればCSVを1行ずつ取り込むことができるので、それに合わせて
取り込んだ内容を記憶しておく→次の行の取込の時に空白なら記憶しておいた内容を使う
という流れで目的が達成できます
CSVの取込参考:Access VBA:TransferTextを使用せずにVBAでCSVなどの区切り記号つきテキストファイルを既存のテーブルにインポートするサンプルプログラム(SE Life Log - VBAを中心にその他IT備忘録 -さん)
hirotonさん、さっそくありがとうございます。
それでは、CSV取り込み時に、取込Noを採番するとして、図3のデータだった場合、
対応する方法があるのでしょうか?
大変お手数ですが、教えていただけないでしょうか?
【図3】
取込No,日付,得意先,商品名,支払方法,数量,金額
1,2021/11/2,A得意先,商品A,現金,1,500
2,2021/11/2, ,商品N," ",1,500
3,2021/11/2, ,商品X," ",2,1000
4,2021/11/2, ,商品J," ",1,500
5,2021/11/2,B得意先,商品B,VISA,1,500
6,2021/11/2,C得意先,商品A,JCB,2,1000
7,2021/11/2, ,商品H," ",2,1000
8,2021/11/2,D得意先,商品X,現金,1,500
9,2021/11/2,E得意先,商品J,現金,3,1500
10,2021/11/2, ,商品Q," ",1,500
11,2021/11/2, ,商品A," ",1,500
12,2021/11/2, ,商品Z," ",2,1000
CSVファイルをテキストインポートウィザードでテーブルとして取り込みます。ウィザードの途中で、「主キーを自動的に設定する」にチェックを入れます。これでインポートするとオートナンバー型のフィールド「ID」が自動で追加されて、それが連番になりますので、これで並び順は保持されます。
※1
※2
この更新クエリを実行すればご希望の結果になります。
マクロからは「クエリを開く」アクションで引数にこのクエリを設定すればいいでしょう。
ありがとうございます。
早速上記の更新クエリを試してみました。
実際には、
テーブル=kaikei
空白埋めをしたい列
得意先=商品点数
支払方法=リソース名
になりますので、書き方を変更しています。
SQL文の画面で図Aのように記述し、実行すると、
「SQLステートメントが正しくありません。”DELETE”、”INSERT”、”PROCEDURE”、”SELECT”、または”UPDATE”を使用してくださいとなります。」
全くの素人で申し訳ありませんが、ここからどのようにすればよいか教えていただけませんか?
よろしくお願いいたします。
【図A】
SELECT
FROM Kaikei;
DLookUp("商品点数","kaikei","ID=" & DMax("ID","kaikei","ID<=" & [ID] & " AND 商品点数<>''"))
DLookUp("リソース名","kaikei","ID=" & DMax("ID","kaikei","ID<=" & [ID] & " AND リソース名<>''"))
クエリのデザインビューで作成してみてはどうでしょうか?
うまくいきました!
ありがとうございました。