Board logo

標題: [發問] 如何用INPUTBOX輸入收單日期,跑出每個處方日期的數量加總,並以MSGBOX顯示 [打印本頁]

作者: akimunekyo    時間: 2011-5-24 13:27     標題: 如何用INPUTBOX輸入收單日期,跑出每個處方日期的數量加總,並以MSGBOX顯示

請問各位前輩,我想用INPUTBOX輸入收單日期,跑出每個處方日期的數量加總,並以MSGBOX顯示
該如何去寫程式呢?
目前有想到用自動篩選和樞紐的方式,只是不知道要如何去寫
懇請前輩指導
謝謝

處方日期        入帳日期        數量        收單日期
1000103        1000103        14        100/1/4
1000117        1000117        14        100/1/18
1000131        1000131        1        100/2/1
1000131        1000131        14        100/2/1
1000201        1000201        1        100/2/7
1000207        1000207        6        100/2/8
1000207        1000207        2        100/2/8
1000214        1000214        14        100/2/15
1000228        1000228        14        100/3/1
1000314        1000314        14        100/3/15
1000328        1000328        14        100/3/29
1000411        1000411        14        100/4/14
1000425        1000425        14        100/4/26
1000502        1000502        7        100/5/3
1000509        1000509        14        100/5/10
1000511        1000511        1        100/5/12
1000512        1000512        1        100/5/16
1000513        1000513        1        100/5/16
1000513        1000513        2        100/5/16
1000514        1000514        2        100/5/16
1000515        1000515        2        100/5/16
1000516        1000516        2        100/5/17
1000517        1000517        2        100/5/18
1000518        1000518        2        100/5/19
1000519        1000519        2        100/5/20
1000520        1000520        2        100/5/23
1000521        1000521        2        100/5/23
1000522        1000522        2        100/5/23
1000522        1000522        2        100/5/23
作者: luhpro    時間: 2011-5-24 22:24

樞紐的方式我不會, 所以就試著用比較普通的方式來達成 :
Sub nn()
  Dim sStr$, sDate$
  Dim iRow%, iI%
  Dim vDate
  Dim oD As Object

  Set oD = CreateObject("Scripting.Dictionary")
  iRow = [A65535].End(xlUp).Row
  For iI = 2 To iRow
    oD(CStr(Cells(iI, 1))) = oD(CStr(Cells(iI, 1))) + Cells(iI, 3)
  Next iI
  vDate = InputBox("請輸入要查詢的收單日期 : ", "輸入收單日期")
  For iI = 2 To iRow
    If Trim(CStr(Cells(iI, 4))) = Trim(CStr(vDate)) Then
      If sDate <> CStr(Cells(iI, 1)) Then
        sStr = sStr + Chr(10) + CStr(Cells(iI, 1)) + " : " + CStr(oD(CStr(Cells(iI, 1))))
        sDate = CStr(Cells(iI, 1))
      End If
    End If
  Next iI
  MsgBox "收單日期 : " + vDate + " 的數量" + sStr
End Sub
作者: Hsieh    時間: 2011-5-24 23:20

  1. Sub ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. Set d1 = CreateObject("Scripting.Dictionary")

  4. myday = CDate(InputBox("輸入日期", , Date))
  5. For Each a In Range([D2], [D65536].End(xlUp))
  6.   If a = myday Then d(a.Offset(, -3) & "") = d(a.Offset(, -3) & "") + a.Offset(, -1)
  7. Next
  8. For Each ky In d.keys
  9.    d1(ky & ":" & d(ky)) = ""
  10. Next
  11. MsgBox Join(d1.keys, Chr(10))
  12. End Sub
複製代碼

作者: GBKEE    時間: 2011-5-25 08:11

本帖最後由 GBKEE 於 2011-5-25 08:13 編輯

回復 2# luhpro
樓主希望 INPUTBOX輸入收單日期,跑出每個處方日期的數量加總
  For iI = 2 To iRow
    oD(CStr(Cells(iI, 1))) = oD(CStr(Cells(iI, 1))) + Val(Cells(iI, 3))
  Next iI
