Board logo

標題: [發問] 請教此程序錯在何處,如何改 ?? [打印本頁]

作者: t8899    時間: 2014-3-19 20:57     標題: 請教此程序錯在何處,如何改 ??

Sub BBB()
A = Application.Large(Sheets("Sheet6").Range("ao20:ao350"), 1)
Sheets("Sheet6").Range("A10").Value = A.Offset(0, -37)
End Sub
作者: a8350070    時間: 2014-3-19 22:15

A返回的是區間中最大數值,是數值而非該數值所在的儲存格
而offset函數必先指定一個儲存格或範圍(物件)再去取得其位移參照
若指定的是一個數值而非物件,就會因找不到物件而發生錯誤

試試以下敘述

Sheets("Sheet6").[a10] = Sheets("Sheet6").[d19].Offset(WorksheetFunction.Match(Application.Large(Sheets("Sheet6").Range("ao20:ao350"), 1), Sheets("Sheet6").Range("ao20:ao350"), 0), 0)
作者: t8899    時間: 2014-3-20 06:36

A返回的是區間中最大數值,是數值而非該數值所在的儲存格
而offset函數必先指定一個儲存格或範圍(物件)再去 ...
a8350070 發表於 2014-3-19 22:15

試過可以,但參數太多,看不太懂?有無較易懂的解法?
作者: Hsieh    時間: 2014-3-20 08:28

回復 3# t8899

A = Application.Large(Sheets("Sheet6").Range("ao20:ao350"), 1)

這樣得到的是區間最大值,是個數值,並非儲存格物件
試試
set a=Sheets("Sheet6").Range("ao20:ao350").find(application.max(Sheets("Sheet6").Range("ao20:ao350")))
作者: t8899    時間: 2014-3-20 08:43

回復  t8899

A = Application.Large(Sheets("Sheet6").Range("ao20:ao350"), 1)

這樣得到的是區間最 ...
Hsieh 發表於 2014-3-20 08:28


Application.Large
application.max
這兩個有差別嗎???
作者: owen06    時間: 2014-3-20 09:39

本帖最後由 owen06 於 2014-3-20 09:45 編輯

回復 3# t8899
  1. Sub BBB()
  2. A = [ao20:ao350].find(Application.Large(Sheets("Sheet6").Range("ao20:ao350"), 1),,,xlwhole).address
  3. Sheets("Sheet6").Range("A10").Value = range(A).Offset(0, -37)
  4. End Sub
複製代碼
max只能取最大,large能選擇要第幾大,差別在這
作者: t8899    時間: 2014-3-20 11:59

回復  t8899 max只能取最大,large能選擇要第幾大,差別在這
owen06 發表於 2014-3-20 09:39

large 即已包含max  , 就無須max 啊
作者: owen06    時間: 2014-3-20 13:12

回復 7# t8899


是這麼說沒錯啦,   
但如果你只是要最大值,就可以直接用MAX,公式比較簡短一點,
MAX(RANGE)
LARGE(RANGE,1)
恩,真的只有一點…
作者: t8899    時間: 2014-3-20 14:44

回復  t8899 max只能取最大,large能選擇要第幾大,差別在這
owen06 發表於 2014-3-20 09:39

剛試了一下,沒有設定物件變數??
作者: Hsieh    時間: 2014-3-20 15:14

回復 9# t8899
問題就只是沒有使用Set設置變數為物件
MAX與LARGE函數你喜歡用哪個沒關係啦
作者: t8899    時間: 2014-3-20 19:31

問題就只是沒有使用Set設置變數為物件
Hsieh 發表於 2014-3-20 15:14

物件定義錯誤??請教如何定義查找出來的屬性 ?
Sub aaa()
Dim a
Set a=Sheets("She5555555555555et6").Range("ao20:ao350").Find(Application.Max(Sheets("She5555555555555et6").Range("ao20:ao350")))
Sheets("She5555555555555et6").Range("A10") = Sheets("She5555555555555et6").Range(a).Offset(0, -37)
End Sub
作者: t8899    時間: 2014-3-20 20:14

回復  t8899

直接這樣不就行了嗎?不然就是要
owen06 發表於 2014-3-20 20:07

