Board logo

標題: 副程式/if判斷不到/請求解惑 [打印本頁]

作者: 最高機密    時間: 2013-10-20 16:15     標題: 副程式/if判斷不到/請求解惑

本帖最後由 GBKEE 於 2013-10-20 16:52 編輯

這是我的資料檔
http://cht.tw/h/nmaeu
當我跑程式時,不管我輸入什麼值,程式永遠跑for a=2 to 486
並不會跑我設定的if條件,我有試著用while跑但會當機(可能不能這樣吧)
不知道哪裡出錯了,改了很久還是改不出來。
麻煩大師們幫初學者我小弟解答,感激不進
作者: GBKEE    時間: 2013-10-20 17:05

回復 1# 最高機密
很煩人的雲端下載須點廣告,但一直點廣告,就是不可下載,討論區裡可將檔案用壓縮檔上傳
副程式中找不到X,Y的變數,須於主程式式的模組中的頂端 PUBLIC X,Y 設為公用變數
  1. IF 主程式模組.X > CELLS(A,1) OR CELLS(A,1)<=主程式模組.Y
複製代碼

作者: 最高機密    時間: 2013-10-20 18:50

回復 2# GBKEE

謝謝你的指點
我加了你那段後,他說要設定物件?是要再加哪些程式碼嗎?
作者: c_c_lai    時間: 2013-10-20 19:15

回復 3# 最高機密
  1. Public X, Y

  2. Sub trend()
  3.     X = InputBox("輸入第一天")
  4.     Y = InputBox("輸入最後一天")
  5.     For a = 2 To 486
  6.         If X > Cells(a, 1) And Cells(a, 1) <= Y Then
  7.             Call aa(a)
  8.         End If
  9.     Next a
  10. End Sub
複製代碼

作者: 最高機密    時間: 2013-10-20 19:20

回復 4# c_c_lai

感謝你的協助
我試過了,還是一樣跑出全部:'(
他沒有判斷到@@
作者: luhpro    時間: 2013-10-20 21:12

本帖最後由 luhpro 於 2013-10-20 21:18 編輯

回復 5# 最高機密
你誤會了.

2# 所說 須於主程式式的模組中的頂端 PUBLIC X,Y 設為公用變數 意思是變數要在 Model 中以 Public 來定義:
以下程式放在 Model 模組中 :
  1. Public x, y
複製代碼
另你的 If x > Cells(a, 1) <= y Then 則要改為

If x > Cells(a, 1) And Cells(a, 1) <= y Then

底下以你 1# 的程式為例修改 :
  1. Sub trend()
  2.   x = InputBox("輸入第一天")
  3.   y = InputBox("輸入最後一天")
  4.   For a = 2 To 486
  5.     Call aa(a)
  6.   Next a
  7. End Sub

  8. Sub aa(ByVal a As Integer)
  9.   For b = 9 To 32
  10.     If x > Cells(a, 1) And Cells(a, 1) <= y Then
  11.       Cells(a, b + 25) = Cells(a + 2, 2) - Cells(a + 1, 2)
  12.     Else
  13.       Cells(a, b + 25) = Cells(a + 1, 2) - Cells(a + 2, 2)
  14.     End If
  15.     c = Cells(a, b + 25)
  16.     d = d + c
  17.     Cells(489, b + 25) = d
  18.     e = Cells(1, b + 25)
  19.     Cells(488, b + 25) = e
  20.   Next
  21.   c = 0
  22.   Cells(1, b + 25) = Cells(1, b)
  23. End Sub
複製代碼
[attach]16398[/attach]
作者: 最高機密    時間: 2013-10-20 23:43

回復 6# luhpro


    OK 我嘗試看看 謝謝你
作者: 最高機密    時間: 2013-10-21 01:38

回復 6# luhpro

我嘗試了一下,我值隨便輸入,一樣會測試全部 似乎沒有判斷到IF
   
Public x, y
Sub trend()
  x = InputBox("輸入第一天")
  y = InputBox("輸入最後一天")
  For a = 2 To 486
    Call aa(a)
  Next a
End Sub

Sub aa(ByVal a As Integer)
  For b = 9 To 32
    If x > Cells(a, 1) And Cells(a, 1) <= y Then
      If Cells(a, b) >= Cells(a - 1, b) Then
      Cells(a, b + 25) = Cells(a + 2, 2) - Cells(a + 1, 2)
      Else
      Cells(a, b + 25) = Cells(a + 1, 2) - Cells(a + 2, 2)
      End If
    End If
    c = Cells(a, b + 25)
    D = D + c
    Cells(489, b + 25) = D
    e = Cells(1, b + 25)
    Cells(488, b + 25) = e
  Next
  c = 0
  Cells(1, b + 25) = Cells(1, b)
