投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/8/13 19:40:26
細かいことですが:

> 〇「行見出し」 = 担当者名

このような場面で
〇 [U+3007]:漢数字のゼロ(IDEOGRAPHIC NUMBER ZERO)
を使うことに違和感があります。


以下、類似の文字として。

○ [U+FFEE]:半角白丸(HALFWIDTH WHITE CIRCLE)
○ [U+25CB]:白丸(WHITE CIRCLE)
● [U+25CF]:黒丸(BLACK CIRCLE)
◯ [U+25EF]:大白丸(LARGE CIRCLE)
🔴 [U+1F534]:大赤丸(LARGE RED CIRCLE)
🔵 [U+1F535]:大青丸(LARGE BLUE CIRCLE)



> 仮にTableAというテーブルがあるとして、フィールドは、
> 契約ID|担当者名|取引先名|業務完了日|ナンバリング用フィールド|
> とあるとします。

同じ日に同じ取引先との契約が複数回発生した場合は、
別の契約 ID が付与されるのでしょうか?

また、取引先のナンバリング順序は定義されているでしょうか?
(契約ID 順なのか、取引日時順なのか、取引先コード順なのか)



> Step1 TableAに、1人の担当者が1日に業務完了させた契約にナンバリングを行う。

このナンバリングは、Access 側で行われるのでしょうか?
VB 側で行うのであれば、DataTable をループ処理すれば採番できますね。



> Step2 
> 〇「行見出し」 = 担当者名および業務完了日
> 〇「列見出し」 = ナンバリングした番号
> 〇「値」 = 取引先名
> というクロス集計クエリ1-1を生成する。

Dim dt As New DataTable("クロス集計")
dt.PrimaryKey = New DataColumn() { _
  dt.Columns.Add("担当者名"GetType(String)), _
  dt.Columns.Add("業務完了日"GetType(Date)) _
}
For n = 1 To 最大ナンバリング値
    dt.Columns.Add("取引先" & CStr(n), GetType(String))
Next

とでもしておいて、ここに .Rows.Add していけば良さそうです。
業務完了日を String 型にするかどうかはお好みで。


> Step3 クエリ1-1の取引先名の文字列全てを結合した「文字列集計列」を追加する。
Step2 の DataTable に
 dt.Columns.Add("文字列集計列", GetType(String))
を追加しておき、自前で連結文字列をセットしていった方が良いでしょう。


> Step4 クエリ1-1もしくはクエリ1-2から
> 〇「行見出し」 = 担当者名
> 〇「列見出し」 = 業務完了日
> 〇「値」 = 取引先名をすべて結合した文字列
> というクロス集計クエリ1-3を生成する。

Step3 の結果に対して、不要な 取引先# 列を dt.Columns.Remove() すれば完成。



とはいえ、Step 3 までの集計のために、DataTable に蓄えるのは非効率的なので、
適当なコレクション(Dictionary とか List など)を用意しておいて、
TableA の内容を For Each して詰みこんでいった方が手っ取り早そうです。
案件的に、ナンバリングする必要も無さそうですし。

いったんコレクション化してしまえば、そこから Step 4 の DataTable を作るのは、そう難しくは無いですよね。