iT邦幫忙

2019 iT 邦幫忙鐵人賽

0
自我挑戰組

程式設計師大冒險系列 第 69

[69/150]Excel vba 取出某段時間的資料

給一張有日期表單,取出開始日和結束日中間的資料。這邊有二個做法,代入公式和vba輸出資料。

【大綱】

  • 公式解
  • VBA
  • 總結

【公式解】

參考:How To Extract All Records Between Two Dates In Excel?
https://ithelp.ithome.com.tw/upload/images/20181208/20091910rC3unE5KDI.jpg

簡單版(去掉除錯功能)
N4=INDEX($H$4:$H$11,SMALL(IF(($J$4:$J$11>=$M$4)*($J$4:$J$11<=$M$5),ROW($J$4:$J$11)-ROW($J$4)+1),ROWS(M$4:M4)))

說明
函數解說是省略版,建議查官方文本
以下程式是為了方便解說,沒有運作功能。

<!--INDEX(資料來源[序號]範圍,SMALL(IF((資料來源[日期]範圍>=開始日)\*(資料來源[日期]範圍<=結束日),ROW(輸出列數)-ROW(輸出資料第一列)+1),ROWS(輸出資料[日期]第一列:該列)))-->

<!--INDEX(資料範圍,列數)取資料第n列-->
<INDEX>(資料來源[序號]範圍,
   <!--SMALL(資料範圍,數字)取第N小的值-->
    <SMALL>(
         <IF>(
            (資料來源[日期]範圍>=開始日)\*(資料來源[日期]範圍<=結束日),
            ROW(資料來源[日期]範圍)-ROW(資料來源[日期]第一列)+1
            )</if>
         ,ROWS(資料來源[日期]第一列:該列)
         )</small>
    )</index>

【VBA】

Sub getrecord()
'宣告
    Dim allt, outin As Integer
    Dim st, out, std, endd As Range
    outin = 0
    Set st = Application.Range("H4") '請設定資料來源[日期]第一格
    Set out = Application.Range("Q4") '請設定輸出來源左上第一格
    
     Set std = Application.Range("M4") '請設定開始日
    Set endd = Application.Range("M5") '請設定結束日
    allt = st.End(xlDown).Row()
    
'清除output
    If (out) Then
        Range(out, Cells(out.End(xlDown).Row(), out.Column() + 1)).Select
        Selection.Clear
    End If

'outpput
    For ti = st.Row() To allt
     comp = Cells(ti, 10).Value
         If ((comp >= std) * (comp <= endd)) Then
             Debug.Print (Cells(ti, 10))
             outin = outin + 1
             Cells(ti, 8).Copy Cells(3 + outin, out.Column())
              Cells(ti, 9).Copy Cells(3 + outin, out.Column() + 1)
                         
         End If
    Next ti
        
End Sub

【總結】

最近有點逃避學前端,VBA學起來快樂多了。
不過發問不是每天有,問朋友需不需要幫忙,又怕被覺得有企圖。
感謝撥冗閱讀。


上一篇
[68/150]CPE一星題庫(三)過程不太順利
下一篇
[70/150]CPE一星題庫(四)JS將自身化為參數
系列文
程式設計師大冒險115

尚未有邦友留言

立即登入留言