End Sub
作者: c_c_lai    時間: 2013-10-21 08:15

回復  luhpro

我嘗試了一下,我值隨便輸入,一樣會測試全部 似乎沒有判斷到IF
   
Public x, y
Sub ...
最高機密 發表於 2013-10-21 01:38

終於了解你指的問題在哪裡,字串比較最好使用 StrComp() 涵示較宜。
我將 If 的判斷移至入口處,不然每一次迴圈都要無端演練 24 次 (For b = 9 To 32),
請全部貼至 Module1 或 原本之表單內 (可以將 Module1 內的 Public x,y 移除)
程式段我都已將它對位好了,以方便偵錯與閱覽。
  1. Public x, y

  2. Sub trend()
  3.     x = InputBox("輸入第一天")
  4.     y = InputBox("輸入最後一天")
  5.     If x = "" Or y = "" Then Exit Sub
  6.    
  7.     For a = 2 To 486
  8.         Call aa(a)
  9.     Next a
  10. End Sub

  11. Sub aa(ByVal a As Integer)
  12.     If StrComp(Cells(a, 1), x, 1) >= 0 And StrComp(y, Cells(a, 1), 1) >= 0 Then
  13.         For b = 9 To 32
  14.             If Cells(a, b) >= Cells(a - 1, b) Then
  15.                 Cells(a, b + 25) = Cells(a + 2, 2) - Cells(a + 1, 2)
  16.             Else
  17.                 Cells(a, b + 25) = Cells(a + 1, 2) - Cells(a + 2, 2)
  18.             End If
  19.             c = Cells(a, b + 25)
  20.             D = D + c
  21.             Cells(489, b + 25) = D
  22.             e = Cells(1, b + 25)
  23.             Cells(488, b + 25) = e
  24.         Next
  25.         c = 0
  26.         Cells(1, b + 25) = Cells(1, b)
  27.     End If
  28. End Sub
複製代碼

作者: 最高機密    時間: 2013-10-21 13:12

回復 9# c_c_lai
太感謝你了:victory: 成功了~
作者: 最高機密    時間: 2013-10-21 22:21

回復 9# c_c_lai

If StrComp(Cells(a, 1), x, 1) >= 0 And StrComp(y, Cells(a, 1), 1) >= 0
我剛查了一下StrComp函式用來比較字串,且若第一個參數小於、等於或大於第二個參數時,依序回傳-1、0或1
StrComp(Cells(a, 1), x, 1) >= 0 這是怎麼判斷的 請教一下.
Cells(a, 1)和 x比後就有點模糊了..
作者: c_c_lai    時間: 2013-10-22 06:02

本帖最後由 c_c_lai 於 2013-10-22 06:05 編輯

回復 11# 最高機密
看了以下分析便不會混亂了:
  1. 假設 x,y  你的輸入值分別為 20040116,20040206

  2. x                          = "20040116"  (輸入值)
  3. y                          = "20040206"  (輸入值)
  4.                   [A2]
  5. Cells(a, 1)                = 20040109
  6. StrComp(Cells(a, 1), x, 1) = -1        '  [A2] < x
  7. StrComp(y, Cells(a, 1), 1) = 1         '  y > [A2]
  8.                   [A3]     (條件符合 - 成立)
  9. Cells(a, 1)                = 20040116
  10. StrComp(Cells(a, 1), x, 1) = 0         '  [A3] = x
  11. StrComp(y, Cells(a, 1), 1) = 1         '  y > [A3]
  12.                   [A4]     (條件符合 - 成立)
  13. Cells(a, 1)                = 20040130
  14. StrComp(Cells(a, 1), x, 1) = 1         '  [A4] > x
  15. StrComp(y, Cells(a, 1), 1) = 1         '  y > [A4]
  16.                   [A5]     (條件符合 - 成立)
  17. Cells(a, 1)                = 20040206
  18. StrComp(Cells(a, 1), x, 1) = 1         '  [A5] > x
  19. StrComp(y, Cells(a, 1), 1) = 0         '  y = [A5]
  20.                   [A6]
  21. Cells(a, 1)                = 20040213
  22. StrComp(Cells(a, 1), x, 1) = 1         '  [A6] > x
  23. StrComp(y, Cells(a, 1), 1) = -1        '  y < [A6]
  24.                   [A7]
  25. Cells(a, 1)                = 20040220
  26. StrComp(Cells(a, 1), x, 1) = 1         '  [A7] > x
  27. StrComp(y, Cells(a, 1), 1) = -1        '  y < [A7]
複製代碼
撥雲見日了嗎?
作者: 最高機密    時間: 2013-10-22 11:58

回復 12# c_c_lai


    我懂了 非常感謝你




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