返回列表 上一主題 發帖

[發問] ★(發問)一個資料欄位不對稱的資料篩選問題

回復 1# yagami12th
  1. Option Explicit
  2. Sub Ex()
  3.     Dim E As Worksheet, i As Date, M As Variant, AR(), C As Variant
  4.     ReDim AR(1 To 5, 1 To 1)                               '第一維 有5個元素 ,第二維 有1個元素
  5.     AR(1, 1) = "日期"
  6.     AR(2, 1) = "買權 最大未倉量"
  7.     AR(3, 1) = "買權 最大未平倉量落在哪個履約價"
  8.     AR(4, 1) = "賣權 最大未倉量"
  9.     AR(5, 1) = "賣權 最大未平倉量落在哪個履約價-"
  10.     Application.ScreenUpdating = False
  11.     For Each E In Sheets                                     '工作表1,工作表2,工作表3
  12.        If E.FilterMode Then E.AutoFilterMode = False         '有篩選時 取消[篩選]
  13.         For i = E.[A2] To E.[A2].End(xlDown)                 '日期[A2]直到最後的日期
  14.             E.AutoFilterMode = False
  15.             E.Range("A1").AutoFilter 1, i
  16.             If E.Range("A1").End(xlDown).Row <> Rows.Count Then   '因中間有沒交易日期[篩選]不到資料
  17.                 ReDim Preserve AR(1 To 5, 1 To UBound(AR, 2) + 1) '第二維 原有元素再加1元素
  18.                 AR(1, UBound(AR, 2)) = i                          '日期: i
  19.                 For Each C In Array("買權", "賣權")
  20.                     E.AutoFilterMode = False
  21.                     E.Range("A1").AutoFilter 1, i
  22.                     E.Range("A1").AutoFilter 5, C
  23.                     M = Application.Max(E.Range("L:L").SpecialCells(xlCellTypeVisible))
  24.                     AR(IIf(C = "買權", 2, 4), UBound(AR, 2)) = M              '最大未倉量
  25.                       'IIf(C = "買權", 2, 4)     C = "買權"->2  ,C <> "買權"-> 4
  26.                     Set M = E.Range("L:L").SpecialCells(xlCellTypeVisible).Find(M, LookIn:=xlValues)
  27.                     AR(IIf(C = "買權", 3, 5), UBound(AR, 2)) = M.Offset(, -8) '最大未平倉量落在哪個履約價
  28.                 Next
  29.             End If
  30.         Next
  31.     Next
  32.     With Sheets.Add(Sheets(1))    '新增工作表
  33.         .[A1].Resize(UBound(AR, 2), UBound(AR)) = Application.WorksheetFunction.Transpose(AR)
  34.         .Cells.EntireColumn.AutoFit
  35.     End With
  36.     Application.ScreenUpdating = True
  37. End Sub
複製代碼

TOP

回復 3# yagami12th
出現執行階段錯誤 '16':  運算式太過複雜     當真如此
2003正常  請將你的上傳看看

TOP

回復 5# yagami12th
以下為附檔,code放在module1:
附檔沒有module1 也沒code
我2003 已更新可處裡2007檔案 並沒錯誤發生

TOP

本帖最後由 GBKEE 於 2012-1-5 21:42 編輯

回復 8# yagami12th
錯誤原因: 工作表3 第一列是空白列   請修正 為同其他工作表 是欄位名稱
圖片檔案太大??  按 (抓畫面鍵)  Print Screen Sys Rq   小畫家 編輯  (存 gif 檔案不會太大)

TOP

本帖最後由 GBKEE 於 2012-1-5 21:58 編輯

回復 11# yagami12th
For Each E In Sheets                                     '工作表1,工作表2,工作表3
       If E.FilterMode Then E.AutoFilterMode = False         '有篩選時 取消[篩選]
       Debug.Print E.Name                                '看錯誤是那一工作表
For i = E.[A2] To E.[A2].End(xlDown)                 '日期[A2]到 To E.[A2].End(xlDown) 必須是日期         
      E.AutoFilterMode = False


如圖 : 有錯誤時 打開 [ 即時運算 ] 視窗 查看是那一個工作表出錯


TOP

本帖最後由 GBKEE 於 2012-1-6 08:55 編輯

