返回列表 上一主題 發帖

[發問] 程序沒問題,答案郤有問題????

[發問] 程序沒問題,答案郤有問題????

程序跟來源沒問題,答案郤有問題???? Book2.zip (44.82 KB)

本帖最後由 luhpro 於 2014-10-28 23:38 編輯
程序跟來源沒問題,答案郤有問題????
t8899 發表於 2014-10-28 20:46

兩個癥結點:
1. Range 的 find 函數只能找到第 1 個符合條件的儲存格(假設為 a),
若要找第 2 個符合條件的儲存格則搜尋範圍要改成從 a 的下一格開始找起.

2. Find 函數要用  LookAt:=xlWhole(此非預設值) 才是找 "整個儲存格都符合條件" 的儲存格.
故程式改為:
Dim a, b, K, c
Set a = [a1]  ' 因底下 IIF 中  a.Offset(1) 此項會執行計算, 故須先定義 a 的初值,否則會有錯誤.
For K = 1 To 50
b = Application.Large(Range("g2:g857"), K)
If Not IsNumeric(b) Then GoTo 110
Set a = Range(IIf(c = b, a.Offset(1), Range("g2")), [g857]).Find(What:=b, LookIn:=xlValues, LookAt:=xlWhole)
...
c = b
End If
Next
...

TOP

兩個癥結點:
1. Range 的 find 函數只能找到第 1 個符合條件的儲存格(假設為 a),
若要找第 2 個符合條件 ...
luhpro 發表於 2014-10-28 23:36


Set a = Range(IIf(c = b, a.Offset(1), Range("g2")), [g857])
此處需要物件??

TOP

本帖最後由 GBKEE 於 2014-10-29 13:50 編輯

回復 3# t8899
Large函數 不是真的傳回數值資料中的第幾大
  1. Sub EX()
  2.     Dim AR, k
  3.     AR = Array(5, 5, 6, 6, 7, 7, 8)
  4.    ' AR = Array(5, 6, 7, 5, 6, 7, 8)
  5.     For k = 1 To UBound(AR) + 1
  6.     MsgBox "第 " & k & " 大 : " & Application.Large(AR, k)
  7.     Next
  8. End Sub
複製代碼
須修改一下
  1. Option Explicit
  2. Dim D As Object
  3. Private Sub CommandButton1_Click()
  4.     Range("K3:S" & Rows.Count).ClearContents
  5.     Dim a As Range, b As Long, k As Integer, aD As String
  6.     排序值 Range("g2:g857")
  7.     For k = 1 To IIf(D.Count >= 50, 50, D.Count)
  8.         b = Application.Large(D.KEYS, k)
  9.         Set a = Range("g2:g857").Find(What:=b, LookIn:=xlValues, lookat:=xlWhole)
  10.         If Not a Is Nothing Then aD = a.Address
  11.         Do While Not a Is Nothing
  12.             Range("K100").End(xlUp).Offset(1) = a.Offset(0, -6) '代號
  13.             Range("L100").End(xlUp).Offset(1) = a.Offset(0, -5) '名稱
  14.             Range("M100").End(xlUp).Offset(1) = a.Offset(0, 0) ' 張
  15.             Range("N100").End(xlUp).Offset(1) = a.Offset(0, -4) '價位
  16.             Set a = Range("g2:g857").FindNext(a)
  17.             If a.Address = aD Then Exit Do
  18.         Loop
  19.     Next
  20.     排序值 Range("h2:h857")
  21.     For k = 1 To IIf(D.Count >= 50, 50, D.Count)
  22.         b = Application.Large(D.KEYS, k)
  23.         Set a = Range("h2:h857").Find(What:=b, LookIn:=xlValues)
  24.         If Not a Is Nothing Then aD = a.Address
  25.         Do While Not a Is Nothing
  26.             Range("P100").End(xlUp).Offset(1) = a.Offset(0, -7) '代號
  27.             Range("Q100").End(xlUp).Offset(1) = a.Offset(0, -6) '名稱
  28.             Range("R100").End(xlUp).Offset(1) = a.Offset(0, 0) ' 張
  29.             Range("S100").End(xlUp).Offset(1) = a.Offset(0, -2) '價位
  30.             Set a = Range("h2:h857").FindNext(a)
  31.             If a.Address = aD Then Exit Do
  32.         Loop
  33.     Next
  34. End Sub
  35. '***********
  36. Private Sub 排序值(Rng As Range) '排除有重複的數值
  37.     Dim e As Range
  38.     Set D = CreateObject("SCRIPTING.DICTIONARY")
  39.     For Each e In Rng.SpecialCells(xlCellTypeConstants)
  40.        If IsNumeric(e) Then D(e.Value) = ""
  41.     Next
  42. End Sub
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復  t8899
Large函數 不是真的傳回數值資料中的第幾大須修改一下
GBKEE 發表於 2014-10-29 13:47


