Board logo

標題: [發問] 如何讓總表轉化為三張明細表 [打印本頁]

作者: s7659109    時間: 2013-6-20 12:23     標題: 如何讓總表轉化為三張明細表

vlookup只能挑出每一件的第1筆,第2筆以後就無法挑出,請求幫忙!
作者: Bodhidharma    時間: 2013-6-20 23:18

本帖最後由 Bodhidharma 於 2013-6-20 23:21 編輯

回復 1# s7659109

在各表的A1儲存格輸入貨號(Sheet A001就輸入A001,Sheet A002就輸入A002...)
3張Sheet的A3儲存格陣列公式(CTRL+SHIFT+ENTER輸入)
  1. =INDEX(總表!A$1:A$65536,SMALL(IF(總表!$B$1:$B$1000=$A$1,ROW(總表!$B$1:$B$1000),4^8),ROW(1:1)))&""
複製代碼
下拉右拉

[attach]15274[/attach]
作者: p212    時間: 2013-6-21 08:49

本帖最後由 p212 於 2013-6-21 08:50 編輯

回復 2# Bodhidharma
請問
=INDEX(總表!A$1:A$65536,SMALL(IF(總表!$B$1:$B$1000=$A$1,ROW(總表!$B$1:$B$1000),4^8),ROW(1:1)))&""
紅字部份&""用意為何?
1、用以回傳組合公式結果均為「文字」型態呈現?
2、抑&""可逕予省略?
作者: Bodhidharma    時間: 2013-6-21 09:07

回復 3# p212
紅字部份&""用意為何?
1、用以回傳組合公式結果均為「文字」型態呈現?
2、抑&""可逕予省略?


如果沒有&""的話,沒有資料範圍的地方會顯示為0
純粹只是讓資料表比較好看,不過的確需要注意公式結果會以「文字」呈現
作者: s7659109    時間: 2013-6-21 09:22

按照提供的函數輸入,結果如照片A001、
A002所視,我的版本2003,請問問題出在那?
整串公式的函意可否請解釋一下,另目前我還
無下載的功能,若提供檔案,可否MAIL TO
[email protected],以上所請謝謝!
作者: s7659109    時間: 2013-6-21 09:29

補上套們式檔案!
作者: Bodhidharma    時間: 2013-6-21 11:46

回復 5# s7659109

陣列公式,要用CTRL+SHIFT+ENTER三鍵輸入
你把公式貼上後,不能直接按ENTER,要三鍵齊按鍵入

至於公式的原理,看起來你應該對陣列還沒有概念,這樣講起來有點困難…
可參考:
http://office.microsoft.com/zh-tw/excel-help/HA010228458.aspx#BM1
http://isvincent.pixnet.net/blog/post/36660932-excel-%E5%A4%9A%E6%A2%9D%E4%BB%B6%E7%9A%84%E6%9F%A5%E8%A9%A2(index%2Bsmall%2B%E9%99%A3%E5%88%97)

最後,INDEX(A$1:A$65536...)這個部分的65535不宜更改,不然對應不到的會出現錯誤值 (其它部分要更改範圍就沒問題)
作者: s7659109    時間: 2013-7-9 09:16

若總表未按日期排序,日期有前後穿插,則產生的A001'A002'A003三張表,如何自動產生排序。
作者: Bodhidharma    時間: 2013-7-9 19:05

回復 8# s7659109

如果日期是正規格式的話
102.5.xx不是正規日期格式,正規日期格式應該是2013/5/xx,而且是通用格式或是日期格式,不能是文字格式
  1. =IF(ISERROR(INDEX(總表!A:A,MOD(SMALL(IF(總表!$B$1:$B$1000=$A$1,總表!$A$1:$A$1000*10000+ROW($1:$1000),9^9^9),ROW(1:1)),10000))),"",INDEX(總表!A:A,MOD(SMALL(IF(總表!$B$1:$B$1000=$A$1,總表!$A$1:$A$1000*10000+ROW($1:$1000),9^9^9),ROW(1:1)),10000)))
複製代碼
你那種格式要轉正規的話,公式會變得更長…
作者: leoskie    時間: 2013-7-11 21:39

看起來很像我在想的表格, 不過沒有先製作sheet 2 ~sheet x 可以嗎???

我在想的是讓他run, ran完以後就出現 x張的不一樣sheet可以用來print
作者: Bodhidharma    時間: 2013-7-12 02:08

回復 10# leoskie

要自動生出N張Sheet的話得用VBA
作者: leoskie    時間: 2013-7-12 02:33

可惜我下載不了檔案,不然我來研究看看他的想法是不是差不多.

若不能自動生成,那手動生成也好.

每次都要做二十幾張,最怕就是忘記 或貼錯格欄位.... 這才是擔心的
作者: owen06    時間: 2013-7-12 07:44

推薦使用VBA,不管要生幾百張都改個數字就好
作者: s7659109    時間: 2013-9-5 15:49

麻煩解釋4^8的意思與用法
作者: Hsieh    時間: 2013-9-6 08:36

回復 14# s7659109

4的8次方
作者: Hsieh    時間: 2013-9-6 08:50

回復 1# s7659109
樞紐分析表雙擊資料輸出明細工作表


    [attach]15965[/attach]
作者: s7659109    時間: 2013-9-9 09:34

以本題,為何要用4的8次方,拜託請解答!
作者: s7659109    時間: 2013-9-11 09:34

另有一問題請教,總表轉換過來的明細表,金額無法加總,若用VALUE函數,則下一列無符合資料會出現公式#value!的錯誤,請協助。
作者: s7659109    時間: 2013-9-11 09:36