回復 13# yagami12th
7#檔案(須刪除工作表3 第一列) 測試 ok ,你試試看.  如不行試試 修改的程式碼
  1. Option Explicit
  2. Sub Ex()
  3.     Dim E As Worksheet, i As Date, M As Variant, AR(), C As Variant
  4.     ReDim AR(1 To 5, 1 To 1)                               '第一維 有5個元素 ,第二維 有1個元素
  5.     AR(1, 1) = "日期"
  6.     AR(2, 1) = "買權 最大未倉量"
  7.     AR(3, 1) = "買權 最大未平倉量落在哪個履約價"
  8.     AR(4, 1) = "賣權 最大未倉量"
  9.     AR(5, 1) = "賣權 最大未平倉量落在哪個履約價-"
  10.     Application.ScreenUpdating = False
  11.     For Each E In ActiveWorkbook.Sheets                     '作用中的活頁簿中的 工作表
  12.        If E.FilterMode Then E.AutoFilterMode = False         '有篩選時 取消[篩選]
  13.         For i = E.[a2] To E.[a2].End(xlDown)                 '日期[A2]直到最後的日期
  14.             E.AutoFilterMode = False
  15.             E.Range("A1").AutoFilter 1, i
  16.             If E.Range("A1").End(xlDown).Row <> Rows.Count Then   '因中間有沒交易日期[篩選]不到資料
  17.                 ReDim Preserve AR(1 To 5, 1 To UBound(AR, 2) + 1) '第二維 原有元素再加1元素
  18.                 AR(1, UBound(AR, 2)) = i                          '日期: i
  19.                 For Each C In Array("買權", "賣權")
  20.                     E.AutoFilterMode = False
  21.                     E.Range("A1").AutoFilter 1, i
  22.                     E.Range("A1").AutoFilter 5, C
  23.                     M = Application.Max(E.Range("L:L").SpecialCells(xlCellTypeVisible))
  24.                     AR(IIf(C = "買權", 2, 4), UBound(AR, 2)) = M              '最大未倉量
  25.                       'IIf(C = "買權", 2, 4)     C = "買權"->2  ,C <> "買權"-> 4
  26.                     Set M = E.Range("L:L").SpecialCells(xlCellTypeVisible).Find(M, LookIn:=xlValues)
  27.                     AR(IIf(C = "買權", 3, 5), UBound(AR, 2)) = M.Offset(, -8) '最大未平倉量落在哪個履約價
  28.                 Next
  29.             End If
  30.         Next
  31.     Next
  32.     Dim SaveName As String
  33.     With ActiveWorkbook            '作用中的活頁簿
  34.         SaveName = .Path & "\" & Format(.Sheets(1).[a2], "yyyy") & "年選擇權.xls" '存檔路徑名稱
  35.     End With
  36.     With Workbooks.Add(1).Sheets(1)    '新增活頁簿 [存放整理的資料]
  37.         .[A1].Resize(UBound(AR, 2), UBound(AR)) = Application.WorksheetFunction.Transpose(AR)
  38.         .Cells.EntireColumn.AutoFit
  39.         .Parent.SaveAs SaveName        '新增活頁簿存檔
  40.     End With
  41.     Application.ScreenUpdating = True

  42. End Sub
複製代碼

TOP

回復 15# yagami12th
MsgBox E.[a2]                          '加上看看是否有錯誤
MsgBox E.[a2].End(xlDown)   '加上看看是否有錯誤
For i = E.[a2] To E.[a2].End(xlDown)

TOP

回復 17# yagami12th
真是丈二金剛!!
Dim E As Worksheet, i As Date, M As Variant, AR(), C As Variant   刪掉試試看
成  Dim E As Worksheet, i , M As Variant, AR(), C As Variant
請再上傳你測試的檔案 看看

TOP

回復 19# yagami12th
下載 [執行後2011年近月選擇權.xlsm] 打開一看 工作表的畫面都是篩選不到資料  這不太對 (應是可顯示最後篩選到的 資料)  
*** E.[a2].End(xlDown) 是最後一個日期 (一定有資料) ****                  搞不清楚.
我重新執行 [執行後2011年近月選擇權.xlsm] 後 工作表的畫面都是留在顯示 篩選到最後 E.[a2].End(xlDown)的資料
我2003升級 到可運行 2007檔案而已,還是2003版本,可請有 2007 版的測試嘹解.

TOP

回復 22# yagami12th
你的檔案 2003版 不認識它啊!!!!! ( 可否存成2003版)

TOP

        靜思自在 : 知識要用心體會,才能變成自己的智慧。
返回列表 上一主題