iT邦幫忙

0

Excel彙整重複資料問題

max193 2010-12-21 17:09:5210986 瀏覽
  • 分享至 

  • xImage

我有一個矩陣資料表舉例如下,
項目 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,能有什麼方式可以不要顯示嗎?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

14
apgapple
iT邦新手 3 級 ‧ 2010-12-22 18:32:51
最佳解答

條件
請先將資料依項目排序

<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
看更多先前的回應...收起先前的回應...
max193 iT邦新手 4 級 ‧ 2010-12-23 09:40:17 檢舉

感謝apgapple大的協助...... ^_^
不好意思,為了簡化說明,所提供的原始資料範例做了些省略,可能因此忽略了些細節,抱歉了。
在來源資料表中,縱軸的欄位是由"項目"+"姓名"+"日期"所組成,在欄與列的交點輸入所負責的工作名稱,在目標工作表中,只有"姓名"+"日期"兩個欄位。希望藉由這個目標工作表,列出每個人在每一天負責哪些工作,這是這個工作表的用途。
也由於來源工作表內的資料,是由"項目"決定由什麼人處理什麼工作,所以,無法針對"姓名"做排序。故apgapple大 您提供的協助,在我的實際環境中有執行的困難,不知我這樣的狀況,是否有其他的解決方式?

apgapple iT邦新手 3 級 ‧ 2010-12-24 03:01:37 檢舉

apgapple iT邦新手 3 級 ‧ 2010-12-24 03:02:28 檢舉
<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
apgapple iT邦新手 3 級 ‧ 2010-12-24 03:06:03 檢舉
<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
apgapple iT邦新手 3 級 ‧ 2010-12-24 03:06:32 檢舉
<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

視你的資料調整

max193 iT邦新手 4 級 ‧ 2010-12-24 14:19:25 檢舉

我大致瞭解您的想法了,只是VBA不是很熟,我需要點時間先消化一下,若有遇到問題再在網上討論討論。

10
Albert
iT邦高手 1 級 ‧ 2010-12-24 10:57:07

簡單問題別複雜化

有的需要 MSSQL Database 搭配 就是需要用

DISTINCT

我的客戶就有用 超過 幾十萬筆分析 根本無法達成
我們幫她 倒入 MSSQL DB 再用 簡單指令 取出 統計結果

用對工具

柴刀砍大樹一天 ... 電鋸一分鐘

max193 iT邦新手 4 級 ‧ 2010-12-24 14:27:55 檢舉

我也希望能透過DB,只是現實環境不允許,只能選擇:(1)透過公式 or VBA解決。(2)人工作業。
現實的環境,我有電鋸,但,人在荒郊僻野,沒有電。要嘛用柴刀砍樹,不然就用牙齒把樹啃斷...... :-(

Albert iT邦高手 1 級 ‧ 2010-12-25 12:46:35 檢舉

Paris Brest Paris 用自行車 80小時 1200公里 競賽一樣
時速 20 - 40 均速 25 可以 睡覺 (約 10分鐘 吃喝/放水/停車)
每12個鐘頭300公里 睡8個鐘頭 * 4
= 20+20+20+12 = 72小時

我要發表回答

立即登入回答