レポート出力用のテーブルを作成したいと質問した者ですが、問題を切り分けたいので再投稿致します。
インポートしたいフィールドがB4から始まっています。商品の数は今後増える予定はありません。
1.B列の4行目からI列のB列最終行の範囲のみをインポートし、T_インポートテーブルにあるID、商品1、商品2、商品3、商品4フィールドに書き込みたいです。社名・住所・TELは得意先マスターに入っており、IDでリレーションさせて引っ張ってくるのでT_インポートテーブルには不要です。
2.また、T_インポートテーブルの依頼日フィールドに、B2セルの2023/12/12を入れたいです。
A | B | C | D | E | F | G | H | I | |
---|---|---|---|---|---|---|---|---|---|
1 | |||||||||
2 | 2023/12/12 依頼分 | ||||||||
3 | |||||||||
4 | ID | 社名 | 住所 | TEL | 商品1 | 商品2 | 商品3 | 商品4 | |
5 | 1 | ||||||||
6 | 2 |
横ですが、これは運用を変えられないのでしょうか。
「今欲しがってるもの」→ExcelのピボットテーブルやAccessのクロス集計クエリ→「今あるもの」
なので、「今欲しがってるもの」をベースに変更できないのでしょうか。
メリットとして、商品を柔軟に増やせるなんてのもありますが。
初心者なもので仰っていることがあまり理解できず申し訳ありません。
詳しく説明を頂けるとありがたいです!
「初心者なもの」の実際のところがよく分からないので、釈迦に説法だったらすみません。
ExcelやAccessは集計が得意です。しかし、集計後のデータから集計前を復元することは困難または不可能です。
My Car Bomberさんの例であれば、
今あるもの → 今欲しいもの への加工は苦手(機能を自分で作らないといけない)ですが、
今欲しいもの → 今あるもの への加工は得意(機能が用意されている)です。
My Car Bomberさんが例えば
依頼ID 依頼日 取引先ID 商品ID
などと入力するようにすれば、「今あるもの」がすぐに得られるだけでなく、
さまざまな区間(日、月、年他任意の区間)で集計がすぐに得られると思いますが、
切り替える価値がありそうか検討してみて下さい。
(依頼日を Date や CTRL + ; で入力できるし、他でも支援ができます)
エクセルの表のフォーマットがデータベースとしては扱いにくい形になってます。
データベース用語とて「正規化」ができていない状態です。
もし、エクセルの表の形式を変更できるならそれを検討してみてはどうでしょう。
banjoさんの回答も同じ意味だと思います。
もし、エクセルの表のフォーマットは変更不可ということなら、
表範囲に名前をつけることはできないでしょうか。
表範囲をテーブルにできないでしょうか。
(テーブルにすれば自動で名前がつきます。)
そうすれば、インポートするときにその名前を指定してインポートできます。
シートの形式を変更したり、シートを手作業で加工して名前を付けたりすることは出来ないという前提でお願いします。
そのため、任意の範囲のみをインポートする方法を模索しています。
正規化というのは、今回でいえば、A列と1~3行目が無ければ正規化できているということになりますか?
エクセルの方は変更できないということであれば、アクセスにインポートしてから、アクセスの方で正規化変換することになります。
Accessではレポートに出力するだけで、出力レイアウトがエクセルの表とほぼ同じということなら必要ないです。
ただ、せっかくアクセスにインポートするならデータベースとして活用したいですよね。
印刷だけなら、エクセルでもできますので。
シートの範囲指定してインポートするなら、TransferSpreadsheet で第6引数でシートや範囲を指定できます。
上記はB列からI列の4行目からデータのある最後までインポートします。
といった処理を実行したいなら以上のようなコードになるでしょう。
ただ、前回のスレッドにおいて
とご説明された通りなのであれば、正規化したテーブルに変換し、互いの[商品ID]同士で[商品マスター]と結合できるようにされた方がよいでしょう。
データ集計を行う上でも「発送用のレポート」を出力する上でも、その方が便利なのは明らかです。
補足:
事前バインディングではなく実行時バインディングを採用される場合は、Excel.XlDirection 列挙のメンバー定数 xlUp の代わりに値 -4162 を渡すようにして下さい。
大変参考になります、コードの内容理解に私では少し時間がかかりそうですが、読み解いてみます!