Board logo

標題: [發問] ListBox與排序加總問題 [打印本頁]

作者: starbox520    時間: 2016-10-5 15:11     標題: 資料相關加總問題

如圖示有A-E欄

判斷A.B.C.D欄如果為一致

就為一組資料

再去做E欄的加總  如附圖   

原本想用錄製巨集

但是假如資料一多

怕會有很多地方lose掉

還請問各位行家該如何著手這個問題><"
[attach]25445[/attach][attach]25446[/attach][attach]25447[/attach]
[attach]25448[/attach]
作者: 准提部林    時間: 2016-10-5 21:00

Sub TEST()
Dim Arr, Brr, xD, Dn&, T$, N&, i&, j%
Arr = Range([A1], Cells(Rows.Count, 1).End(xlUp)(1, 5))
Set xD = CreateObject("Scripting.Dictionary")
ReDim Brr(1 To UBound(Arr), 1 To 5)
For i = 2 To UBound(Arr)
  For j = 1 To 4: T = T & "/" & Arr(i, j): Next
    Dn = xD(T)
    If Dn = 0 Then
     N = N + 1: Dn = N: xD(T) = N
     For j = 1 To 4: Brr(Dn, j) = Arr(i, j): Next
    End If
    Brr(Dn, 5) = Brr(Dn, 5) + Val(Arr(i, 5)): T = ""
Next i
If N > 0 Then [H2].Resize(N, 5) = Brr
End Sub

[attach]25449[/attach]
 
作者: starbox520    時間: 2016-10-5 22:39

回復 2# 准提部林


    回版大
    對耶這是我想要的結果
    可以再麻煩版大解說一下程式碼的部分嗎
    我想讓自己去嘗試做變動
作者: stillfish00    時間: 2016-10-6 11:34

回復 1# starbox520
樞紐分析表細部調整後也能達成
  1. Sub test()
  2.     Dim rngData As Range: Set rngData = Sheets("工作表1").Range("A1:E33")
  3.     Dim arKeyFields: arKeyFields = Array("CR", "LN", "PG", "BE")
  4.     Dim sumField: sumField = "QQ"

  5.     Dim pvt As PivotTable, i, x
  6.     With Sheets.Add
  7.         Set pvt = ActiveWorkbook.PivotCaches.Create( _
  8.                 SourceType:=xlDatabase, _
  9.                 SourceData:=rngData, _
  10.                 Version:=xlPivotTableVersion14 _
  11.             ).CreatePivotTable(TableDestination:=.[A1])
  12.     End With
  13.     With pvt
  14.         .InGridDropZones = False
  15.         .ShowDrillIndicators = False
  16.         .DisplayFieldCaptions = True
  17.         .RowGrand = False
  18.         .ColumnGrand = False
  19.         .RowAxisLayout xlTabularRow
  20.         i = 1
  21.         For Each x In arKeyFields
  22.             .PivotFields(x).Orientation = xlRowField
  23.             .PivotFields(x).RepeatLabels = True
  24.             .PivotFields(x).Subtotals(1) = False
  25.             .PivotFields(x).Position = i
  26.         Next
  27.         .AddDataField .PivotFields(sumField), "加總 - " & sumField, xlSum
  28.     End With
  29. End Sub
複製代碼
[attach]25455[/attach]
作者: starbox520    時間: 2016-10-7 00:32

回復 2# 准提部林

不好意思想再修正一下

如果資料型態改成工作表2

一樣想跑出工作表1的樣子呢

[attach]25465[/attach][attach]25464[/attach][attach]
作者: starbox520    時間: 2016-10-7 00:34

回復 4# stillfish00


    回大大因為我沒用過樞紐分析表
    剛剛試了好幾回都弄不出來
    如果用此功能
    資料型態改成附圖這樣
    一樣能夠跑出我想要的資料嗎
    [attach]25467[/attach][attach]25468[/attach][attach]25469[/attach]
作者: stillfish00    時間: 2016-10-7 09:25

回復 6# starbox520
4# 漏了 i=i+1

你再改第一行的資料範圍就好了
Set rngData = Sheets("工作表2").Range("A1:G33")
作者: starbox520    時間: 2016-10-7 16:27

回復 7# stillfish00


    回S大
    方便放檔案給我看嗎
    我加上去後一直出現錯誤><"
作者: 准提部林    時間: 2016-10-7 17:48

回復 5# starbox520


[attach]25479[/attach]
作者: starbox520    時間: 2016-10-7 19:13

回復 9# 准提部林


    回大大
   有沒有辦法在按完鈕後(C,E)欄都不要呢
    只跑出像這樣就好
[attach]25483[/attach]
作者: 准提部林    時間: 2016-10-7 21:13

回復 10# starbox520


[attach]25484[/attach]
作者: starbox520    時間: 2016-10-10 01:10

回復 11# 准提部林


    回准提大大
    我又發現新問題了
    如果是加機制進去像工作表3把表一  
    A,C,D如果相同就算一筆資料(已在表一 以人工篩選方法判斷...)
   然後B欄做歸類   形成工作表3要的項目
   
   [attach]25515[/attach]
作者: 准提部林    時間: 2016-10-10 10:58

回復 13# starbox520


完全看不懂~~~
作者: starbox520    時間: 2016-10-10 11:35

回復 14# 准提部林


    回大大像這樣
    以橘色區塊為例
     A.C.D資料相符
     再去分出他的B欄 形成另一張圖
   
   [attach]25517[/attach][attach]25518[/attach][attach]25519[/attach]
作者: 准提部林    時間: 2016-10-10 13:39

回復 15# starbox520
  1. Sub TEST()
  2. Dim Arr, Brr, xD, Dn&, T$, N&, i&, j%
  3. Arr = Range([工作表1!A1], [工作表1!A1].Cells(Rows.Count, 1).End(xlUp)(1, 5))
  4. Set xD = CreateObject("Scripting.Dictionary")
  5. ReDim Brr(1 To UBound(Arr), 1 To 8)
  6. For i = 2 To UBound(Arr)
  7.     T = Arr(i, 1) & "|" & Arr(i, 3) & "|" & Arr(i, 4)
  8.     Dn = xD(T)
  9.     If Dn = 0 Then
  10.        N = N + 1: Dn = N: xD(T) = N
  11.        For j = 1 To 3: Brr(Dn, j) = Arr(i, Array(1, 3, 4)(j - 1)): Next
  12.     End If
  13.     j = Int(InStr("---BK-VM-TR-PK-", "-" & Split(Arr(i, 2), "_")(1) & "-") / 3)
  14.     If j > 0 Then
  15.        Brr(Dn, j + 3) = Brr(Dn, j + 3) + Arr(i, 5)
  16.        Brr(Dn, 8) = Brr(Dn, 8) + Arr(i, 5)
  17.     End If
  18. Next i
  19. If N = 0 Then Exit Sub
  20. With Sheets("工作表3")
  21.      .UsedRange.Offset(1, 0).Clear
  22.      .[A2].Resize(N, 8) = Brr
  23.      Application.Goto .[A1]
  24. End With
  25. End Sub
複製代碼
[attach]25520[/attach]
作者: starbox520    時間: 2016-10-10 14:16

回復 16# 准提部林

    大大這段
    j = Int(InStr("---BK-VM-TR-PK-", "-" & Split(Arr(i, 2), "_")(1) & "-") / 3)

    還有這段
   Brr(Dn, j + 3) = Brr(Dn, j + 3) + Arr(i, 5)

   可以說明一下嗎    太厲害了><"想知道這是怎麼思考的
作者: 准提部林    時間: 2016-10-10 15:42

回復 17# starbox520


MsgBox Split("5F_BK", "_")(1)  '>>>  取得"_"右方的"BK"

MsgBox InStr("---BK-VM-TR-PK-", "-" & "BK" & "-")   '>>> 等于 3
MsgBox Int(3 / 3)
MsgBox InStr("---BK-VM-TR-PK-", "-" & "VM" & "-")   '>>> 等于 6
MsgBox Int(6 / 3)
MsgBox InStr("---BK-VM-TR-PK-", "-" & "PK" & "-")   '>>> 等于 12
MsgBox Int(12 / 3)
MsgBox InStr("---BK-VM-TR-PK-", "-" & "" & "-")   '>>> 等于 1
MsgBox Int(1 / 3)
MsgBox InStr("---BK-VM-TR-PK-", "-" & "HG" & "-")   '>>> 等于 0
MsgBox Int(0 / 3)

