我有一個矩陣資料表舉例如下,
項目 12月2日 12月3日 12月4日 12月5日
aaa a111 a777
bbb a222 b666
ccc b333 b555
aaa b444 b888
註一:項目欄位內的資料會重複。
註二:日期欄位內不一定會有資料。
我想把資料彙整成:
項目 12月2日 12月3日 12月4日 12月5日
aaa a111,b444 a777 b888
bbb a222 b666
ccc b333 b555
我寫的陣列公式如下:
{=INDEX(A1:E5,MATCH(G2:G4,A1:A5,0),MATCH(H1:K1,A1:E1,0))}
這出現一個問題,無法將重複的資料彙整到新的工作表內,請問各位先進,我該如何做才能將所有(單筆或是重複)資料整合到新的工作表中?
另,沒有找到的資料,會在新的工作表中顯示數字0,能有什麼方式可以不要顯示嗎?
條件
請先將資料依項目排序
<pre class="c" name="code">Sub merge()
For i = Cells.SpecialCells(xlCellTypeLastCell).Row To 2 Step -1 '從最後一列往前檢查
If Cells(i, 1) = Cells(i - 1, 1) Then '以第一欄的資料與上一列比對是否一樣
For j = 2 To Cells.SpecialCells(xlCellTypeLastCell).Column
Cells(i - 1, j) = Cells(i - 1, j) & ", " & Cells(i, j) '將資料加, 合併
Next
Rows(i).Delete
End If
Next
End Sub
感謝apgapple大的協助...... ^_^
不好意思,為了簡化說明,所提供的原始資料範例做了些省略,可能因此忽略了些細節,抱歉了。
在來源資料表中,縱軸的欄位是由"項目"+"姓名"+"日期"所組成,在欄與列的交點輸入所負責的工作名稱,在目標工作表中,只有"姓名"+"日期"兩個欄位。希望藉由這個目標工作表,列出每個人在每一天負責哪些工作,這是這個工作表的用途。
也由於來源工作表內的資料,是由"項目"決定由什麼人處理什麼工作,所以,無法針對"姓名"做排序。故apgapple大 您提供的協助,在我的實際環境中有執行的困難,不知我這樣的狀況,是否有其他的解決方式?
<pre class="c" name="code">Sub REARRANGE()
'請依姓名排名
NAME_COLUMN = 1 '指定姓名的欄數
DATE_COLUMN = 2 '指定日期的欄數
TASK_COLUMN = 3 '指定事件的欄數
Set DATA_SHEET = ActiveSheet
Set DATE_ARRAY = Range(Cells(2, DATE_COLUMN), Cells(2, DATE_COLUMN).End(xlDown))
DATE_MAX = Application.WorksheetFunction.Max(DATE_ARRAY) '日期最大值
DATE_MIN = Application.WorksheetFunction.Min(DATE_ARRAY) '日期最小值
Sheets.Add
Cells(1, NAME_COLUMN) = "姓名"
J = 2 'Counter
For I = DATE_MIN To DATE_MAX '建立日期橫軸
Cells(1, J) = I
Cells(1, J).NumberFormat = "yyyy/mm/dd"
J = J + 1
Next
<pre class="c" name="code"> J = 1 'Counter
MEMBER_NAME = ""
With DATA_SHEET
For I = 2 To .Cells.SpecialCells(xlCellTypeLastCell).Row
If .Cells(I, NAME_COLUMN) = MEMBER_NAME Then
For K = 2 To Cells(1, 1).End(xlToRight).Column
If .Cells(I, DATE_COLUMN) = Cells(1, K) Then
If Cells(J, K) = "" Then
Cells(J, K) = .Cells(I, TASK_COLUMN)
Else
Cells(J, K) = Cells(J, K) & ", " & .Cells(I, TASK_COLUMN)
End If
Exit For
End If
Next
<pre class="c" name="code"> Else
J = J + 1
MEMBER_NAME = .Cells(I, NAME_COLUMN)
Cells(J, NAME_COLUMN) = .Cells(I, NAME_COLUMN)
For K = 2 To Cells(1, 1).End(xlToRight).Column
If .Cells(I, DATE_COLUMN) = Cells(1, K) Then
Cells(J, K) = .Cells(I, TASK_COLUMN)
Exit For
End If
Next
End If
Next
End With
End Sub
視你的資料調整
我大致瞭解您的想法了,只是VBA不是很熟,我需要點時間先消化一下,若有遇到問題再在網上討論討論。
簡單問題別複雜化
有的需要 MSSQL Database 搭配 就是需要用
DISTINCT
我的客戶就有用 超過 幾十萬筆分析 根本無法達成
我們幫她 倒入 MSSQL DB 再用 簡單指令 取出 統計結果
用對工具
柴刀砍大樹一天 ... 電鋸一分鐘