Board logo

標題: [發問] 請大家幫我看這著資料編排順序的問題 [打印本頁]

作者: sandra_wang    時間: 2010-12-14 20:24     標題: 請大家幫我看這著資料編排順序的問題

請問大家我要怎麼把第70列的資料用VBA寫出來呢?
請看我的附件說明,謝謝!
作者: luhpro    時間: 2010-12-14 22:45

因為你的附件看不出你真正要抓的資料是那一列? (Priority1、Priority2、Priority3 還是 Vendor?)
故程式中直接當作你是要抓 Title 那一列, 你只要變更抓資料的列號即可抓取相對應列中的上述資料了.

以這個例子來說其實只要先取得 Max、Min 與 Middle 的開頭欄號,
再依據表格陸續抓取個別資料的個數搭配起來就可以了.

Sub main()
  Dim iMax%, iMin%, iMid%, iColumn%, iRow%
  Dim iNum%, iI%
  Dim vDatabase, vOutput

  Set vDatabase = Sheets("DATABASE")
  Set vOutput = Sheets("OUTPUT")
  iMax = 182
  iColumn = iMax
  iRow = 70

  With vDatabase
    While Left(.Cells(1, iColumn), 3) = "Max"
      iColumn = iColumn + 1
    Wend
    iMin = iColumn
  
    While Left(.Cells(1, iColumn), 3) = "Min"
      iColumn = iColumn + 1
    Wend
    iMid = iColumn
  End With
  
  iColumn = 3
  With vOutput
    For iNum = 9 To 12
      For iI = 0 To .Cells(2, iNum) - 1
         .Cells(iRow, iColumn) = vDatabase.Cells(1, iMax)
        iMax = iMax + 1
        iColumn = iColumn + 1
      Next iI
   
      For iI = 0 To .Cells(3, iNum) - 1
        .Cells(iRow, iColumn) = vDatabase.Cells(1, iMin)
        iMin = iMin + 1
        iColumn = iColumn + 1
      Next iI
      For iI = 0 To .Cells(4, iNum) - 1
        .Cells(iRow, iColumn) = vDatabase.Cells(1, iMid)
        iMid = iMid + 1
        iColumn = iColumn + 1
      Next iI
    Next iNum
  End With
End Sub
作者: sandra_wang    時間: 2010-12-15 10:52

回復 2# luhpro


請教uhpro...
您回覆的解答,我試跑過了,資料是從DATABASE sheet那邊抓過來的,
請問我如果要在第71-74列的地方,把Priority1-3 & Vendor的資料一起填入OUTPUT sheet,
請問我該怎麼做呢?

另外一個問題,目前我的機器數量是4台,如果要增加到n台,是不是在這裡For iNum = 9 To 12 →把12改成(n+8)嗎?
作者: Hsieh    時間: 2010-12-15 15:20

本帖最後由 Hsieh 於 2010-12-15 15:28 編輯

回復 3# sandra_wang
關於L2為3的編碼是否要有3個MAX
試試看
  1. Sub Ex()
  2. Dim A As Range, MyStr$
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. k = 182
  7. With Sheets("DATABASE")
  8.     Do Until .Cells(1, k) = ""
  9.     Set A = .Cells(1, k)
  10.        d(A.Value) = A.Resize(5, 1).Value
  11.        k = k + 1
  12.     Loop
  13. End With
  14. With Sheets("OUTPUT")
  15. k = 9
  16. Do Until .Cells(1, k) = ""
  17. MyStr = Replace(.Cells(1, k), "_", "")
  18.    Set A = .Cells(2, k).Resize(3, 1)
  19.    s = 1
  20.    For j = 1 To 3
  21.    mykey = IIf(j = 1, "Max_", IIf(j = 2, "Min_", "Middle_"))
  22.       For i = 1 To A(j)
  23.          d1(mykey) = d1(mykey) + 1
  24.          d2(MyStr & "_" & s) = d(mykey & d1(mykey))
  25.          s = s + 1
  26.       Next
  27.    Next
  28.    k = k + 1
  29. Loop
  30. k = 3
  31. For Each ky In d2.keys
  32. .Cells(6, k) = ky
  33. .Cells(70, k).Resize(5, 1) = d2(ky)
  34. k = k + 1
  35. Next
  36. End With
  37. End Sub
複製代碼

作者: luhpro    時間: 2010-12-15 23:04

本帖最後由 luhpro 於 2010-12-15 23:10 編輯

回復 3# sandra_wang
※ 以下的 ixxx 表 iMax、iMin 與 iMiddle

嗯... 先將 iRow = 70 改成 iRow = 71
再將  .Cells(iRow, iColumn) = vDatabase.Cells(1, ixxx)

改成四行
.Cells(iRow, iColumn) = vDatabase.Cells(2, ixxx)
.Cells(iRow + 1, iColumn) = vDatabase.Cells(3, ixxx)
.Cells(iRow + 2, iColumn) = vDatabase.Cells(4, ixxx)
.Cells(iRow + 3, iColumn) = vDatabase.Cells(5, ixxx)

或是改成
Dim iNum%, iLeft%, iI%, iJ%
.
.
.
For iJ = 0 To 3
   .Cells(iRow + iJ, iColumn) = vDatabase.Cells(iJ + 2,  ixxx)
Next iJ

至於
For iNum = 9 To 12

確實只要改成
.
.
iLeft = 9
.
.
.
For iNum = iLeft To iLeft + 8

即可.

我的程式是比較直觀,

Hsieh 大大的程式都很簡潔,

你可以參考看看要用哪個.




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