這樣就可以知道數值放在哪欄, j + 3 是因前三欄已使用
作者: 准提部林    時間: 2016-10-10 15:49

回復 17# starbox520


也可用這:
M = Application.Match(Split(Arr(i, 2), "_")(1), [工作表3!D1:G1], 0)
If IsNumeric(M) Then
  Brr(Dn, M + 3) = Brr(Dn, M + 3) + Arr(i, 5)
  Brr(Dn, 8) = Brr(Dn, 8) + Arr(i, 5)
End If
作者: starbox520    時間: 2016-10-10 16:36

回復 19# 准提部林


    瞭解了
    謝謝大大教學XD
    又學到了一課
作者: starbox520    時間: 2016-10-12 00:35

回復 19# starbox520


    回大大有辦法把您做的結果顯示在清單方塊做動作嗎
    不好意思問題有點多 == ""
    檔案內有細項說明><
  
  [attach]25524[/attach]
作者: Hsieh    時間: 2016-10-12 09:22

回復 1# starbox520


    樞紐分析表也是不錯的選擇
[attach]25526[/attach]
作者: starbox520    時間: 2016-10-12 20:07

回復 18# 准提部林


   
    回大大有辦法把您做的結果顯示在清單方塊做動作嗎
    不好意思問題有點多 == ""
    檔案內有細項說明><

[attach]25528[/attach]
作者: starbox520    時間: 2016-10-12 20:08

回復 22# Hsieh


回大大  因為之後可能還會再加入資料
如果要用樞紐的話
怕後面每增加一次資料就要重新選取範圍
所以才想說用vba去執行^^
作者: 准提部林    時間: 2016-10-13 09:47

回復 22# starbox520

還是看不懂如何做!
何況office版本不同, 物件轉成舊版時,listbox無法使用!!!
作者: starbox520    時間: 2016-10-13 15:26

本帖最後由 starbox520 於 2016-10-13 15:29 編輯

回復 24# 准提部林
不好意思我補充說明

第一個清單方塊要跑出的

是 CR. PG. BE. LC 資料相同的話

去做 BK.VM.TR.數量 加總

如下圖  這種格式(之前有請大大您教過我的)

[attach]25534[/attach]
第二個清單方塊為我點選第一個清單方塊的內容其中一項時


會跑出資料還未加總前的型態

[attach]25535[/attach]
表二的紅色區塊是想要把我在清單方塊的資料

貼到紅色區塊裡(只是我要秀在清單方塊上可以方便我去做貼上或者跑出第2個清單的機制)
作者: starbox520    時間: 2016-10-14 14:22

回復 24# 准提部林

sorry忘了附檔給您

[attach]25541[/attach]
作者: starbox520    時間: 2016-10-16 01:26     標題: ListBox與排序加總問題

1.工作表2為從WIP抓過來做排序計算的資料

不過在數量這部分不知道是我哪段有問題(要做BK+VM+TR的相加)

2.想在表格"產出"  做出ListBox(還是有其他方法呢)

此ListBox可以列出我現在所選的編號那欄對應的第一排

從"工作表2"的資料列出先與"Package"相同的次要是"BodySize"列出 然後"數量"由大至小

可以貼在"產出"紅色的儲存格,每一個編號都對應到同一欄

在點擊選出的內容可以秀出此筆資料相加前的內容
[attach]25550[/attach][attach]25548[/attach][attach]25549[/attach]

[attach]25551[/attach]
作者: starbox520    時間: 2016-10-21 00:13

'排列
Sub ArrangeMent()

Dim Arr, Brr, xD, Dn&, T$, N&, i&, j%
Arr = Range([WIP!A1], [WIP!A1].Cells(Rows.Count, 1).End(xlUp)(1, 12))
Set xD = CreateObject("Scripting.Dictionary")
ReDim Brr(1 To UBound(Arr), 1 To 8)
   For i = 2 To UBound(Arr)
   T = Arr(i, 1) & "|" & Arr(i, 5) & "|" & Arr(i, 6) & "|" & Arr(i, 7)
   Dn = xD(T)
   If Dn = 0 Then
      N = N + 1: Dn = N: xD(T) = N
      For j = 1 To 4: Brr(Dn, j) = Arr(i, Array(1, 5, 6, 7)(j - 1)): Next
   End If
    j = Int(InStr("----BK-VM-TR-", "-" & Split(Arr(i, 3), "_")(1) & "-") / 3)
     If j > 0 Then
      Brr(Dn, j + 4) = Brr(Dn, j + 4) + Arr(i, 11)
       Brr(Dn, 8) = Brr(Dn, 8) + Arr(i, 11)
     End If
Next i
If N = 0 Then Exit Sub
    With Sheets("工作表2")
   .[A2].Resize(N, 8) = Brr
     Application.Goto .[A1]
End With
End Sub

加上資料加總問題  以做排序出來了

只是想在做表單