第 6 行,跟第20行 ???  排序值 Range("g2:g857")

TOP

回復 5# t8899
   
  1. For K = 1 To 50
  2. b = Application.Large(Range("g2:g857"), K)
  3. If Not IsNumeric(b) Then GoTo 110
複製代碼

Large函數 不是真的傳回數值資料中的第幾大,你是否了解
你的附檔程式碼用 Large函數 , 當 K=13,K=14    b都是=75,
因為 "g2:g857" 有2個75, 另還有2個2,所以都有重複出現.
'*****************************************
排序值 Range("g2:g857")
If IsNumeric(e) Then D(e.Value) = ""  
用字典物件有相同的KEY(相同的數字)來消除重複的數字
b = Application.Large(D.KEYS, k)
如只真正的依序傳回"g2:g857"數值資料中的第k大
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

[版主管理留言]
  • GBKEE(2014/10/29 20:07): 哪一行的錯誤!

回復  t8899
   
Large函數 不是真的傳回數值資料中的第幾大,你是否了解
你的附檔程式碼用 Large函數  ...
GBKEE 發表於 2014-10-29 15:08



報歉,我的G,H欄是公式 =IF(C2<>E2,"",XQKGIAP|Quote!'1101.TW-BestBidSize1')
套上去出現錯誤,不知如何修改?
#1004#
應用程式物件定義錯誤

TOP

本帖最後由 luhpro 於 2014-10-29 21:17 編輯
Set a = Range(IIf(c = b, a.Offset(1), Range("g2")), [g857])
此處需要物件??
t8899 發表於 2014-10-29 06:10

底下這一行要放在最前面,
有放了嗎?
Set a = [a1]  ' 因底下 IIF 中  a.Offset(1) 此項會執行計算, 故須先定義 a 的初值,否則會有錯誤.

回復  t8899
Large函數 不是真的傳回數值資料中的第幾大,你是否了解
你的附檔程式碼用 Large函數  ...
GBKEE 發表於 2014-10-29 15:08

以我看樓主的情形並不適合濾掉相同數值的資料,
而是要一一顯示出來的喔.

兩個不同股票的某個值可能相同,
但卻是都需要列出來的,
不能因為某個值相同就只列一支股票的資料,
這支股票不能取代其他股票的資料.

所以我才把 Find 函數的Range範圍設為 : 上次相同值的下一個儲存格開始至最末格止.

報歉,我的G,H欄是公式 =IF(C2<>E2,"",XQKGIAP|Quote!'1101.TW-BestBidSize1')
套上去出現錯誤,不知如何修改?
#1004#
應用程式物件定義錯誤
t8899 發表於 2014-10-29 20:01

經我實際測試過這一行不該發生此錯誤,
不如上傳檔案看看?

TOP

本帖最後由 GBKEE 於 2014-10-30 06:55 編輯

回復 8# luhpro
   
以我看樓主的情形並不適合濾掉相同數值的資料,
而是要一一顯示出來的喔.
有一一顯示出啊


  1. Set a = Range("g2:g857").Find(What:=b, LookIn:=xlValues, lookat:=xlWhole)
  2.     If Not a Is Nothing Then aD = a.Address
  3.     Do While Not a Is Nothing
  4.         Range("K100").End(xlUp).Offset(1) = a.Offset(0, -6) '代號
  5.         Range("L100").End(xlUp).Offset(1) = a.Offset(0, -5) '名稱
  6.         Range("M100").End(xlUp).Offset(1) = a.Offset(0, 0) ' 張
  7.         Range("N100").End(xlUp).Offset(1) = a.Offset(0, -4) '價位
  8.         '***************************************************
  9.         Set a = Range("g2:g857").FindNext(a)  '這裡有再往下相同值的儲存格
  10.         If a.Address = aD Then Exit Do  '回到第一個儲存格
  11.         '***********************************************
  12.     Loop
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

經我實際測試過這一行不該發生此錯誤,
不如上傳檔案看看?
luhpro 發表於 2014-10-29 21:03


請測驗看看! Book2.zip (111.53 KB)

TOP

        靜思自在 : 自己害自己,莫過於亂發脾氣。
返回列表 上一主題