Board logo

標題: [發問] 想在原有的程式碼加入找昨日的功能 [打印本頁]

作者: starbox520    時間: 2017-1-4 10:27     標題: 想在原有的程式碼加入找昨日的功能

本帖最後由 starbox520 於 2017-1-4 10:28 編輯

[attach]26286[/attach]

此程式可在這裡輸入日期(紅線圈起部分)
會找網段上資料,依我輸入的日期之間的所有的資料
(中間有一些公式做計算)
像上圖就是會去找5月1號-5月31號的資料

現在想新增一個botten不需輸入日期
按下會直接跑昨日的資料,還請指導一下,還有這隻程式有時候會跑到1年的資料
相對的就會跑超久…最久一次跑了快2天= =",程式碼部分有辦法優化嗎
  1. Sub Sumbit()

  2. clean_rawdata
  3.    Sheets("Act_UTZ").Select
  4.     Range("D4").Value = "手動"

  5. Dim Src As String
  6.    
  7.    
  8.     Application.DisplayAlerts = False
  9.    
  10.    
  11.     Src = ThisWorkbook.Name
  12.    
  13.     start_year = Left(Worksheets("Main").Cells(2, 2), 4)
  14.     end_year = Left(Worksheets("Main").Cells(2, 4), 4)

  15.     start_month = Mid(Worksheets("Main").Cells(2, 2), 5, 2)
  16.     end_month = Mid(Worksheets("Main").Cells(2, 4), 5, 2)
  17.    
  18.     start_day = Right(Worksheets("Main").Cells(2, 2), 2)
  19.     end_day = Right(Worksheets("Main").Cells(2, 4), 2)
  20.    
  21.     start_date = Right(Worksheets("Main").Cells(2, 2), 4)
  22.     end_date = Right(Worksheets("Main").Cells(2, 4), 4)
  23.    
  24.    
  25.     ''''plan_period為所要下載之PC Plan版本日期
  26.    
  27.    
  28.     If Val(end_month) > Val(start_month) Or Val(end_year) > Val(start_year) Then
  29.       
  30.        If start_month = "01" Or start_month = "03" Or start_month = "05" Or start_month = "07" Or start_month = "08" Or start_month = "10" Or start_month = "12" Then
  31.           m1 = 31
  32.        End If
  33.        If start_month = "02" Then
  34.           m1 = 29
  35.        End If
  36.        If start_month = "04" Or start_month = "06" Or start_month = "09" Or start_month = "11" Then
  37.           m1 = 30
  38.        End If
  39.         
  40.        plan_period = m1 - Val(start_day) + Val(end_day)
  41.       
  42.     End If
  43.       
  44.     If Val(end_month) = Val(start_month) Then
  45.    
  46.        If start_month = "01" Or start_month = "03" Or start_month = "05" Or start_month = "07" Or start_month = "08" Or start_month = "10" Or start_month = "12" Then
  47.           m1 = 31
  48.        End If
  49.        If start_month = "02" Then
  50.           m1 = 29
  51.        End If
  52.        If start_month = "04" Or start_month = "06" Or start_month = "09" Or start_month = "11" Then
  53.           m1 = 30
  54.        End If
  55.    
  56.        plan_period = Val(end_day) - Val(start_day)
  57.       
  58.     End If
  59.    
  60.             
  61.    ' Worksheets("Raw_Data_1").Select
  62.    
  63.     'Cells.Select
  64.    ' Selection.EntireColumn.Hidden = False
  65.    ' Worksheets("Raw_Data_1").AutoFilterMode = False
  66.    

  67.    
  68.     For I = 0 To plan_period
  69.    
  70.         If Val(start_day) + I > m1 Then
  71.         
  72.            If Val(start_month) <= 8 Then
  73.       
  74.               month_var = "0" & Val(start_month) + 1
  75.               
  76.            ElseIf Val(start_month) >= 12 Then
  77.       
  78.                   month_var = "0" & Val(start_month) + 1 - 12
  79.               
  80.            ElseIf Val(start_month) >= 9 Then
  81.       
  82.                   month_var = Val(start_month) + 1
  83.               
  84.            End If
  85.       
  86.            If Val(start_day) + I - m1 <= 9 Then
  87.          
  88.               day_var = "0" & Val(start_day) + I - m1
  89.               
  90.            ElseIf Val(start_day) + I - m1 >= 10 Then
  91.       
  92.                   day_var = Val(start_day) + I - m1
  93.          
  94.            End If
  95.    
  96.            plan_date = end_year & month_var & day_var
  97.            
  98.         End If
  99.         
  100. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  101.    
  102.         If Val(start_day) + I <= m1 Then
  103.                
  104.            If Val(start_day) + I <= 9 Then
  105.    
  106.               day_var = "0" & Val(start_day) + I
  107.               
  108.            ElseIf Val(start_day) + I >= 10 Then
  109.       
  110.                  day_var = Val(start_day) + I
  111.               
  112.            End If
  113.            
  114.            plan_date = start_year & start_month & day_var
  115.            
  116.         End If
  117.             
  118.       
  119.         '在""可輸入網址
  120.         Importfilepath = ""
  121.    
  122.         Set oldbook = Workbooks.Open(Importfilepath)
  123.    
  124.         'Application.AutomationSecurity = secAutomation
  125.         
  126.         
  127.         
  128. '-------------------------------------------------------------------------------------------------------------------

  129. Columns("A:X").Select
  130.     Selection.Copy
  131.     Windows(Src).Activate
  132.     Sheets("output").Select

  133.     Range("A1").Select
  134.     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  135.         :=False, Transpose:=False

  136.     Range("X2").Select
  137.     Application.CutCopyMode = False
  138.     ActiveCell.FormulaR1C1 = "=RC[-15]&RC[-20]"
  139.     Range("X2").Select
  140.     With Selection.Interior
  141.         .Pattern = xlSolid
  142.         .PatternColorIndex = xlAutomatic
  143.         .ThemeColor = xlThemeColorLight2
  144.         .TintAndShade = 0.799981688894314
  145.         .PatternTintAndShade = 0
  146.     End With
  147.     Range("X1").Select
  148.     ActiveCell.FormulaR1C1 = "$"


  149. '下拉

  150.     Dim r1 As Range

  151.     Range("A1").Select
  152.     Selection.End(xlDown).Select
  153.    
  154.     rf = ActiveCell.Offset(0, 23).Address
  155.     rtxt = "x2:" & rf
  156.     Set r1 = Range(rtxt)
  157.     r1.Select
  158.     Selection.FillDown
  159.    
  160.     '值貼上
  161.      Selection.Copy
  162.     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  163.         :=False, Transpose:=False



  164. 公式_UTZ
  165. 貼上
  166. '刷子
  167.                
  168.    
  169.         Windows("Tester_COEE&UTZ_" & plan_date & "_DailyRawData.xls").Activate
  170.         Workbooks("Tester_COEE&UTZ_" & plan_date & "_DailyRawData.xls").Close False
  171.         
  172.         
  173.         
  174.         Next
  175.         
  176.         MsgBox ("手動拉日期")
  177.         
  178.                
  179. End Sub
複製代碼
[attach]26290[/attach]
作者: stillfish00    時間: 2017-1-5 13:43

本帖最後由 stillfish00 於 2017-1-5 13:46 編輯

回復 1# starbox520
日期處理請參考
DateSerial
DateDiff
DateAdd
這幾個函數,不用自己處理得那麼麻煩
作者: starbox520    時間: 2017-1-5 15:02

回復 2# stillfish00

回大大
可以用我的程式碼舉個例子嗎
作者: starbox520    時間: 2017-1-5 16:47

回復 3# starbox520


像這樣嗎?
但我不知道這樣修過後會不會存在一些我還沒發現的Bug
  1. Sub Sumbit()


  2. clean_rawdata
  3.    Sheets("Act_UTZ").Select
  4.     Range("D4").Value = "手動"

  5. Dim Src As String
  6.    
  7.    
  8.     Application.DisplayAlerts = False
  9.    
  10.    
  11.     Src = ThisWorkbook.Name
  12.    
  13.      Dim start_d As Date, end_d As Date
  14.     start_d = DateValue(Mid(Sheets("Main").[B2], 1, 4) & "/" & Mid(Sheets("Main").[B2], 5, 2) & "/" & Mid(Sheets("Main").[B2], 7, 2))
  15.     end_d = DateValue(Mid(Sheets("Main").[D2], 1, 4) & "/" & Mid(Sheets("Main").[D2], 5, 2) & "/" & Mid(Sheets("Main").[D2], 7, 2))

  16.    
  17.     For i = start_d To end_d
  18.    
  19.         
  20.            
  21.            
  22.         plan_date = Format(i, "yyyymmdd")
  23.             
  24.       
  25.         '在""可輸入網址
  26.         Importfilepath = " "
  27.    
  28.         Set oldbook = Workbooks.Open(Importfilepath)
  29.    
  30.         'Application.AutomationSecurity = secAutomation
  31.         
  32.         
  33. '-------------------------------------------------------------------------------------------------------------------

  34. Columns("A:X").Select
  35.     Selection.Copy
  36.     Windows(Src).Activate
  37.     Sheets("output").Select

  38.     Range("A1").Select
  39.     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  40.         :=False, Transpose:=False

  41.     Range("X2").Select
  42.     Application.CutCopyMode = False
  43.     ActiveCell.FormulaR1C1 = "=RC[-15]&RC[-20]"
  44.     Range("X2").Select
  45.     With Selection.Interior
  46.         .Pattern = xlSolid
  47.         .PatternColorIndex = xlAutomatic
  48.         .ThemeColor = xlThemeColorLight2
  49.         .TintAndShade = 0.799981688894314
  50.         .PatternTintAndShade = 0
  51.     End With
  52.     Range("X1").Select
  53.     ActiveCell.FormulaR1C1 = "$$"


  54. '下拉

  55.     Dim r1 As Range

  56.     Range("A1").Select
  57.     Selection.End(xlDown).Select
  58.    
  59.     rf = ActiveCell.Offset(0, 23).Address
  60.     rtxt = "x2:" & rf
  61.     Set r1 = Range(rtxt)
  62.     r1.Select
  63.     Selection.FillDown
  64.    
  65.     '值貼上
  66.      Selection.Copy
  67.     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  68.         :=False, Transpose:=False



  69. 公式_UTZ
  70. 貼上
  71. '刷子
  72.                
  73.    
  74.         Windows("Tester_COEE&UTZ_" & plan_date & "_DailyRawData.xls").Activate
  75.         Workbooks("Tester_COEE&UTZ_" & plan_date & "_DailyRawData.xls").Close False
  76.         
  77.         
  78.         
  79.         Next
  80.         
  81.         MsgBox ("手動拉日期")
  82.         
  83.                
  84. End Sub
複製代碼

作者: stillfish00    時間: 2017-1-5 19:07

本帖最後由 stillfish00 於 2017-1-5 19:17 編輯

回復 4# starbox520
是的,倒不如說不這樣修的話跨年度查詢可能有bug
但改這個不會提升太多速度

速度的話,你用了很多的 select , copy 才是主因
一般解決方法有兩種
一種是暫時關閉Application.ScreenUpdating,跑完再打開
另一種是不要用copy , 改用如
ar = Range("A1:C3").value    '取代 copy
Range("F1").resize(ubound(ar),ubound(ar,2)).value = ar     '取代 paste
來複製資料到別的地方

另外像
r1.Select
Selection.FillDown
這種可以直接簡化成  r1.FillDown
反正有 Select 的地方能免則免(執行動作的邏輯不變下),會快很多
作者: starbox520    時間: 2017-1-6 12:29

回復 5# stillfish00


這部分我還沒用的很熟
大大可以改一部分當參考嗎
作者: stillfish00    時間: 2017-1-6 15:44

本帖最後由 stillfish00 於 2017-1-6 15:49 編輯

回復 6# starbox520
建議你看這篇 VBA的寫作技巧與增進效能
例如
  1.            
  2.         '在""可輸入網址
  3.         Importfilepath = ""
  4.         Set oldbook = Workbooks.Open(Importfilepath)
  5.         
  6.         Columns("A:X").Select
  7.         Selection.Copy
  8.         Windows(Src).Activate
  9.         Sheets("output").Select
  10.         
  11.         Range("A1").Select
  12.         Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  13.             :=False, Transpose:=False
複製代碼
可以改成
  1.         '在""可輸入網址
  2.         Importfilepath = ""
  3.         Set oldbook = Workbooks.Open(Importfilepath)

  4.         ar = oldbook.ActiveSheet.Columns("A:X")
  5.         ThisWorkbook.Sheets("output").Range("A1").Resize(UBound(ar), UBound(ar, 2)) = ar
複製代碼
甚至不要直接用整個"A:X" column , 而是找出實際有資料的區域
作者: starbox520    時間: 2017-1-6 16:56

回復 7# stillfish00

ok

我試著改改看 謝謝!!




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