Board logo

標題: [發問] Excel 中的判斷式 數量累加如何寫 [打印本頁]

作者: xaiver    時間: 2013-9-11 17:41     標題: Excel 中的判斷式 數量累加如何寫

各位先輩們,
    小弟目前試著寫一個Execl 判斷式. 是將Sheet A 中的 K 欄位中 有Test 字眼的 挑選出來,並累加. 再將累加結果丟到Sheet B. 的 I 欄位
    但是我寫出來 的總量總是0 並且會將 K欄位清空,為什麼?
   範例:
   Sheet A                                                                           Sheet B
I       J         K               L                                                    H                    I
1   HW      Test        2012-1-1                                   2012-1-1          1
2   SW       Open     2013-1-3                                   2012-5-10        2
3   HW      Verfiy    2013-2-1
4   SW      Test        2012-5-10
我的程式碼如下:
Dim data As String
    data = test
   
    For k = 1 To (row - 1)
        If (limtxt <> "test") Then
     Worksheets("Raw_Data").Cells(k + 2, 11).Value = str2
     If (InStr(1, data, str2) >= 1) Then limnum = limnum + 1

    End If
    Next k
作者: GBKEE    時間: 2013-9-11 17:50

回復 1# xaiver

程式碼不完整



    [attach]16034[/attach]
作者: xaiver    時間: 2013-9-11 18:43

版主你好.
      這個code 有點大, 我只是擷取其中一段. 不知道是否要將所有的code貼上來,才能解決我的問題嗎? 還是有其他的方式.
作者: GBKEE    時間: 2013-9-11 20:35

回復 3# xaiver
  1. Option Explicit
  2. Sub Ex()
  3.     Dim I As Integer, E As Range
  4.     For Each E In Sheets("A").Range("K1:K15")
  5.         If InStr(E, "Test") Then                  '有"Test"字串 大小寫有區別
  6.         'If InStr(UCase(E), UCase("Test")) Then   '轉為大寫 :   所以大小寫沒區別
  7.         I = I + 1
  8.         End If
  9.     Next
  10.     Sheets("B").Range("I1") = I ' 的 I 欄位
  11.     ' 並且會將 K欄位清空,為什麼? 沒看到程式碼,所以不曉的.
  12. End Sub
複製代碼

作者: xaiver    時間: 2013-9-12 08:52

版大你好,
   謝謝你的指導, 目前執行上是ok.
  但是~, 我的想法不太一致..
我先說明一下,

Sheet A :                                            Sheet B
I        J          K                  L                                       H                  I              J
1   HW       OPEN        2012-1-5                        2012-1-1     0
2   SW        Test           2012-1-7                        2012-1-7     1
3   HW       Closed      2012-1-9                        2012-1-14   1
4   SW       OPEN         2012-1-3                       2012-1-21   2
5   HW       Test            2012-1-20                    2012-1-28   2

I 欄位 是每周計算一次, 然後有新增的部份加上去. 所以1-21 的2 是由1~20的問提.
我目前的code是這樣 有問題的地方我已標紅色.
煩請指導
[attach]16044[/attach]
作者: GBKEE    時間: 2013-9-12 09:33

回復 5# xaiver
這裡討論Excel的VBA,可以上傳Excel檔方便討論
作者: xaiver    時間: 2013-9-12 10:37

版大
好的, 請參考附件
[attach]16047[/attach]版大,
作者: xaiver    時間: 2013-9-12 13:17

回復 7# xaiver

Password: 3668jt!
作者: GBKEE    時間: 2013-9-12 14:22

回復 8# xaiver
你的程式很龐大沒註解,看的眼花,不知所云.
  1. Sub BugTrend()
  2. For i = 1 To (row - 1)
  3.    ' itopen.Activate
  4.    ' A = ActiveCell.Offset(i, 0)
  5.     A = itopen.Offset(i, 0)    '精簡程式碼
  6.     'itclose.Activate
  7.     'b = ActiveCell.Offset(i, 0)
  8.     b = itclose.Offset(i, 0)
  9.    '
  10.    '
  11.     MsgBox str2  '沒有東西 *** 錯誤點可能在此 ****
  12.      Worksheets("Raw_Data").Cells(i, 11).Value = str2
  13. If InStr(str2, "Limitation") Then limnum = limnum + 1
複製代碼

作者: xaiver    時間: 2013-9-12 15:39

謝謝版大,
    其實我自己也稍微弄了一下,
  1. For i = 1 To (row - 1)
  2.     itopen.Activate
  3.     A = ActiveCell.Offset(i, 0)  ==> 抓取open date
  4.    
  5.     itclose.Activate
  6.     b = ActiveCell.Offset(i, 0)   ==> 抓取close date
  7.    
  8.     itsev.Activate
  9.     c = ActiveCell.Offset(i, 0)  ==>抓取Severity   

  10.     itverify.Activate
  11.     d = ActiveCell.Offset(i, 0) ==>抓取verify date.
複製代碼
我個人覺得最大的問題是~ 我不知道怎麼去抓去 Status 的欄位並將它設定在字串在進行比對.
  1. If Int(DateDiff("d", A, Astart)) >= 0 Then totalnum = totalnum + 1  ==>這邊是抓 verify date 和Open date與Astart date 做比對. (Astart date 是指向到cover page 中的 Test_Start Date)
  2. If (Int(DateDiff("d", b, Astart)) >= 0) And (b > 1000 / 1 / 1) Then closenum = closenum + 1 ==>這邊是抓取verify date 和Closed date 與Astart date 做比對
複製代碼
這兩段code 都可以抓到正確的值.
因為也以為用此方式可以抓到 字串方式
我就寫成
  1. Dim str2 As string
  2. itlimitation.Activate
  3.       For i = 1 To (row - 1)
  4.        str2 = Worksheets("Raw_Data").Cells(i, 11).Value  ==> 我以為會把string 丟入str2, 但是並沒有.
  5.        If IsEmpty(ActiveCell.Offset(i, 0)) = False Then lim = ActiveCell.Offset(i, 0)
  6.        If EndDate < lim Then EndDate = lim
  7.       Next i
複製代碼
  1. If (Int(DateDiff("d", b, Astart)) >= 0) And (b > 1000 / 1 / 1) And (InStr(str2, "Limitation"))  Then limnum = limnum + 1  ==>得到的結果always 是1
複製代碼
因此 我換個寫法
  1. If (Int(DateDiff("d", b, Astart)) >= 0) And (b > 1000 / 1 / 1) And (InStr(str2, "Limitation")>=0)  Then limnum = limnum + 1  ==>得到的結果always 是 總數
複製代碼
我想知道, 有甚麼方式.是可以採用i 循環 將string 載入str2 後, 再丟到第二段code 做比對. 如果正確+1.
作者: xaiver    時間: 2013-9-12 18:13

版大, 謝謝 我的問題解決了.
我發現到我沒將數值丟入,並沒定義到.
所以導致於數值沒寫入str2.
謝謝你.
作者: bmw711208    時間: 2013-10-9 23:31

好厲害喔...
目前在學習找網路相關類似語法複製下來改成自己的
要我從無生有好困難
看到大大精闢的分析就好羨慕...




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