Board logo

標題: [發問] 請問該如何批次匯入不同日期資料至EXCEL? [打印本頁]

作者: j1221    時間: 2012-5-11 23:48     標題: 請問該如何批次匯入不同日期資料至EXCEL?

各位好,

不好意思又來麻煩大家了。最近在試著改寫以【程式交易聚寶盆】裡面CLCY大分享的期交所轉檔檔案,試著把原先只能一次輸入一天的EXCEL改寫成可以批次輸入多天的版本(比如說從一個合約月份的開倉日至結算日),但是一直不成功。
也就是說我想要從期交所提供的盤後每筆交易資料(.rpt檔)批次輸入至Excel中(Excel 2010),比如說從2011-12-15, 2011-12-16,......2012-01-12, 2012-01-13 等等

請先讓我附上我的code,再說明我的問題。
  1. Public Sub CommandButton1_Click()
  2. Dim FilePath As String, FileName As String

  3. Dim Product As String, Contract As String
  4. Dim Hr As Long, Min As Long, Sec As Long

  5. iYear_s = Val(txtYear_start.Text)
  6. iYear_e = Val(txtYear_end.Text)
  7. iMonth_s = Val(txtMonth_start.Text)
  8. iMonth_e = Val(txtMonth_end.Text)
  9. iDay_s = Val(txtDay_start.Text)
  10. iDay_e = Val(txtDay_end.Text)

  11. For Z = iYear_s To iYear_e
  12.     For J = iMonth_s To iMonth_e
  13.         For K = iDay_s To iDay_e
  14.             'transform number into string
  15.             txtYear = Z & ""
  16.             txtMonth = J & ""
  17.             txtDay = K & ""
  18.             FilePath = ThisWorkbook.Path & "\"
  19.              'specify the file name to be "Daily_yyyy_mm_dd.rpt"
  20.             If J < 10 And K < 10 Then
  21.                 FileName = "Daily_" & txtYear & "_0" & txtMonth & "_0" & txtDay & ".rpt"
  22.             ElseIf J < 10 And K >= 10 Then
  23.                 FileName = "Daily_" & txtYear & "_0" & txtMonth & "_" & txtDay & ".rpt"
  24.             ElseIf J >= 10 And K < 10 Then
  25.                 FileName = "Daily_" & txtYear & "_" & txtMonth & "_0" & txtDay & ".rpt"
  26.             ElseIf J >= 10 And K >= 10 Then
  27.                 FileName = "Daily_" & txtYear & "_" & txtMonth & "_" & txtDay & ".rpt"
  28.             End If
  29.             Product = txtProduct.Text
  30.             Contract = txtContract.Text
  31.             ' count total number of worksheets
  32.             isheetsnumber = ThisWorkbook.Sheets.Count
  33.             ' free the file number for input
  34.             iFNumber = FreeFile
  35.             ' resume if the .rpt file doesn't exist
  36. On Error GoTo errTrap
  37.             'input .rpt file
  38.             Open FilePath & FileName For Input As #iFNumber
  39.             SheetsName = Mid(FileName, 7, 10) & "f"
  40.             'small loop to test if the worksheet exists, exists =true otherwise false
  41.             For iM = 1 To isheetsnumber
  42.             If ThisWorkbook.Worksheets(iM).Name = SheetsName & "" Then ' &"" transform the number to string
  43.                 Sheets_Exist = True: Exit For
  44.             Else
  45.                 Sheets_Exist = False
  46.             End If
  47.             Next iM
  48.     'if sheet does not exist, then add one
  49.     If Sheets_Exist = False Then
  50.             Worksheets.Add.Name = SheetsName
  51.             ' move to the end
  52.             ActiveSheet.Move After:=Sheets(isheetsnumber)
  53.             N = 1
  54.             While Not EOF(1)
  55.                 Input #iFNumber, A(N, 1), A(N, 2), A(N, 3), A(N, 4), A(N, 5), A(N, 6), A(N, 7), A(N, 8)
  56.                 If N = 1 Then
  57.                     Sheets(SheetsName).Cells(1, 1) = A(1, 4)
  58.                     Sheets(SheetsName).Cells(1, 2) = A(1, 5)
  59.                     Sheets(SheetsName).Cells(1, 3) = A(1, 6)
  60.                     N = N + 1
  61.                 End If
  62.                 If A(N, 2) = Product And A(N, 3) = Contract Then
  63.                     Sec = Val(Left(Right(Str(A(N, 4)), 2), 2))
  64.                     Min = Val(Left(Right(Str(A(N, 4)), 4), 2))
  65.                     Hr = Val(Left(Right(Str(A(N, 4)), 6), 2))
  66.                     A(N, 9) = Str((Hr * 3600 + Min * 60 + Sec) - 31500)
  67.                     Sheets(SheetsName).Cells(N, 1).Value = Val(A(N, 4))
  68.                     Sheets(SheetsName).Cells(N, 2).Value = Val(A(N, 5))
  69.                     Sheets(SheetsName).Cells(N, 3).Value = Val(A(N, 6))
  70.                     Sheets(SheetsName).Cells(N, 4).Value = Val(A(N, 9))
  71.                     N = N + 1
  72.                 End If
  73.             Wend
  74.             Close 1
  75.             N = N - 2
  76.      End If
  77.             
  78.             MsgBox ("Total amount of data is " & Str(N))
  79. errTrap:
  80.    Resume Conti

  81. Conti:
  82.         Next K
  83.      Next J
  84.    
  85. Next Z
  86. End Sub