做貼上的效果
Private Sub CommandButton1_Click()

    Dim AA(), xi As Integer
    With frmSelector
        For xi = 0 To .ListCount - 1
            '  判斷列表框 (ListBox1) 是否有被點選
            If .Selected(xi) = True Then
                '  取出該行之數據,存入 AA 陣列中
                AA = Application.Index(frmSelector.List, xi + 1)
                 'With Sheets("sheet3").Range("A" & Rows.Count).Offset(1)  '.Offset(1)  '**還是下一儲存格
                 With Sheets("sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1)  '.Offset(1)  '**還是下一儲存格
                    .Cells = .Cells + AA
                    '還是 .Cells = .Cells + AA '資料是累積的
                End With
            End If
        Next
    End With

End Sub

只是試了很久都沒有反應 ...
[attach]25587[/attach]
作者: GBKEE    時間: 2016-10-21 06:41

回復 28# starbox520
  1. Private Sub CommandButton1_Click()
  2.     Dim AA(), xi As Integer
  3.     ' With frmSelector 這是表單物件不是ListBox   **會有錯誤的
  4.     'With frmSelector.lstSelector  也可用這表單物的子物件(ListBox)
  5.     With lstSelector   '物件(ListBox)
  6.         If .ListIndex > 0 Then         'ListBox清單中選取列的索引值 ,   -1 表沒有選取
  7.         '**  0 為表頭 如要選取 可改為 If .ListIndex > -1 Then
  8.             
  9.             '  取出該行之數據,存入 AA 陣列中
  10.             AA = Application.Index(.List, .ListIndex + 1)
  11.             With Sheets("sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1)  '.Offset(1)  '**還是下一儲存格
  12.                         .Cells.Resize(, 9) = AA
  13.                     '還是 .Cells = .Cells + AA '資料是累積的
  14.                     '***AA為陣列不可用此語法**
  15.                 End With
  16.             End If
  17.     End With
  18. End Sub
複製代碼

作者: starbox520    時間: 2016-10-21 08:59

回復 29# GBKEE


    原來是我修改錯地方..
    可以再問一下  
    因為我想用工作表2的資料去對應到"TR排機&產出"
    每一機台編號的第一排都有資料
    用"工作表2"的資料對應到上方每一個篩好的資料再作排序(Package.BodySize.LC.數量由大至小)再把處理好的資料用ListBox顯示出來
    我知道可以用多重篩選去執行...
    但今天如果上方篩好的資料跟之前的不一樣(Ex:機台編號第2個)
    以小弟功力又在此卡住了.....
    有什麼辦法可以偵測我現在選的那一欄位的機台編號可以對應到他第一排資訊去做排列呢...
   
    [attach]25590[/attach]
作者: starbox520    時間: 2016-10-21 13:47

本帖最後由 starbox520 於 2016-10-21 13:49 編輯

回復 29# GBKEE


    附檔的按我 就是我想要做的問題改善
    原本是設計來開啟listBox單純此功能而已(目前ListBox的資料顯示是取用於"工作表2")
    現在要修正為如果先點機台編號在按此按鈕開啟ListBox(或是有更好的方法...)
    能否自動對應到選擇的機台編號右手邊的第一排資料
    跑出來的樣子會類似像"工作表1"左上圖示 以對應字串顯示出的排序
作者: starbox520    時間: 2016-10-23 03:42

我有試著自己去用矩陣方式寫入清單方塊
   可以幫我看看哪邊語法有錯誤的嗎
   Private Sub TrLowData(ByVal strPackage As String, ByVal strLC As String, ByVal strBodysize As String)
    Dim max As Integer
    max = UBound(List)
    Dim gg As Boolean
    Dim LowCustomer As String
    Dim BodySize As String
    Dim Location As String
    Dim DeviceType As String
    Dim Package As String
    Dim Schedule As String
    Dim BK As Long
    Dim LC As String
    Dim TY As String
    Dim VM As Long
    Dim TR As Long
    Dim Total  As Long
            '用工作表2去做排列 一行一行讀
    For k = 2 To 6000
        Customer = Cells(k, "A")
        Package = Cells(k, "B")
        BodySize = Cells(k, "C")
        LC = Cells(k, "D")
        BK = Cells(k, "E")
        VM = Cells(k, "F")
        TR = Cells(k, "G")
        Total = Cells(k, "H")
            If Len(Customer) = 0 Then
                Exit For
            End If
     '比對字串作排列  以PKG.LEADCOUNT.BodySize作條件篩選
     
     Next
      If (StrComp(List(i).PKG, strPackage, vbTextCompare) = 0) And _
         (StrComp(List(i).LEADCOUNT, strLC, vbTextCompare) = 0) And _
         (StrComp(List(i).BodySize, strBodysize, vbTextCompare) = 0) Then
      For i = 0 To max
     '把結果放去LISTBOX 只秀出五筆
      lstSelector.ColumnCount = 9
         For i = 1 To 5
         lstSelector.Additm
        Next i
       '這裡要keep這五個資料但是我不曉得要怎麼用語法去寫...
      
      '在秀出五筆以LEADCOUNT.PKG 作排列
       If (StrComp(List(i).LEADCOUNT, strLC, vbTextCompare) = 0) And _
          (StrComp(List(i).PKG, strPackage, vbTextCompare) = 0) And _
           For i = 0 To max
            lstSelector.ColumnCount = 9
         For i = 1 To 5
         lstSelector.Additm
        Next i

End Sub
作者: GBKEE    時間: 2016-10-24 05:39

本帖最後由 GBKEE 於 2016-10-24 05:41 編輯

回復 31# starbox520

自動對應到選擇的機台編號右手邊的第一排資料
所說: 是對應到如圖嗎

[attach]25610[/attach]


你期望得到"工作表1"左上圖示 以對應字串顯示出的排序

如圖工作表2與工作表1 的欄位不盡相同.
     問題是工作表2沒有欄位的資料,如何在工作表1秀出來,
   工作表1上的5筆資料,看不出如何在工作表2取出 .
   工作表1  Customergroup  的5筆資料,
    AVAGO  SYNAPTICS  MAXIM  MELLANOX  PMC-SIERRA
    關聯性看不出來

    [attach]25609[/attach]
作者: starbox520    時間: 2016-10-24 08:45

回復 33# GBKEE


    回版大
    是對應到此字串沒錯
    是以工作表2資料去對應字串的"Package" 與 "BodySize"的內容作排列(數量由大致小)呈現在ListBox上
    工作表1為理想圖   應為[attach]25611[/attach]
    是我表達不清抱歉...
    若以第一欄來說  會對應到的篩選條件就是BGA  再來是17.3*7  篩完後再排列數量大小(以工作表2去做篩選)
        以第2攔來說  會對應到的篩選條件就是TQFP 再來是10*10 篩完後再排列數量大小
    [attach]25612[/attach][attach]25613[/attach]
     圈起部分是   上面完成結果後呈現在ListBox上   點選其中某項  會直接把 這4筆資料直接貼上  (每次只貼一次)
     但因為每個機台編號第一欄資料都不同  所以才想過要以先點選儲存格再去尋找字串的方法去做排列...(我的想法)
     重新附上整理後的檔案....不好意思讓您混淆了
     [attach]25614[/attach]
作者: starbox520    時間: 2016-10-24 09:23

回復 33# GBKEE

    不好意思版大
    此版較明確   
    [attach]25615[/attach]
作者: starbox520    時間: 2016-10-24 18:54

回復 33# GBKEE


    回版大
    這些做法都是我用C#所學的觀念去弄得 所以在相容性下很多問題所以我才越寫越崩潰=  ="
    我最終目標是用"工作表2"的資料對到"TR產出"的機台邊碼上每第一列資料,去做"Package ""Bodysize"數量由大至小,可以秀出在清單方塊上
      [attach]25622[/attach]
     點選其一內容可以貼到篩選條件的下一排,
      [attach]25623[/attach]
     顯示在ListBox上會有8筆資料貼上只需其中四筆
      ps:有想過很多方法去做, 可是都卡到每一個機台編號對應的第一排篩選東西可能不同,所以才用陣列去試試看
          但爬文中又有看到物件類別模組好像能實現,只是好像似乎變成要每個機台編號都設置按鈕
           版大有較好的想法或作法嗎~"~
作者: GBKEE    時間: 2016-10-24 19:54

回復 36# starbox520

看到最後這圖片,才明瞭你在說什麼.

試試看 按我的程式碼
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Rng As Range
  4.     Set Rng = Sheets("TR排機&產出").Range("E4")
  5.     Application.ScreenUpdating = False
  6.     Do While Rng <> ""
  7.         Ex_AutoFilter Rng              '呼叫 程式
  8.         Set Rng = Rng.Offset(5)
  9.     Loop
  10.     Application.ScreenUpdating = True
  11. End Sub
  12. Sub Ex_AutoFilter(Rng As Range)
  13.     Dim xRng(1 To 2) As Range
  14.     With Sheets("工作表2")
  15.         Set xRng(1) = .Range("a1").CurrentRegion
  16.         xRng(1).AutoFilter
  17.         Set xRng(2) = Cells(1, Columns.Count - xRng(1).Columns.Count)
  18.     End With
  19.      With xRng(1)
  20.         '**'自動篩選  **
  21.         .AutoFilter Field:=1, Criteria1:=Rng             '第一個欄位 , 篩選準則=Rng
  22.         .AutoFilter Field:=2, Criteria1:=Rng(1, 2)    '第二個欄位 , 篩選準則=Rng(1, 2)
  23.         '**'自動篩選  **
  24.         .Copy xRng(2)
  25.        End With
  26.        Rng(2).Resize(4, 4) = xRng(2).CurrentRegion.Range("A2:D5").Value
  27. End Sub
複製代碼

作者: starbox520    時間: 2016-10-24 21:08

回復 37# GBKEE


    回版大篩的確實是我要的結果,
    是希望透過人工去LISTBOX點選的方法去貼在第2格
    ( 會有 customer   package  bodysize  lc  bk  vm  tr   數量   ) <-8 筆資料
     因為是我人工去選出來的所以我只有秀大概五筆
    [attach]25626[/attach]
     因為每次使用時 每個機台編號  只會取其中一項貼上去而已像我這樣
     [attach]25627[/attach]
     因為使用時不一定會要第一筆資料,要以人工去判斷  lc  bk  vm  tr   的數量   
     再以人工決定要點選一項貼上去
     所以我才會有後者所說是否要很多個按鈕的問題QQ
     又讓版大誤會我一點意思了...
作者: GBKEE    時間: 2016-10-25 10:23

本帖最後由 GBKEE 於 2016-10-25 10:28 編輯

回復 38# starbox520
不用很多個按鈕也不要用按鈕
TR排機&產出上,滑鼠移到E欄上的所指定的Customer,秀出表單

TR排機&產出模組的程式碼
  1. Public Sh_Rng As Range, Sh_Ar
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  4.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 5 Then
  5.         Set Sh_Rng = Cells(Target(1).Row, "E")
  6.         Ex_Customer_Package
  7.         If IsEmpty(Sh_Ar) Then MsgBox Sh_Rng & "-" & Sh_Rng(1, 2) & vbLf & "找不到": Exit Sub
  8.         Unload frmSelector
  9.         frmSelector.Show False
  10.     Else
  11.         Unload frmSelector
  12.     End If
  13. End Sub
  14. Private Sub Ex_Customer_Package()
  15.     Dim  i As Integer, ii As Integer, Ar
  16.     Sh_Ar = Ar:    i = 2
  17.     With Sheets("工作表2")
  18.         Do While .Cells(i, 1) <> ""
  19.             If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  20.             If IsEmpty(Ar) Then ReDim Ar(1 To 8, 1 To 1) Else ReDim Preserve Ar(1 To 8, 1 To UBound(Ar, 2) + 1)
  21.                 For ii = 1 To 8
  22.                 Ar(ii, UBound(Ar, 2)) = .Cells(i, ii).Text
  23.                 Next
  24.             End If
  25.             i = i + 1
  26.         Loop
  27.     End With
  28.     If IsEmpty(Ar) Then Exit Sub
  29.     Sh_Ar = Application.Transpose(Ar)
  30. End Sub
複製代碼
frmSelector表單模阻的程式碼
  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     StartupPosition = 0
  4.     Top = 0
  5.     Left = Windows(1).Width - Width
  6.     lstSelector_設定
  7. End Sub
  8. Private Sub lstSelector_設定()
  9.     With lstSelector
  10.         .ColumnCount = 8
  11.         .MultiSelect = 1            ' MultiSelect 屬性  指定物件是否接受多重選取。
  12.        If Not IsEmpty(Sheets("TR排機&產出").Sh_Ar) Then .List = Sheets("TR排機&產出").Sh_Ar
  13.     End With
  14. End Sub
  15. Private Sub CommandButton1_Click()
  16.     Dim AA, i As Integer, ii As Integer
  17.     With lstSelector
  18.         For i = 0 To .ListCount - 1
  19.             If .Selected(i) Then
  20.                 If IsEmpty(AA) Then ReDim AA(1 To 4, 1 To 1) Else ReDim Preserve AA(1 To 4, 1 To UBound(AA, 2) + 1)
  21.                 For ii = 1 To 4
  22.                     AA(ii, UBound(AA, 2)) = .List(i, ii - 1)
  23.                 Next
  24.             End If
  25.         Next
  26.     End With
  27.     If IsEmpty(AA) Then
  28.         MsgBox "你沒有選取資料"
  29.     ElseIf UBound(AA, 2) > 4 Then
  30.         MsgBox "你選取 超過 4 筆 資料"
  31.     Else
  32.         If MsgBox("共 選取 " & UBound(AA, 2) & " 筆資料" & vbLf & "確定輸入", vbYesNo) = vbYes Then
  33.             With Sheets("TR排機&產出").Sh_Rng.Offset(1)
  34.                 .Resize(4, 4) = ""
  35.                 .Resize(UBound(AA, 2), UBound(AA)) = Application.Transpose(AA)
  36.             End With
  37.         End If
  38.     End If
  39. End Sub
複製代碼

作者: starbox520    時間: 2016-10-25 13:49

回復 39# GBKEE


    [attach]25636[/attach]
    版大可以放檔案上來嗎
    我怎麼輸入程式碼進去都沒有反應
     按F5一直跑錯誤耶= = "
作者: GBKEE    時間: 2016-10-25 15:02

回復 40# starbox520
TR排機&產出模組的程式碼



   [attach]25637[/attach]
作者: starbox520    時間: 2016-10-25 15:40

回復 41# GBKEE


    可以了!!!!G大真是學海無崖....這些東西我找了好幾個禮拜都無從下手....
    這個方法我完全沒想到過...
    只是ListBox裡的資料前面篩選完後 要怎麼把剩下的資料(工作表2)放在後面呢(反百的部分可以只能反白一筆 ,不要這麼多筆嗎)
    因為下面那個ListBox2我要做未加總前的資料(要從WIP去找)可能會用到上面ListBox反白後就可以直接顯示在下面ListBox
    工作表2的東西是我從WIP那邊寫過來的
    ListBox2的資料要對應ListBox1反白後Customer  .  Package  .BodySize .  LC  (從WIP去找這4個相同的)
    然後呈現"Customer"  ."Location"   ."Device Type"   ."Package".   "BodySize".   "LC".   "QTY"  ."T/Y"  ."Schedule"  .  "Oven OutTime"
    這算是最終目的了
作者: GBKEE    時間: 2016-10-26 06:48

回復 42# starbox520
你的說明沒有很瞭解.
frmSelector模組,修改一下試試看
  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     StartupPosition = 0
  4.     Top = 0
  5.     Left = Windows(1).Width - Width
  6.     lstSelector_設定
  7. End Sub
  8. Private Sub lstSelector_設定()
  9.     With lstSelector
  10.         '**反百的部分可以只能反白一筆 ,不要這麼多筆嗎
  11.       ' **取消     .MultiSelect = 1            *** MultiSelect 屬性  指定物件是否接受多重選取。
  12.        If Not IsEmpty(Sheets("TR排機&產出").Sh_Ar) Then .List = Sheets("TR排機&產出").Sh_Ar
  13.     End With
  14.     With ListBox1  '**frmSelector中的第二個ListBox 控制項
  15.         .ColumnCount = 9
  16.         .ColumnWidths = "60,35,75,40,30,60,30,70,30"
  17.     End With
  18. End Sub
  19. Private Sub lstSelector_Change()
  20.     If lstSelector.ListIndex > -1 Then Ex_WIP
  21. End Sub
  22. Private Sub Ex_WIP()
  23.     Dim i As Integer, Ar, A(1 To 4), Ab(), ii As Integer
  24.        With Me.lstSelector
  25.             For i = 0 To 3
  26.                 A(i + 1) = .List(.ListIndex, i)
  27.             Next
  28.        End With
  29.        i = 2
  30.     With Sheets("WIP")
  31.         Do While .Cells(i, 1) <> ""
  32.             If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  33.                 If IsEmpty(Ar) Then ReDim Ar(1 To 1) Else ReDim Preserve Ar(1 To UBound(Ar) + 1)
  34.                 ReDim Ab(1 To 1, 1 To 9)
  35.                 For ii = 1 To 8
  36.                    Ab(1, ii) = .Cells(i, ii + 1) ' 8欄資料: B欄- I欄
  37.                Next
  38.                Ab(1, 9) = .Cells(i, "K") 'K欄
  39.                Ar(UBound(Ar)) = Ab
  40.                  '** Listbox 最多顯示 9列
  41.             End If
  42.             i = i + 1
  43.         Loop
  44.     End With
  45.     '***********************************
  46.     '**frmSelector中的第二個ListBox 控制項
  47.     With ListBox1
  48.         .Clear
  49.         If UBound(Ar) > 1 Then
  50.              .List = Application.Transpose(Application.Transpose(Ar))
  51.         ElseIf UBound(Ar) = 1 Then
  52.             .List = Ar(1)
  53.         End If
  54.     End With
  55.     '***********************************
  56. End Sub
複製代碼

作者: starbox520    時間: 2016-10-26 14:47

回復 43# GBKEE


回版大
出現偵錯錯誤...
[attach]25648[/attach][attach]25649[/attach]

1.  第一個ListBox應該是列出相近的後,剩餘的資料再以工作表2"數量"大小顯示
[attach]25650[/attach]

2.第二個ListBox呈現方法是,點其中一項,會出現從"WIP"資料裡的抓出紅筆圈選對應相同的資料
ListBox2  會像以下圖示(會抓取WIP資料   10個欄位的資料)
[attach]25651[/attach]
作者: GBKEE    時間: 2016-10-26 19:30

回復 44# starbox520
2003版 沒有錯誤

[attach]25652[/attach]
作者: starbox520    時間: 2016-10-26 20:50

本帖最後由 starbox520 於 2016-10-26 20:51 編輯

回復 45# GBKEE
  1. Option Explicit
  2. Private Sub UserForm_Initialize()
  3.     StartupPosition = 0
  4.     Top = 0
  5.     Left = Windows(1).Width - Width
  6.     lstSelector_設定
  7. End Sub
  8. Private Sub lstSelector_設定()
  9. With lstSelector
  10.         '**反百的部分可以只能反白一筆 ,不要這麼多筆嗎
  11.       ' **取消     .MultiSelect = 1            *** MultiSelect 屬性  指定物件是否接受多重選取。
  12.        If Not IsEmpty(Sheets("TR排機&產出").Sh_Ar) Then .List = Sheets("TR排機&產出").Sh_Ar
  13.     End With
  14.     With ListBox1  '**frmSelector中的第二個ListBox 控制項
  15.         .ColumnCount = 9
  16.         .ColumnWidths = "60,35,75,40,30,60,30,70,30"
  17.     End With
  18. End Sub
  19. Private Sub lstSelector_Change()
  20.     If lstSelector.ListIndex > -1 Then Ex_WIP
  21. End Sub
  22. Private Sub Ex_WIP()
  23.     Dim i As Integer, Ar, A(1 To 4), Ab(), ii As Integer
  24.        With Me.lstSelector
  25.             For i = 0 To 3
  26.                 A(i + 1) = .List(.ListIndex, i)
  27.             Next
  28.        End With
  29.        i = 2
  30.     With Sheets("WIP")
  31.         Do While .Cells(i, 1) <> ""
  32.             If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  33.                 If IsEmpty(Ar) Then ReDim Ar(1 To 1) Else ReDim Preserve Ar(1 To UBound(Ar) + 1)
  34.                 ReDim Ab(1 To 1, 1 To 9)
  35.                 For ii = 1 To 8
  36.                    Ab(1, ii) = .Cells(i, ii + 1) ' 8欄資料: B欄- I欄
  37.                Next
  38.                Ab(1, 9) = .Cells(i, "K") 'K欄
  39.                Ar(UBound(Ar)) = Ab
  40.                  '** Listbox 最多顯示 9列
  41.             End If
  42.             i = i + 1
  43.         Loop
  44.     End With
  45. With ListBox1
  46.         .Clear
  47.         If UBound(Ar) > 1 Then
  48.              .List = Application.Transpose(Application.Transpose(Ar))
  49.         ElseIf UBound(Ar) = 1 Then
  50.             .List = Ar(1)
  51.         End If
  52.     End With
  53.     '***********************************
  54. End Sub
  55. Private Sub CommandButton1_Click()
  56.     Dim AA, i As Integer, ii As Integer
  57.     With lstSelector
  58.         For i = 0 To .ListCount - 1
  59.             If .Selected(i) Then
  60.                 If IsEmpty(AA) Then ReDim AA(1 To 4, 1 To 1) Else ReDim Preserve AA(1 To 4, 1 To UBound(AA, 2) + 1)
  61.                 For ii = 1 To 4
  62.                     AA(ii, UBound(AA, 2)) = .List(i, ii - 1)
  63.                 Next
  64.             End If
  65.         Next
  66.     End With
  67.     If IsEmpty(AA) Then
  68.         MsgBox "你沒有選取資料"
  69.     ElseIf UBound(AA, 2) > 4 Then
  70.         MsgBox "你選取 超過 4 筆 資料"
  71.     Else
  72.         If MsgBox("共 選取 " & UBound(AA, 2) & " 筆資料" & vbLf & "確定輸入", vbYesNo) = vbYes Then
  73.             With Sheets("TR排機&產出").Sh_Rng.Offset(1)
  74.                 .Resize(4, 4) = ""
  75.                 .Resize(UBound(AA, 2), UBound(AA)) = Application.Transpose(AA)
  76.             End With
  77.         End If
  78.     End If
  79. End Sub
複製代碼
哪裡錯了呢= =他一直說型態不符... 我是2010的應該跟2003相通呀....
一直顯示Ar的參數型態有問題

第一個ListBox應該是列出相近的後,剩餘的資料再以工作表2"數量"大小顯示
這個可以列入嗎
[attach]25653[/attach]
作者: GBKEE    時間: 2016-10-27 05:15

本帖最後由 GBKEE 於 2016-10-27 05:17 編輯

回復 46# starbox520
  1.   c_c_lai 提供 高於2003版
  2.             '  Sheets("WIP").Cells(i, "F").Value : 950 : Variant/Double : A(4) : "950" : Variant/String
  3.             ' If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  4.             If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And CStr(.Cells(i, "F")) = A(4) Then
複製代碼
如再不行請附檔

第一個ListBox應該是列出相近的後,剩餘的資料再以工作表2"數量"大小顯示
顯示在哪裡!

不了解的是 附圖的表一或表二 邏輯如何定的

[attach]25657[/attach]
作者: c_c_lai    時間: 2016-10-27 09:45

本帖最後由 c_c_lai 於 2016-10-27 09:56 編輯

回復 46# starbox520
一般在使用 Sheets("WIP").Cells(i, "F")  時,我們均確信
Sheets("WIP").Cells(i, "F") 會傳回值 950 (舉例假設),同時
A(4) 值亦是  950 (舉例假設)。
經觀察 Sheets("WIP") 的 F 欄內存放值均為 數值型態 (Double),
當你將兩者做對等的比對時便會產生不等值,便視為 "兩者" 間條件不符合 (不成立)
(一個為字串型態、另一個為雙精準 [比對時它不會自動轉換為字串型態]) 而跳過不處理。
結果,接下來當你欲將前面經 "比對運作" 產生的 Ar 變數拿來運用時,
因之前所有比對均無一條件成立,Ar 內容值當然為空值 (Empty),
是故當拿它要 Assign 值給 .List 時,便產生了你看到的畫面結局了。
  1. If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
複製代碼
修改成
  1. If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And CStr(.Cells(i, "F")) = A(4) Then
複製代碼
便 OK 了。
作者: GBKEE    時間: 2016-10-27 13:50

本帖最後由 GBKEE 於 2016-10-27 13:53 編輯

回復 48# c_c_lai
2003版沒這問題



    [attach]25662[/attach]


PS:TR排機&產出模組
修正
  1. Private Sub Ex_Customer_Package()
  2.     Dim i As Integer, ii As Integer, Ar
  3.     Sh_Ar = Ar:    i = 2
  4.     With Sheets("工作表2")
  5.         Do While .Cells(i, 1) <> ""
  6.             If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  7.             If IsEmpty(Ar) Then ReDim Ar(1 To 1) Else ReDim Preserve Ar(1 To UBound(Ar) + 1)
  8.             Ar(UBound(Ar)) = .Cells(i, 1).Resize(, 4)
  9.             End If
  10.             i = i + 1
  11.         Loop
  12.     End With
  13.     If IsEmpty(Ar) Then Exit Sub
  14.     If UBound(Ar) = 1 Then
  15.         Sh_Ar = Ar(1)
  16.         Else
  17.     Sh_Ar = Application.Transpose(Application.Transpose(Ar))
  18.     End If
  19. End Sub
複製代碼

作者: starbox520    時間: 2016-10-27 16:58

回復 48# c_c_lai


    回CC大
    修改後問題還是存在...
    [attach]25663[/attach]
作者: starbox520    時間: 2016-10-27 17:54

回復 49# GBKEE


   1 回版大
    一開始的是對的  
    您修改後的反而不對了~
    [attach]25664[/attach]
     此圖的意思是,EX:上面的前五項資料 就是符合 "TR排機&產出" 第一行的資訊所篩選出來的
     相對的這些資料是從工作表2篩出來的,下面的資訊是工作表2排除那5筆剩下的資料,工作表2的數量已經從大至小排好了
     就由數量大到小呈現就可以了
   

    [attach]25665[/attach]
   
    這張圖是版大地2個ListBox ,確實是要呈現這樣的資訊
    只是好像少了幾項內容
    [attach]25666[/attach]
    會有這10攔的內容

    因為我目前還卡在型態偵測錯誤這階段
    所以我也看不出版大地2個ListBox呈現的資料是不是這些...
   
    PS:   第一個ListBox的這兩筆資訊可以對調位置嗎,貼上去的部分也剛好顛倒了
    [attach]25667[/attach]


   [attach]25668[/attach]
作者: GBKEE    時間: 2016-10-27 19:24

回復 51# starbox520

EX:上面的前五項資料 就是符合 "TR排機&產出" 第一行的資訊所篩選出來的,  請用圖示標出哪一行
會有這10攔的內容:2003版ListBox只能顯示9欄
  1.   
  2. '44# 所說出現偵錯錯誤...
  3. ' If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  4.             If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And CStr(.Cells(i, "F")) = A(4) Then
複製代碼
[attach]25669[/attach]

第一個ListBox的這兩筆資訊可以對調位置嗎,貼上去的部分也剛好顛倒了
看圖示 是哪裡調位置
作者: starbox520    時間: 2016-10-27 22:39

回復 52# GBKEE


     可以了...原來是我放錯地方
     C大的方法是可行的~~~~~!!!!
     原始的工作表2我也修正好了!!!!
     原來這個關係是從我這邊出了問題....
   
      剩下的ListBox1   剩下的資料有辦法在加數量由大至小上去嗎
      #49(1)   所說的
     
     第2個LIstBox可以改成這9攔嗎
     [attach]25670[/attach]


     附上我也修改好的   [attach]25671[/attach]
作者: starbox520    時間: 2016-10-27 22:47

回復 52# GBKEE


      系統顯示編輯時間超過了
      第2個LIstBox可以改成這9攔嗎   ( T/Y改成customer)     時間的資料大大您取到B欄"Queue Time"應該是P欄"Oven OutTime"
       Customer       Location       Device     Package      BodySize     LC        QTY        Schedule       Oven OutTime
作者: GBKEE    時間: 2016-10-28 05:18

本帖最後由 GBKEE 於 2016-10-28 05:22 編輯

回復 54# starbox520

[attach]25672[/attach]

圖表是工作表2上的資料,你要說清楚依據哪裡抓出來.


51#上說; 此圖的意思是,EX:上面的前五項資料 就是符合 "TR排機&產出" 第一行的資訊所篩選出來的
     相對的這些資料是從工作表2篩出來的,下面的資訊是工作表2排除那5筆剩下的資料,工作表2的數量已經從大至小排好了
     就由數量大到小呈現就可以了
  是排在工作表2上嗎

"TR排機&產出" 第一行的資訊 ,沒辦法抓圖示這前五項資料

49# 上PS:TR排機&產出模組 有修正,請修正你的檔案

修正後這段程式碼是正確的
  1. If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
複製代碼
無須改成
  1. If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And CStr(.Cells(i, "F")) = A(4) Then
複製代碼
第2個LIstBox可以改成這9攔嗎   ( T/Y改成customer)     時間的資料大大您取到B欄"Queue Time"應該是P欄"Oven OutTime"
       Customer       Location       Device     Package      BodySize     LC        QTY        Schedule       Oven OutTime
這裡修改試試看
  1. Private Sub Ex_WIP()
  2. Dim i As Integer, Ar, A(1 To 4), Ab(), ii As Integer
  3. With Me.lstSelector
  4. For i = 0 To 3
  5. A(i + 1) = .List(.ListIndex, i)
  6. Next
  7. End With
  8. i = 2
  9. With Sheets("WIP")
  10. Do While .Cells(i, 1) <> ""
  11. If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  12. If IsEmpty(Ar) Then ReDim Ar(1 To 1) Else ReDim Preserve Ar(1 To UBound(Ar) + 1)
  13. '** 要重排欄位請改這裡 ** Customer Location Device Package 'BodySize
  14. Ar(UBound(Ar)) = Array(.Cells(i, "A").Text, .Cells(i, "C").Text, .Cells(i, "D").Text, .Cells(i, "E").Text, _
  15. .Cells(i, "G").Text, .Cells(i, "F").Text, .Cells(i, "K").Text, .Cells(i, "I").Text, .Cells(i, "P").Text)
  16. '** BodySize LC QTY Schedule Oven OutTime
  17. '** Listbox 最多顯示 9列
  18. End If
  19. i = i + 1
  20. Loop
  21. End With
  22. '***********************************
  23. '**frmSelector中的第二個ListBox 控制項
  24. With ListBox1
  25. .Clear
  26. If UBound(Ar) > 1 Then
  27. .List = Application.Transpose(Application.Transpose(Ar))
  28. ElseIf UBound(Ar) = 1 Then
  29. .List = Ar(1)
  30. End If
  31. End With
  32. '***********************************
  33. End Sub
複製代碼

作者: starbox520    時間: 2016-10-28 09:12

回復 55# GBKEE

         [attach]25677[/attach]
    回版大  我可能放在工作表2讓版大混淆這兩個資訊的關係
    這兩個資訊是完全沒有關係的....
   
    您目前第一個ListBox的資訊是對的,(是依據"工作表2"的Package.BodySize.LC  對應至"TR排機&產出")
    您呈現出來的資料是對的
    我後來解釋給版大的這張圖
    第一步.........是循問版大如果依條件篩選完後,呈現出來的這幾筆資料顯示在第一個ListBox
    這幾筆資料是從工作表2去比對"TR排機&產出"
   
     第二步........... 下面那些資訊和"TR排機&產出"完全沒關係
     只是要把工作表2在"第一步"篩完剩下的資訊   
     以Package.BodySize相同,數量由大致小做排列
        [attach]25678[/attach]
     再把結果接著放在
     第一個ListBox"第一步"做好的資訊下接著呈現  (下方資訊應不該再出現"第一步"的資訊)
作者: starbox520    時間: 2016-10-29 01:25

回復 56# starbox520


    回版大 我後來有自己排出來了!!!!
    讓您頭痛了XDDD.....
    請問為什麼顯示一筆資料的時候會這樣呢
    [attach]25682[/attach]

    [attach]25683[/attach]
  1. Private Sub lstSelector_設定()
  2.     With lstSelector
  3.              ' **取消     .MultiSelect = 1            *** MultiSelect 屬性  指定物件是否接受多重選取。
  4.        If Not IsEmpty(Sheets("TR排機&產出").Sh_Ar) Then .List = Sheets("TR排機&產出").Sh_Ar
  5.     End With
  6.     With ListBox1  '**frmSelector中的第二個ListBox 控制項
  7.         .ColumnCount = 9
  8.         .ColumnWidths = "60,35,75,40,30,60,30,70,30"
  9.    
  10.     End With
  11. End Sub
  12. Private Sub lstSelector_Change()
  13.     If lstSelector.ListIndex > -1 Then Ex_WIP
  14. End Sub
  15. Private Sub Ex_WIP()
  16.     Dim i As Integer, Ar, A(1 To 4), Ab(), ii As Integer
  17.        With Me.lstSelector
  18.             For i = 0 To 3
  19.                 A(i + 1) = .List(.ListIndex, i)
  20.             Next
  21.        End With
  22.        i = 2
  23.     With Sheets("WIP")
  24.         Do While .Cells(i, 1) <> ""
  25.           '  If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And .Cells(i, "F") = A(4) Then
  26.             If .Cells(i, "A") = A(1) And .Cells(i, "E") = A(2) And .Cells(i, "G") = A(3) And CStr(.Cells(i, "F")) = A(4) Then
  27.                
  28.                 If IsEmpty(Ar) Then ReDim Ar(1 To 1) Else ReDim Preserve Ar(1 To UBound(Ar) + 1)
  29.          '顯示我要的資料
  30.          Ar(UBound(Ar)) = Array(.Cells(i, "A").Text, .Cells(i, "C").Text, .Cells(i, "D").Text, .Cells(i, "E").Text, .Cells(i, "G").Text, .Cells(i, "F").Text, .Cells(i, "K").Text, .Cells(i, "I").Text, .Cells(i, "P").Text) 'K欄
  31.          
  32.          
  33.                  '** Listbox 最多顯示 9列
  34.             End If
  35.             i = i + 1
  36.         Loop
  37.     End With
  38.     '***********************************
  39.     '**frmSelector中的第二個ListBox 控制項
  40.     With ListBox1
  41.         .Clear
  42.         If UBound(Ar) > 1 Then
  43.              .List = Application.Transpose(Application.Transpose(Ar))
  44.         ElseIf UBound(Ar) = 1 Then
  45.             .List = Ar(1)
  46.         End If
  47.     End With
  48.     '***********************************
  49. End Sub


  50. '******************************
  51. Public Sh_Rng As Range, Sh_Ar
  52. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  53.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  54.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 5 Then
  55.         Set Sh_Rng = Cells(Target(1).Row, "E")
  56.         Ex_Customer_Package
  57.         If IsEmpty(Sh_Ar) Then MsgBox Sh_Rng & "-" & Sh_Rng(1, 2) & vbLf & "找不到": Exit Sub
  58.         Unload frmSelector
  59.         frmSelector.Show False
  60.     Else
  61.         Unload frmSelector
  62.     End If
  63. End Sub
  64. Private Sub Ex_Customer_Package()


  65.     Dim i As Integer, ii As Integer, Ar
  66.     Sh_Ar = Ar:    i = 2
  67.     With Sheets("工作表2")
  68.         Do While .Cells(i, 1) <> ""
  69.             If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  70.             If IsEmpty(Ar) Then ReDim Ar(1 To 8, 1 To 1) Else ReDim Preserve Ar(1 To 8, 1 To UBound(Ar, 2) + 1)
  71.                 For ii = 1 To 8
  72.                 Ar(ii, UBound(Ar, 2)) = .Cells(i, ii).Text
  73.                 Next
  74.             End If
  75.             i = i + 1
  76.         Loop
  77.     End With
  78.     If IsEmpty(Ar) Then Exit Sub
  79.     Sh_Ar = Application.Transpose(Ar)
  80. End Sub
複製代碼

作者: GBKEE    時間: 2016-10-29 07:16

回復 57# starbox520
再把結果接著放在     第一個ListBox"第一步"做好的資訊下接著呈現  (下方資訊應不該再出現"第一步"的資訊)
修改這裡
  1. Private Sub Ex_Customer_Package()
  2.     Dim i As Integer, ii As Integer, Ar, xRng As Range, xi As Integer
  3.     Sh_Ar = "":   i = 2
  4.     With Sheets("工作表2")
  5.         '只是要把工作表2在"第一步"篩完剩下的資訊 以Package.BodySize相同,數量由大致小做排列 ** 要先做排序
  6.         .UsedRange.Sort Key1:=.Cells(1, "H"), Order1:=2, Key2:=.Cells(1, "B"), Order2:=1, Key3:=.Cells(1, "B"), Order3:=1, Header:=True
  7.         '******************************************************************************
  8.         Do While .Cells(i, 1) <> ""
  9.             If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  10.                 xi = xi + 1
  11.                 If xRng Is Nothing Then
  12.                     Set xRng = .Cells(i, 1).Resize(, 8)
  13.                 Else
  14.                     Set xRng = Union(.Cells(i, 1).Resize(, 8), xRng)
  15.                 End If
  16.               End If
  17.             i = i + 1
  18.         Loop
  19.         If xRng Is Nothing Then Exit Sub
  20.         .Range("A2").Resize(xi).EntireRow.Insert
  21.         xRng.Copy .Range("A2")
  22.         xRng.EntireRow.Delete
  23.          Sh_Ar = .Range("A2", .Range("A2").End(xlDown)).Resize(, 4)  ' Resize(, 4) 'A欄-D欄  ' Resize(, 8) 'A欄-H欄
  24.     End With
  25. End Sub
複製代碼
請問為什麼顯示一筆資料的時候會這樣呢
修改 Private Sub Ex_WIP()
  1. '***********************************
  2.     '**frmSelector中的第二個ListBox 控制項
  3.     With ListBox1
  4.         .Clear
  5.         If UBound(Ar) > 1 Then
  6.              .List = Application.Transpose(Application.Transpose(Ar))
  7.         ElseIf UBound(Ar) = 1 Then
  8.             ReDim AB(0, 8)
  9.             For i = 0 To 8
  10.                 AB(0, i) = Ar(1)(i)
  11.             Next
  12.            .List = AB
  13.         End If
  14.     End With
  15.     '***********************************
複製代碼

作者: c_c_lai    時間: 2016-10-29 09:05

本帖最後由 c_c_lai 於 2016-10-29 09:10 編輯

回復 57# starbox520
參照
"輸入資料比對資料表 轉換到別的資料表 #12"
的修正。
  1.     '******   By GBKEE  ******
  2.     '**frmSelector中的第二個ListBox 控制項
  3.     With ListBox1
  4.         .Clear
  5.         If UBound(Ar) > 1 Then
  6.              .List = Application.Transpose(Application.Transpose(Ar))
  7.         ElseIf UBound(Ar) = 1 Then
  8.             .AddItem
  9.             For i = 0 To UBound(Ar(1))
  10.                 .List(0, i) = Ar(1)(i)
  11.             Next i
  12.         End If
  13.     End With
  14.     '***********************************
複製代碼

作者: starbox520    時間: 2016-10-29 12:17

回復 59# c_c_lai
  1. Public Sh_Rng As Range, Sh_Ar
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.    
  4.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  5.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 5 Then
  6.         
  7.         Set Sh_Rng = Cells(Target(1).Row, "E")
  8.         Ex_Customer_Package
  9.         
  10.         If IsEmpty(Sh_Ar) Then MsgBox Sh_Rng & "-" & Sh_Rng(1, 2) & vbLf & "找不到": Exit Sub
  11.         Unload frmSelector
  12.         frmSelector.Show False
  13.     Else
  14.         Unload frmSelector
  15.     End If
  16. End Sub
  17. Private Sub Ex_Customer_Package()

  18.     Dim i As Integer, ii As Integer, Ar
  19.     Sh_Ar = Ar:    i = 2
  20.    
  21.     With Sheets("工作表2")
  22.         Do While .Cells(i, 1) <> ""
  23.             If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  24.             
  25.             If IsEmpty(Ar) Then ReDim Ar(1 To 8, 1 To 1) Else ReDim Preserve Ar(1 To 8, 1 To UBound(Ar, 2) + 1)
  26.                 For ii = 1 To 8
  27.                 Ar(ii, UBound(Ar, 2)) = .Cells(i, ii).Text
  28.                 Next
  29.             End If
  30.             i = i + 1
  31.         
  32.         Loop
  33.     End With
  34.    
  35.     If IsEmpty(Ar) Then Exit Sub
  36.     Sh_Ar = Application.Transpose(Ar)
  37.    
  38. End Sub
複製代碼
這是第一個listbox
   也是出現一樣的情形
   像這情況要怎麼做修改呢
作者: starbox520    時間: 2016-10-29 12:18

回復 58# GBKEE


    謝謝版大給我這麼多資訊...
    讓我知道從中該修改什麼
    真的很謝謝你><""
作者: starbox520    時間: 2016-10-29 15:32

回復 59# c_c_lai


    附上檔案給您
    第一個listbox也有此問題
    [attach]25684[/attach]

[attach]25685[/attach]
作者: c_c_lai    時間: 2016-10-29 16:03

本帖最後由 c_c_lai 於 2016-10-29 16:39 編輯

回復 60# starbox520
  1. Private Sub lstSelector_設定()
  2.     Dim i As Integer, Arr()
  3.    
  4.     With lstSelector             '  ** frmSelector 中的 第一個 ListBox 控制項
  5.         .Clear
  6.         i = 0
  7.         '**反百的部分可以只能反白一筆 ,不要這麼多筆嗎
  8.         ' **取消     .MultiSelect = 1            *** MultiSelect 屬性  指定物件是否接受多重選取。
  9.         Arr = Sheets("TR排機&產出").Sh_Ar
  10.         If Not IsEmpty(Arr) Then
  11.             On Error Resume Next
  12.             i = UBound(Arr, 2)
  13.             If i > 0 Then
  14.                 .List = Arr
  15.             Else
  16.                 .AddItem
  17.                 For i = 0 To UBound(Arr)
  18.                     .List(0, i) = Arr(i + 1)
  19.                 Next i
  20.             End If
  21.         End If
  22.     End With
  23.     With ListBox1                '  ** frmSelector 中的 第二個 ListBox 控制項
  24.           .ColumnCount = 9
  25.           .ColumnWidths = "90,45,130,60,35,50,90,50,70"
  26.    End With
  27. End Sub
複製代碼

作者: c_c_lai    時間: 2016-10-29 16:41

回復 62# starbox520
[attach]25686[/attach]
作者: GBKEE    時間: 2016-10-30 05:54

回復 62# starbox520
55# 上我有說
49# 上PS:TR排機&產出模組 有修正,請修正你的檔案
  1. '  Ar(UBound(Ar)) = .Cells(i, 1).Resize(, 4) 修改
  2. Ar(UBound(Ar)) = .Cells(i, 1).Resize(, 8)
複製代碼

作者: starbox520    時間: 2016-10-30 15:31

回復 64# c_c_lai


    謝謝C大
    還在研究你們的邏輯~"~
作者: starbox520    時間: 2016-10-30 15:32

回復 65# GBKEE


     我還在研究你們的邏輯跟哪邊是在做什麼的
     用中斷點研究中...
     謝謝版大提醒XD
作者: starbox520    時間: 2016-11-1 08:55

回復 65# GBKEE
  1. Private Sub Ex_Customer_Package()


  2.     Dim i As Integer, ii As Integer, Ar
  3.     Sh_Ar = Ar:    i = 2
  4.     With Sheets("工作表2")
  5.         Do While .Cells(i, 1) <> ""
  6.             If .Cells(i, 2) = Sh_Rng And .Cells(i, 3) = Sh_Rng(1, 2) Then
  7.             
  8.             If IsEmpty(Ar) Then ReDim Ar(1 To 8, 1 To 1) Else ReDim Preserve Ar(1 To 8, 1 To UBound(Ar, 2) + 1)
  9.                 For ii = 1 To 8
  10.                 Ar(ii, UBound(Ar, 2)) = .Cells(i, ii).Text
  11.                 Next
  12.             End If
  13.             i = i + 1
  14.         Loop
  15.     End With
  16.     If IsEmpty(Ar) Then Exit Sub
  17.     Sh_Ar = Application.Transpose(Ar)
  18. End Sub
複製代碼
這段如果改成以Package    BodySize  要怎麼修改呢

目前大大應該是用Customer    Package   去篩
作者: GBKEE    時間: 2016-11-2 13:26

回復 68# starbox520
  1.   If .Cells(i, 2) = Sh_Rng And .Cells(i, 3) = Sh_Rng(1, 2) Then
複製代碼
改Target(1).Column = 5 為 Target(1).Column = 6
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  3.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 5 Then
複製代碼

作者: starbox520    時間: 2016-11-3 18:11

回復 69# GBKEE
  1. Public Sh_Rng As Range, Sh_Ar
  2. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  3.    
  4.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  5.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 6 Then
  6.         
  7.         Set Sh_Rng = Cells(Target(1).Row, "E")
  8.         Ex_Customer_Package
  9.         
  10.         If IsEmpty(Sh_Ar) Then MsgBox Sh_Rng & "-" & Sh_Rng(1, 2) & vbLf & "找不到": Exit Sub
  11.         Unload frmSelector
  12.         frmSelector.Show False
  13.     Else
  14.         Unload frmSelector
  15.     End If
  16. End Sub
  17. Private Sub Ex_Customer_Package()

  18.     Dim i As Integer, ii As Integer, Ar
  19.     Sh_Ar = Ar:    i = 2
  20.    
  21.     With Sheets("工作表2")
  22.         Do While .Cells(i, 1) <> ""
  23.            ' If .Cells(i, 1) = Sh_Rng And .Cells(i, 2) = Sh_Rng(1, 2) Then
  24.             If .Cells(i, 2) = Sh_Rng And .Cells(i, 3) = Sh_Rng(1, 2) Then
  25.             If IsEmpty(Ar) Then ReDim Ar(1 To 8, 1 To 1) Else ReDim Preserve Ar(1 To 8, 1 To UBound(Ar, 2) + 1)
  26.                 For ii = 1 To 8
  27.                 Ar(ii, UBound(Ar, 2)) = .Cells(i, ii).Text
  28.                 Next
  29.             End If
  30.             i = i + 1
  31.         
  32.         Loop
  33.     End With
  34.    
  35.     If IsEmpty(Ar) Then Exit Sub
  36.     Sh_Ar = Application.Transpose(Ar)
  37.    
  38. End Sub
複製代碼
回版大字串好像連在一起了  


[attach]25715[/attach]

[attach]25716[/attach]
作者: c_c_lai    時間: 2016-11-3 19:03

回復 70# starbox520
工作表單 "TR排機&產出":
Worksheet_SelectionChange() 以及
Ex_Customer_Package() 內改成備註
之處改回原來。
作者: starbox520    時間: 2016-11-3 21:43

回復 71# c_c_lai


    回大大  
    不懂您的意思= ="
    我是照#69  版大  所叫我修改的去改的
作者: c_c_lai    時間: 2016-11-4 05:59

本帖最後由 c_c_lai 於 2016-11-4 07:25 編輯

回復 72# starbox520
看了 #68 的說明,以及 #69 GBKEE 大大的回復,才知問題出在:
  1. Worksheet_SelectionChange():
  2.     If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 6 Then
  3.     (依照 GBKEE 大大 的修正指示)
複製代碼
  1. Ex_Customer_Package():
  2.     If .Cells(i, 2) = Sh_Rng And .Cells(i, 3) = Sh_Rng(1, 2) Then
  3.     (修改成)
  4.     If .Cells(i, 2) = Sh_Rng(1, 2) And .Cells(i, 3) = Sh_Rng(1, 3) Then
複製代碼
執行起來,一切看似 OK。
[attach]25720[/attach]   
接下來的執行,便又變回原樣了:
[attach]25721[/attach]
請參考之前的提示 (#63) 予以更新。
作者: GBKEE    時間: 2016-11-5 16:32

回復 70# starbox520
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)   
  2.     If IsError(Target(1)) Then Unload frmSelector:         Exit Sub
  3. '    If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 5 Then
  4.      If (Target(1).Row + 1) Mod 5 = 0 And Target(1) <> "" And Target(1).Column = 6 Then
  5.         'Set Sh_Rng = Cells(Target(1).Row, "E")
  6.         Set Sh_Rng = Cells(Target(1).Row, "F")  '**這裡也要改
  7.         Ex_Customer_Package
  8.         
  9.         If IsEmpty(Sh_Ar) Then MsgBox Sh_Rng & "-" & Sh_Rng(1, 2) & vbLf & "找不到": Exit Sub
  10.         Unload frmSelector
  11.         frmSelector.Show False
  12.     Else
  13.         Unload frmSelector
  14.     End If
  15. End Sub
複製代碼

作者: starbox520    時間: 2016-11-6 16:19

回復 74# GBKEE


    好的~謝謝C大跟版大
    我回去試試
    我老家沒電腦....哈哈
作者: starbox520    時間: 2016-11-8 08:34

  1. Private Sub CommandButton1_Click()
  2.     Dim AA, i As Integer, ii As Integer
  3.     With lstSelector
  4.         For i = 0 To .ListCount - 1
  5.             If .Selected(i) Then
  6.                 If IsEmpty(AA) Then ReDim AA(1 To 4, 1 To 1) Else ReDim Preserve AA(1 To 4, 1 To UBound(AA, 2) + 1)
  7.                 For ii = 1 To 4
  8.                     AA(ii, UBound(AA, 2)) = .List(i, ii - 1)
  9.                 Next
  10.             End If
  11.         Next
  12.     End With
  13.     If IsEmpty(AA) Then
  14.         MsgBox "你沒有選取資料"
  15.     ElseIf UBound(AA, 2) > 4 Then
  16.         MsgBox "你選取 超過 4 筆 資料"
  17.     Else
  18.         If MsgBox("共 選取 " & UBound(AA, 2) & " 筆資料" & vbLf & "確定輸入", vbYesNo) = vbYes Then
  19.             With Sheets("TR排機&產出").Sh_Rng.Offset(1)
  20.                 .Resize(4, 4) = ""
  21.                 .Resize(UBound(AA, 1), UBound(AA)) = Application.Transpose(AA)
  22.             End With
  23.         End If
  24.     End If
  25. End Sub
複製代碼
回復 74# GBKEE

結果換貼上這邊多往右邊移一格了...


[attach]25749[/attach]
作者: c_c_lai    時間: 2016-11-8 09:11

回復 76# starbox520
  1.             With Sheets("TR排機&產出").Sh_Rng.Offset(1)
複製代碼
改成
  1.             With Sheets("TR排機&產出").Sh_Rng.Offset(1, -1)
複製代碼

作者: jeffrey628litw    時間: 2017-3-20 09:45

本帖最後由 jeffrey628litw 於 2017-3-20 09:47 編輯

各位大大的功力真是太強了,看得眼花撩亂,整理到最後,給各位看看,應該是正確的了。

[attach]26827[/attach]

[attach]26826[/attach]
作者: starbox520    時間: 2017-3-21 14:30

回復 78# jeffrey628litw


    沒錯這隻程式用了很多前輩的精隨
   
    學到了很多東西




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