返回列表 上一主題 發帖

請問如何將訂單原始資料轉成需要的?

請問如何將訂單原始資料轉成需要的?

未命名.png
2019-3-24 23:35


大家好,這幾天查了許多資料,還是不能將資料轉好。想請問如何將A:E的資料,分別轉換成H:J 以及M到V呢? (如果大家在公式設定上,有更好的排列方式,也可以直接調整)

還煩情大家協助,謝謝。


附上EXCEL的檔案:
活頁簿1.zip (7.13 KB)

隨意窩 "EXCEL迷"  blog  或 http://blog.xuite.net/hcm19522/twblog
已收集6200篇 EXCEL函數

TOP

  1. Sub zz()
  2. Dim d As Object, a, k, t, b(), n&, m&, kk, tt
  3. Set d = CreateObject("scripting.dictionary")
  4. a = Range("a2:e" & [e1048576].End(3).Row)
  5. For i = 1 To UBound(a)
  6.     d("@" & a(i, 2)) = ""
  7.     k = a(i, 2) & "|" & a(i, 3)
  8.     If Not d.exists(k) Then
  9.         d(k) = Array(a(i, 4), a(i, 5), a(i, 5))
  10.     Else
  11.         t = d(k)
  12.         t(0) = t(0) & "|" & a(i, 4)
  13.         t(1) = t(1) & "|" & a(i, 5)
  14.         t(2) = t(2) + a(i, 5)
  15.         d(k) = t
  16.     End If
  17. Next
  18. k = Filter(d.keys, "@")
  19. ReDim b(1 To UBound(a), 1 To UBound(k) + 1)
  20. For j = 0 To UBound(k)
  21.     b(1, j + 1) = Mid(k(j), 2)
  22.     d.Remove (k(j))
  23.     kk = Filter(d.keys, b(1, j + 1) & "|")
  24.     For ii = 0 To UBound(kk)
  25.         t = d(kk(ii))
  26.         b(ii + 2, j + 1) = Split(kk(ii), "|")(1) & ":" & t(2)
  27.         m = m + 1
  28.         n = IIf(ii + 2 > n, ii + 2, n)
  29.     Next
  30. Next
  31. [h7].Resize(n, UBound(b, 2)) = b
  32. k = d.keys
  33. ReDim b(1 To UBound(a), 1 To m * 2): j = 0
  34. For i = 0 To UBound(k)
  35.     kk = Split(k(i), "|")
  36.     t = d(k(i))
  37.     j = j + 1
  38.     b(1, j) = kk(0)
  39.     b(2, j) = kk(1) & ":" & t(2)
  40.     For jj = 0 To 1
  41.         tt = Split(t(jj), "|")
  42.         For jjj = 0 To UBound(tt)
  43.             b(3 + jjj, j + jj) = tt(jjj)
  44.         Next
  45.     Next
  46.     n = IIf(jjj + 2 > n, jjj + 3, n)
  47.     j = j + 1
  48. Next
  49. [m7].Resize(n, UBound(b, 2)) = b
  50. Set d = Nothing
  51. End Sub
複製代碼

TOP

回復 3# ikboy


ikboy大大,

謝謝您的協助。

在操作巨集的過程中,有一些小問題,想請教您:
1. 會出現如檔案所示的N/A
2. 將第五行的資料複製到第六行、第七行,會出現執行階段錯誤'9' 陣列索引超出範圍。
偵錯會在:b(3 + jjj, j + jj) = tt(jjj)

想請問如何解決呢,謝謝您的協助。

活頁簿1 (2).zip (16.06 KB)