複製代碼
如果是同一個月份或是年份的話沒有問題,但是出現跨月的話,就出問題了。主要是因為一但跨月,日期就會從1號開始,在For Next 回圈裡面沒辦法處理,我曾經也是著用block If的判斷式想去分辨不同的情況,但是好像用If 之後沒辦法用For 這樣excel會告訴我“有If 但沒有End If"

請問有沒有辦法解決(或改寫)這個問題呢? 謝謝各位

PS: 原始檔案有點過大,無法附加,麻煩至 http://min.us/mx0lbUjTp 下載 (轉檔部份的Code作者為【程式交易聚寶盆】的CLCY大
作者: hugh0620    時間: 2012-5-16 11:48

回復 1# j1221

     但是好像用If 之後沒辦法用For 這樣excel會告訴我“有If 但沒有End If"
      樓主~ 這個問題是您在撰寫時~ 有寫IF 但沒有寫結尾Eed IF~      
     樓主的觀念的對的呀~若是誇月~ 我的寫法~ 直覺是用IF去判斷~
      因此~ 樓主 要不要再試一下~ 你原始的寫法~ 應該就可以解決跨月的問題~
作者: j1221    時間: 2012-5-16 20:49

回復 2# hugh0620

謝謝您的回覆,但是其實我就是利用這樣寫的,我的方法如下
  1. If iYear_s = iYear_e Then
  2.     Z = iYear_s
  3.     For J = iMonth_s To iMonth_e
  4.         If J = iMonth_s Then
  5.             For K = iDay_s To 31
  6.         Else
  7.             For K = 1 To iDay_e
  8.         End If
  9. End If
複製代碼
Excel 跳出的還是 “有Else 沒有If“ 請問問題是出在哪裡呢??
作者: hugh0620    時間: 2012-5-17 09:03

本帖最後由 hugh0620 於 2012-5-17 09:27 編輯

回復 3# j1221


    你有寫for 但是少了next~ 當然會產生錯誤呀~
    要在檢視一下~ 你寫的是不是一對一對的~
    if  
         for
               for
                           if    
                           end  if
               next
         next
     end if

檢查過你發文的程式碼~ 沒有問題~

要不要把你修改過後的完整程式碼po上來看看呢
作者: j1221    時間: 2012-5-17 21:13