這段程式碼是每一處方日期的數量加總
作者: akimunekyo    時間: 2011-5-25 08:37

感謝各位前輩的解答
小弟會再下功夫去研究
謝謝
作者: luhpro    時間: 2011-5-25 21:39

回復 4# GBKEE
是啊.
因為他首篇文章中所提供的例子裡面所有有重複出現的情形中,
收單日期與處方日期都是完全相對應(亦即沒有相異情形出現),
所以我在程式中是以此作為前提的,(我事前對此點有做過確認)
當然若樓主執行後發現數字有問題就會再提出來,
屆時程式也會做適度的調整.

因為我發現若考慮的情形越多相對的程式也就會越複雜,
但往往有些情形其實並不會發生,
故而實作上也就可以將其忽略簡化.
謝謝你有注意到此點並提出討論.
作者: akimunekyo    時間: 2011-5-26 08:37

回復 3# Hsieh



感謝前輩的解答,問題已經解決
另外問一下CreateObject("Scripting.Dictionary")是要做什麼的?
謝謝
作者: Hsieh    時間: 2011-5-26 08:41

回復 7# akimunekyo


    http://forum.twbts.com/thread-20-1-1.html
作者: akimunekyo    時間: 2011-5-26 08:46


感謝前輩的回答
只是跑出來的數量是空白的
小弟是個新手,樞紐也只是用excel裡的功能,並非是用VBA
另外請教Trim及CStr是什麼作用?
還有sStr$及iRow%,後面加上"$"及"%",是要做什麼的?
謝謝您
作者: akimunekyo    時間: 2011-5-26 08:50

回復 8# Hsieh


謝謝
再請教要如何將程式碼像前輩一樣用表格貼上,前面還可以加上序號?
作者: luhpro    時間: 2011-5-26 23:24

本帖最後由 luhpro 於 2011-5-26 23:28 編輯

回復 9# akimunekyo
跑出來的數量會空白我猜是輸入的日期文字不 Match 所以抓不到資料,
附檔[attach]6351[/attach]開啟後按下 "查詢資料" 按鈕輸入日期 100/5/23 就會看到結果了.

如果想要知道一個指令的功能可以在VBA編輯器中Mark該指令後再按下 F1 按鍵就會看到線上說明了.
trim 是去掉字串前後方的空白字元
Cstr 是強制將資料改成字串格式
Dim中變數名稱右邊加 : $ 等同 As String   % 等同 As Integer
Dim sStr$   即等同 Dim sStr As String

至於程式代碼加編號我猜應該是高級模式中按上方的 "代碼" 貼上程式進去後做出來的.
作者: GBKEE    時間: 2011-5-27 06:19

回復 11# luhpro
附檔
For iI = 2 To iRow
    oD(CStr(Cells(iI, 1))) = oD(CStr(Cells(iI, 1))) + Val(Cells(iI, 3))
  Next iI
這段程式碼是每一處方日期的數量加總 (每一處方日期 可能有不同的收單日期要考慮到 )
作者: akimunekyo    時間: 2011-5-28 09:50

回復 11# luhpro


感謝 luhpro 前輩解惑,小弟還不能下載檔案,不過我會再試看看的
目前Hsieh前輩的程式已經可以使用
  1. 01.Sub ex()
  2. 02.Set d = CreateObject("Scripting.Dictionary")
  3. 03.Set d1 = CreateObject("Scripting.Dictionary")
  4. 04.
  5. 05.myday = CDate(InputBox("輸入日期", , Date))
  6. 06.For Each a In Range([D2], [D65536].End(xlUp))
  7. 07.  If a = myday Then d(a.Offset(, -3) & "") = d(a.Offset(, -3) & "") + a.Offset(, -1)
  8. 08.Next
  9. 09.For Each ky In d.keys
  10. 10.   d1(ky & ":" & d(ky)) = ""
  11. 11.Next
  12. 12.MsgBox Join(d1.keys, Chr(10))
  13. 13.End Sub
複製代碼





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