TOP

  1. Sub zz()
  2. Dim d As Object, a, k, t, b(), n&, m&, kk, tt
  3. Set d = CreateObject("scripting.dictionary")
  4. a = Range("a2:e" & [e1048576].End(3).Row)
  5. For i = 1 To UBound(a)
  6.     d("@" & a(i, 2)) = ""
  7.     k = a(i, 2) & "|" & a(i, 3)
  8.     If Not d.exists(k) Then
  9.         d(k) = Array(a(i, 4), a(i, 5), a(i, 5))
  10.     Else
  11.         t = d(k)
  12.         t(0) = t(0) & "|" & a(i, 4)
  13.         t(1) = t(1) & "|" & a(i, 5)
  14.         t(2) = t(2) + a(i, 5)
  15.         d(k) = t
  16.     End If
  17. Next
  18. k = Filter(d.keys, "@")
  19. ReDim b(1 To UBound(a), 1 To UBound(k) + 1)
  20. For j = 0 To UBound(k)
  21.     b(1, j + 1) = Mid(k(j), 2)
  22.     d.Remove (k(j))
  23.     kk = Filter(d.keys, b(1, j + 1) & "|")
  24.     For ii = 0 To UBound(kk)
  25.         t = d(kk(ii))
  26.         b(ii + 2, j + 1) = Split(kk(ii), "|")(1) & ":" & t(2)
  27.         m = m + 1
  28.         n = IIf(ii + 2 > n, ii + 2, n)
  29.     Next
  30. Next
  31. [h1].Resize(n, UBound(b, 2)) = b
  32. k = d.keys
  33. ReDim b(1 To UBound(a), 1 To m * 2): j = 0
  34. For i = 0 To UBound(k)
  35.     kk = Split(k(i), "|")
  36.     t = d(k(i))
  37.     j = j + 1
  38.     b(1, j) = kk(0)
  39.     b(2, j) = kk(1) & ":" & t(2)
  40.     For jj = 0 To 1
  41.         tt = Split(t(jj), "|")
  42.         For jjj = 0 To UBound(tt)
  43.             b(3 + jjj, j + jj) = tt(jjj)
  44.             Cells(3 + jjj, j + jj + 12) = tt(jjj)
  45.         Next
  46.         n = IIf(UBound(tt) + 3 > n, UBound(tt) + 3, n)
  47.     Next
  48.     j = j + 1
  49. Next
  50. [m1].Resize(n, UBound(b, 2)) = b
  51. Set d = Nothing
  52. End Sub
複製代碼

TOP

回復 5# ikboy

ikboy大大您好,
感謝您提供新的巨集,但經實測後,還是會有錯誤。如下圖:
擷取.PNG
2019-6-21 14:32



不好意思,若您方便,還請麻煩您協助提供一些想法,謝謝您。

TOP

[批號]也做去重覆再加總:
Xl0000365.rar (19.34 KB)
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

回復 7# 准提部林


謝謝准提部林大大提供的巨集寫法,在此想請教您:
如果想讓兩個表格分別從J1和J10的位置開始顯示的話,
"
[H1].Resize(MaxRa + 1, MaxCa) = Arr
[H1].Cells(1, MaxCa + 3).Resize(MaxRb + 2, MaxCb) = Brr
"
我改了上面的寫法,變成如下:
"
[J1].Resize(MaxRa + 1, MaxCa) = Arr
[J10].Cells(1, MaxCa - 2).Resize(MaxRb + 2, MaxCb) = Brr
"

但我發現,如果資料一變動的話,第二個表格不一定會從J10開始顯示。

想請問准提部林大大,該如何調整呢? 謝謝您。

TOP

回復 8# gaishutsusuru

[J1].Resize(MaxRa + 1, MaxCa) = Arr
[J1].Cells(MaxRa + 4, 1).Resize(MaxRb + 2, MaxCb) = Brr

上下空兩行~~
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

回復 9# 准提部林


謝謝您的回覆。
在經過實測後,發現第二個表格是會隨著第一個表格的內容來空兩行。

不好意思,想請問您,可以讓第二個表格固定都從J10開始嗎?

再拜託您抽空協助想法,謝謝您。

TOP

        靜思自在 : 【停滯不前,終無所得】人都迷於尋找奇蹟,因而停滯不前;縱使時間再多、路再長,也了無用處,終無所得。
返回列表 上一主題