我的office為2003是否有解?
作者: Andy2483    時間: 2024-3-12 08:36

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下,請各位前輩指教
總表:
[attach]37579[/attach]

執行結果A001:
[attach]37580[/attach]

執行結果A002:
[attach]37581[/attach]

執行結果A003:
[attach]37582[/attach]

Option Explicit
'這方案是以字典key記錄不重複的貨號,item記錄相同貨號所在列號,以"/"間隔
Sub TEST_1()
Application.DisplayAlerts = False
'↑令不必詢問工作表是否刪除,直接刪了
Dim Brr, Crr, Z, Q, A, i&, j%, s%, N%
'↑宣告變數:&是長整數,%是短整數,其餘是通用變數
Set Z = CreateObject("Scripting.Dictionary")
'↑令Z變數是 字典
For Each A In Worksheets
   If A.Name <> "總表" Then A.Delete
Next
'↑設順迴圈將"總表"以外的工作表刪除
Brr = [A1].CurrentRegion: Crr = Brr
'↑令Brr變數是帶入區域儲存格值的二維陣列,令Crr變數同Brr陣列
For i = 3 To UBound(Brr): Z(Brr(i, 2)) = Z(Brr(i, 2)) & "/" & i: Next
'↑設順迴圈將貨號濾重複,但是以item記錄所在的列號,以"/"符號間隔
For s = 0 To Z.Count - 1
   Q = Split(Z.ITEMS()(s), "/"): N = 2
   For i = 1 To UBound(Q)
      N = N + 1
      For j = 1 To 8: Crr(N, j) = Brr(Q(i), j): Next
   Next
   Worksheets.Add.Name = Z.KEYS()(s): [A1].Resize(N, 8) = Crr
Next
'↑設順迴圈將以每個貨號新增工作表,將資料寫入工作表中
End Sub
作者: Andy2483    時間: 2024-3-12 10:18

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典另一方案,學習方案與心得如下,請各位前輩指教

Option Explicit
'這方案是以字典key記錄不重複的貨號,item為二維陣列,
'另以貨號連接"/r"字串為key,item為該二維陣列已使用的列數

Sub TEST_2()
Application.DisplayAlerts = False
Dim Brr, Crr(1 To 1000, 1 To 8), Z, Q, A, R&, i&, j%, s%, N%
Set Z = CreateObject("Scripting.Dictionary")
For Each A In Worksheets
   If A.Name <> "總表" Then A.Delete
Next
Brr = [A1].CurrentRegion
For i = 3 To UBound(Brr)
   A = Z(Brr(i, 2)): R = Z(Brr(i, 2) & "/r") + 1
   '迴圈一開始:
   'A = Z(Brr(i, 2))這程序執行就已經在Z字典裡產生了key是 Brr(i, 2)陣列值,
   '而這對應item是空的,程序意義是令以A變數是 迴圈貨號為key將item二維陣列提取出來,
   '如果item不是二維陣列也沒差!
   '因為A變數宣告的是通用型變數,可以隨需求作變換(畢竟一開始的字典裡哪來的二維陣列)
   
   'R = Z(Brr(i, 2) & "/r") + 1這程序執行後已經就已經在Z字典裡產生了key是
   'Brr(i, 2)陣列值連接"/r"新字串,而這對應item +1,程序意義是:
   '令R變數是 貨號連接"/r"字串的key,item是自身值+1(這是要寫入二維陣列的空列號)
   '至此會有個疑問,A變數都還不是陣列! 哪裡來的空列??
   'A變數還不是陣列也沒差,後方程序判斷式會建立新二維陣列,
   'R變數宣告的是 長整數,其初始值是0,再+1=1,所以剛好指定其要寫入空列號是第1列

      
   If Not IsArray(A) Then A = Crr
   '↑如果A變數不是陣列,就令A是同Crr變數的二維陣列
   '至此每個i迴圈都以貨號當key,item是裝結果資料的二維陣列,貨號連接"/r"字串記錄該
   '二維陣列用到哪一列了

   For j = 1 To 8: A(R, j) = Brr(i, j): Next
   Z(Brr(i, 2)) = A: Z(Brr(i, 2) & "/r") = R
Next
'↑藉著將二維陣列在item置入/提取/編輯/放回達到目的,至於為何要提取出來再編輯?
'VBA規則:字典裡的陣列要編輯需提取出來再放回,無法直接在字典裡編輯

For Each A In Z.keys
   If Not IsArray(Z(A)) Then GoTo A01
   Worksheets.Add.Name = A
   [A1:H1].Resize(2) = Brr
   [A3].Resize(Z(A & "/r"), 8) = Z(A)
A01: Next
'↑設逐項迴圈將字典裡的二維陣列寫入新增工作表裡
End Sub
作者: Andy2483    時間: 2024-3-12 13:51

謝謝論壇,謝謝各位前輩
後學藉此帖練習陣列與字典,學習方案如下:

Option Explicit
'這方案是以字典key記錄不重複的貨號,item為儲存格集
Sub TEST_3()
Application.DisplayAlerts = False
Dim Brr, A, Z, Q, i&, T$
Set Z = CreateObject("Scripting.Dictionary")
For Each A In Worksheets
   If A.Name <> "總表" Then A.Delete
Next
Brr = [A1].CurrentRegion
For i = 3 To UBound(Brr)
   T = Brr(i, 2)
   If Not IsObject(Z(T)) Then
      Set Z(T) = Union([A1:A2], Cells(i, 2))
      Else
      Set Z(T) = Union(Z(T), Cells(i, 2))
   End If
Next
For Each Q In Z.keys
   Worksheets.Add.Name = Q
   Z(Q).EntireRow.Copy [A1]
Next
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)