回復 4# hugh0620


    謝謝您的幫忙,我想我應該在這邊沒有寫錯吧....以下為我的code
  1. Public Sub CommandButton1_Click()
  2. Dim FilePath As String, FileName As String

  3. Dim Product As String, Contract As String
  4. Dim Hr As Long, Min As Long, Sec As Long

  5. iYear_s = Val(txtYear_start.Text)
  6. iYear_e = Val(txtYear_end.Text)
  7. iMonth_s = Val(txtMonth_start.Text)
  8. iMonth_e = Val(txtMonth_end.Text)
  9. iDay_s = Val(txtDay_start.Text)
  10. iDay_e = Val(txtDay_end.Text)

  11. If iYear_s = iYear_e Then
  12.     Z = iYear_s
  13.     For J = iMonth_s To iMonth_e
  14.         If J = iMonth_s Then
  15.             For K = iDay_s To 31
  16.         Else
  17.             For K = 1 To iDay_e
  18.         End If
  19. End If
  20.             'transform number into string
  21.             txtYear = Z & ""
  22.             txtMonth = J & ""
  23.             txtDay = K & ""
  24.             FilePath = ThisWorkbook.Path & "\"
  25.              'specify the file name to be "Daily_yyyy_mm_dd.rpt"
  26.             If J < 10 And K < 10 Then
  27.                 FileName = "Daily_" & txtYear & "_0" & txtMonth & "_0" & txtDay & ".rpt"
  28.             ElseIf J < 10 And K >= 10 Then
  29.                 FileName = "Daily_" & txtYear & "_0" & txtMonth & "_" & txtDay & ".rpt"
  30.             ElseIf J >= 10 And K < 10 Then
  31.                 FileName = "Daily_" & txtYear & "_" & txtMonth & "_0" & txtDay & ".rpt"
  32.             ElseIf J >= 10 And K >= 10 Then
  33.                 FileName = "Daily_" & txtYear & "_" & txtMonth & "_" & txtDay & ".rpt"
  34.             End If
  35.             Product = txtProduct.Text
  36.             Contract = txtContract.Text
  37.             ' count total number of worksheets
  38.             isheetsnumber = ThisWorkbook.Sheets.Count
  39.             ' free the file number for input
  40.             iFNumber = FreeFile
  41.             ' resume if the .rpt file doesn't exist
  42. On Error GoTo errTrap
  43.             'input .rpt file
  44.             Open FilePath & FileName For Input As #iFNumber
  45.             SheetsName = Mid(FileName, 7, 10) & "f"
  46.             'small loop to test if the worksheet exists, exists =true otherwise false
  47.             For iM = 1 To isheetsnumber
  48.             If ThisWorkbook.Worksheets(iM).Name = SheetsName & "" Then ' &"" transform the number to string
  49.                 Sheets_Exist = True: Exit For
  50.             Else
  51.                 Sheets_Exist = False
  52.             End If
  53.             Next iM
  54.     'if sheet does not exist, then add one
  55.     If Sheets_Exist = False Then
  56.             Worksheets.Add.Name = SheetsName
  57.             ' move to the end
  58.             ActiveSheet.Move After:=Sheets(isheetsnumber)
  59.             N = 1
  60.             While Not EOF(1)
  61.                 Input #iFNumber, A(N, 1), A(N, 2), A(N, 3), A(N, 4), A(N, 5), A(N, 6), A(N, 7), A(N, 8)
  62.                 If N = 1 Then
  63.                     Sheets(SheetsName).Cells(1, 1) = A(1, 4)
  64.                     Sheets(SheetsName).Cells(1, 2) = A(1, 5)
  65.                     Sheets(SheetsName).Cells(1, 3) = A(1, 6)
  66.                     N = N + 1
  67.                 End If
  68.                 If A(N, 2) = Product And A(N, 3) = Contract Then
  69.                     Sec = Val(Left(Right(Str(A(N, 4)), 2), 2))
  70.                     Min = Val(Left(Right(Str(A(N, 4)), 4), 2))
  71.                     Hr = Val(Left(Right(Str(A(N, 4)), 6), 2))
  72.                     A(N, 9) = Str((Hr * 3600 + Min * 60 + Sec) - 31500)
  73.                     Sheets(SheetsName).Cells(N, 1).Value = Val(A(N, 4))
  74.                     Sheets(SheetsName).Cells(N, 2).Value = Val(A(N, 5))
  75.                     Sheets(SheetsName).Cells(N, 3).Value = Val(A(N, 6))
  76.                     Sheets(SheetsName).Cells(N, 4).Value = Val(A(N, 9))
  77.                     N = N + 1
  78.                 End If
  79.             Wend
  80.             Close 1
  81.             N = N - 2
  82.      End If
  83.             
  84.             MsgBox ("Total amount of data is " & Str(N))
  85. errTrap:
  86.    Resume Conti

  87. Conti:
  88.         Next K
  89.      Next J
  90.    

  91. End Sub
複製代碼

作者: hugh0620    時間: 2012-5-18 08:17

本帖最後由 hugh0620 於 2012-5-18 08:21 編輯

回復 5# j1221

     還真的寫錯了唷~
If iYear_s = iYear_e Then
    Z = iYear_s
    For J = iMonth_s To iMonth_e        
          If J = iMonth_s Then

            For K = iDay_s To 31
            
            NEXT K  

      Else
            For K = 1 To iDay_e

            next K

        End If
    next J
End If

按您原始的寫法~ 執行到For J = iMonth_s To iMonth_e 這一句~
如何跳到next J呢~  不可能唷~ 中間有END IF
在程式執行時~ 就會錯誤了~
你可以在IF .....   END IF 中間放在For  ...  Next
但不能把  next 放在 end  if後面~
作者: j1221    時間: 2012-5-18 10:42

回復 6# hugh0620

謝謝您的回覆!!

當初我是想要先判斷之後再開始回圈,也就是說我不想複製兩次重複的code (進入for之後的那部分) ,因為這樣整個程序會變得很長。

請問有辦法做到這樣嗎?




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