不行耶, 沒有設定物件變數
a=Sheets("She5555555555555et6").Range("ao20:ao350").Find(Application.Max(Sheets("She5555555555555et6").Range("ao20:ao350"))).address
作者: owen06    時間: 2014-3-20 20:17

本帖最後由 owen06 於 2014-3-20 20:24 編輯

回復 11# t8899

二種方式:
  1. Sub aaa()
  2. a = Sheets("She5555555555555et6").Range("ao20:ao350").Find(Application.Max(Sheets("She5555555555555et6").Range("ao20:ao350"))).Address
  3. Sheets("She5555555555555et6").Range("A10") = Sheets("She5555555555555et6").Range(a).Offset(0, -37)
  4. End Sub
複製代碼
不然就是要
  1. Sub aaa()
  2. Dim a As Range
  3. Set a = Sheets("She5555555555555et6").Range("ao20:ao350").Find(Application.Max(Sheets("She5555555555555et6").Range("ao20:ao350")))
  4. Sheets("She5555555555555et6").Range("A10") =a.Offset(0, -37)
  5. End Sub
複製代碼
第二種方式因為有定義a的範圍了,所以不需要在a前面特定指出sheetx,他就能去找到他的位置了。

附檔你試試看,我做是都沒問題呀。
作者: t8899    時間: 2014-3-20 21:50

回復  t8899

二種方式:不然就是要第二種方式因為有定義a的範圍了,所以不需要在a前面特定指出sheetx, ...
owen06 發表於 2014-3-20 20:17

你的沒問題,套在我這裡兩個都不行
查了一下
我的AO欄是公式
AO21=IF(Q21="","",AM21-AN21)
AO22=IF(Q22="","",AM22-AN22)
........
是不是這原因???
作者: Hsieh    時間: 2014-3-20 23:37

回復 14# t8899

由於你的公式有可能傳回空字串,當範圍內沒有任何數值,MAX或LARGE都無法求得最大值
試試看
  1. Sub aaa()
  2. Dim a As Range
  3. Set a=Sheets("She5555555555555et6").Range("ao20:ao350").Find(Application.Max(Sheets("She5555555555555et6").Range("ao20:ao350")))
  4. If Not a Is Nothing Then Sheets("She5555555555555et6").Range("A10") = a.Offset(0, -37)
  5. End Sub
複製代碼
建議上傳檔案來看看
作者: owen06    時間: 2014-3-20 23:55

回復 14# t8899


    剛才試了一下之前的程式,發現FIND後面如果沒有補上, , xlValues, xlWhole
    在你的公式下找出來的值會不是正確解答,我依照你的公式去模擬了一個檔案,你看看內容再去改修你的檔案,
    希望能夠解決你的問題。
作者: t8899    時間: 2014-3-21 07:30

回復  t8899


    剛才試了一下之前的程式,發現FIND後面如果沒有補上, , xlValues, xlWhole
    在你 ...
owen06 發表於 2014-3-20 23:55


找的資料裡面的值是空白???(下一樓附檔)
作者: t8899    時間: 2014-3-21 07:31

建議上傳檔案來看看
Hsieh 發表於 2014-3-20 23:37



附檔[attach]17841[/attach]
作者: Hsieh    時間: 2014-3-21 09:37

回復 18# t8899
  1. Sub aaa()
  2. Dim Rng As Range
  3. Set Rng = Sheets("She5555555555555et6").Range("ao20:ao350")
  4. k = Application.Max(Rng)
  5. s = Application.Match(k, Rng, 0)
  6. Sheets("She5555555555555et6").Range("A10") = Rng(s).Offset(0, -37)
  7. End Sub
複製代碼

作者: t8899    時間: 2014-3-21 09:55

Hsieh 發表於 2014-3-21 09:37

這是ao20:ao350是公式的問題
為何套在 owen06 的是可以的??
作者: owen06    時間: 2014-3-21 14:47

回復 20# t8899


   試了一下覺得不是公式的問題,而是儲存格格式的問題,
   但不知道是何原因造成系統認定該範圍的儲存格格非為一般的數值格數,
   因而在vba裡會找不到物件。




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