返回列表 上一主題 發帖

[發問] 更新下載速度、存取問題

回復 1# spermbank
1
  1.   Sub 巨集1()
  2.     '
  3.     '
  4.     Application.OnTime Now + TimeValue("00:00:10"), "巨集2"
  5. End Sub
複製代碼
2   2003版 中找不出錯誤

3  X = Year(Cells(1, 1))
    Y = Month(Cells(1, 1))
   Z = Day(Cells(1, 1))
'''''''''''''''''''''''''
   A = Split(Cells(1, 1), "/")
   X = A(0)
   Y = A(1)
   Z = A(2)

TOP

回復 3# spermbank
少一個連接符號 &
  f.Workbooks.Open "http://ichart.finance.yahoo.com/table.csv?s=" & s ".TW&a=" & i "&b=" & j "&c=" & k "&d=" & m "&e=" & n "&f=" & o  "&g=d&ignore=.csv

F.Workbooks.Open "http://ichart.finance.yahoo.com/table.csv?s=" & s & ".TW&a=" & i & "&b=" & j & "&c=" & k & "&d=" & m & "&e=" & n & "&f=" & o & "&g=d&ignore=.csv"

TOP

回復 1# spermbank
要開關 1298個檔案 速度快不了
  1. Sub 按鈕3_Click()
  2.     With ThisWorkbook.Sheets("Sheet1")
  3.         .Range("H" & 11).Formula = "更新中..."
  4.         ii = .Cells(6, 6) - 1 '起始月
  5.         j = .Cells(7, 6) '起始日
  6.         k = .Cells(5, 6) '起始年
  7.         m = .Cells(6, 8) - 1 '終止月
  8.         n = .Cells(7, 8) '終止日
  9.         o = .Cells(5, 8) '終止年
  10.         h = .Cells(9, 6) '存檔位置
  11.         Application.ScreenUpdating = False       '停止螢幕更新
  12.         For i = 2 To Application.CountA(.Range("A:A")) '欄位有值範圍計算
  13.             symbol = .Cells(i, 1)
  14.             save_file_name = h & symbol & ".csv" '存檔檔名
  15.             If .Range("C" & i).Formula = "市" Then
  16.                 '用excel來存檔
  17.                 Workbooks.Open "http://ichart.finance.yahoo.com/table.csv?s=" & symbol & ".TW&a=" & ii & "&b=" & j & "&c=" & k & "&d=" & m & "&e=" & n & "&f=" & o & "&g=d&ignore=.csv"
  18.             Else
  19.                 Workbooks.Open "http://ichart.finance.yahoo.com/table.csv?s=" & symbol & ".TWO&a=" & ii & "&b=" & j & "&c=" & k & "&d=" & m & "&e=" & n & "&f=" & o & "&g=d&ignore=.csv"
  20.             End If
  21.             With ActiveWorkbook   '檔案開啟後成為作用中的活頁簿
  22.                 .SaveAs save_file_name, 6, False '存成csv
  23.                 .Close False
  24.             End With
  25.         Next
  26.         .Range("H" & 11).Formula = "更新結束"
  27.     End With
  28.     Application.ScreenUpdating = True     '螢幕更新
  29. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2011-9-24 20:34 編輯

回復 8# spermbank
自己測試看看
  1. Sub 按鈕3_Click()
  2.     Set WinHttpReq = CreateObject("Microsoft.XMLHTTP")
  3.     With ThisWorkbook.Sheets("Sheet1")
  4.         .Range("H" & 11).Formula = "更新中..."
  5.         ii = .Cells(6, 6) - 1 '起始月
  6.         j = .Cells(7, 6) '起始日
  7.         k = .Cells(5, 6) '起始年
  8.         m = .Cells(6, 8) - 1 '終止月
  9.         n = .Cells(7, 8) '終止日
  10.         o = .Cells(5, 8) '終止年
  11.         h = .Cells(9, 6) '存檔位置
  12.         For i = 2 To Application.CountA(.Range("A:A")) '欄位有值範圍計算
  13.             symbol = .Cells(i, 1)
  14.             save_file_name = h & symbol & ".csv" '存檔檔名
  15.             If .Range("C" & i).Formula = "市" Then
  16.                 '用excel來存檔
  17.                 myURL = "http://ichart.finance.yahoo.com/table.csv?s=" & symbol & ".TW&a=" & ii & "&b=" & j & "&c=" & k & "&d=" & m & "&e=" & n & "&f=" & o & "&g=d&ignore=.csv"
  18.             Else
  19.                 myURL = "http://ichart.finance.yahoo.com/table.csv?s=" & symbol & ".TWO&a=" & ii & "&b=" & j & "&c=" & k & "&d=" & m & "&e=" & n & "&f=" & o & "&g=d&ignore=.csv"
  20.             End If
  21.             WinHttpReq.Open "GET", myURL, False
  22.             WinHttpReq.Send        '
  23.             myURL = WinHttpReq.ResponseBody
  24.             If WinHttpReq.Status = 200 Then
  25.                 With CreateObject("ADODB.Stream")
  26.                     .Open
  27.                     .Type = 1
  28.                     .Write WinHttpReq.ResponseBody
  29.                     .SaveToFile (save_file_name)
  30.                     .Close
  31.                 End With
  32.             End If
  33.         Next
  34.         .Range("H" & 11).Formula = "更新結束"
  35.     End With
  36. End Sub
複製代碼

TOP

回復 10# spermbank
  1. Sub 按鈕6_Click()
  2.     Dim Rng As Range
  3.     Sheets("Sheet1").Select
  4.     X = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  5.     For i = X To 2 Step -1
  6.         If Range("C" & i).Formula = "櫃" Then
  7.                 Range("A" & i, "C" & i).Delete Shift:=xlUp
  8.         End If
  9.     Next
  10. End Sub
  11. Sub 按鈕6_Click()
  12.     Dim Rng As Range
  13.     Sheets("Sheet1").Select
  14.     X = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  15.     For i = 2 To X
  16.         If Range("C" & i).Formula = "櫃" Then
  17.             If Rng Is Nothing Then
  18.                 Set Rng = Range("A" & i, "C" & i)
  19.             Else
  20.                 Set Rng = Union(Rng, Range("A" & i, "C" & i))
  21.             End If
  22.         End If
  23.     Next
  24.     Rng.Delete Shift:=xlUp
  25. End Sub
複製代碼

TOP

回復 12# spermbank
問題1 : 欄 或 列 的刪除.  需由 下往上  刪除.  由 上往下  刪除 會有漏網之魚
  1. for i=1 to 10      '由 上往下  刪除
  2. cells(i,1).Delete Shift:=xlUp  
  3. '例=1 -> 下方儲存格上移   cells(2,1)會上升為cells(1,1) 漏網掉
  4. '例=5 -> 下方儲存格上移   cells(6,1)會上升為cells(5,1) 漏網掉
  5. next
複製代碼

問題2: 如何讀取代號1101.csv第1欄所有日期(data),寫入excel中的sheet2的第1列中,並且讀取所有*.csv檔案中的第5欄(close)的資料,依序對照檔名與第1欄中的代號將第5欄資料寫入各代號的列位中
紅字部分 請附範例上來

TOP

回復 14# spermbank
  1. Sub 按鈕7_Click()
  2.     Dim TheCsv As String, ThePath As String, OpCsv As Workbook, CsvRange As Range, TheRow As Variant
  3.     ThePath = Sheets("Sheet1").Range("F9")                                          'D:\data\   請加上"\"
  4.     TheCsv = Dir(ThePath & "*.CSV")                                                 '傳回符合的第一個檔案名稱
  5.     If TheCsv = "" Then MsgBox ThePath & " 沒有 CSV檔案": Exit Sub
  6.     Application.ScreenUpdating = False
  7.     With Sheets("Sheet2")
  8.         If .[C1] <> "" Then .Range(.[C1], .[C1].End(xlToRight).End(xlDown)) = ""    '清空資料
  9.         Do While TheCsv <> ""
  10.             Set OpCsv = Workbooks.Open(ThePath & TheCsv)                            '打開 Csv
  11.             If .[C1] = "" Then                                                      '導入日期
  12.                 Set CsvRange = OpCsv.Sheets(1).Range("A:A").SpecialCells(xlCellTypeConstants).Offset(1) '設定範圍
  13.                 'SpecialCells ->特殊儲存格 ,參數(xlCellTypeConstants->包含常數的儲存格
  14.                 .[C1].Resize(, CsvRange.Rows.Count) = Application.Transpose(CsvRange)   '轉置-> Application.Transpose(範圍)
  15.             End If
  16.             TheRow = Replace(UCase(TheCsv), ".CSV", "")                                 'Replace ->替換文字
  17.             Set TheRow = .Range("A:A").Find(TheRow, LOOKAT:=xlWhole)                    '尋找 *.CSV 在Sheets("Sheet2")的位置
  18.             If Not TheRow Is Nothing Then                                               '找到 *.CSV 在Sheets("Sheet2")的位置
  19.                 Set CsvRange = OpCsv.Sheets(1).Columns(5).SpecialCells(xlCellTypeConstants).Offset(1)  '設定*.csv檔案中的第5欄(close)的資
  20.                 TheRow.Offset(, 2).Resize(, CsvRange.Rows.Count) = Application.Transpose(CsvRange)
  21.             End If
  22.             OpCsv.Close False
  23.             TheCsv = Dir
  24.         Loop
  25.     End With
  26.     Application.ScreenUpdating = True
  27. End Sub
複製代碼

TOP

本帖最後由 GBKEE 於 2011-9-27 10:58 編輯

回復 16# spermbank
可以改成           Set CsvRange = OpCsv.Sheets(1).Columns(1).SpecialCells(xlCellTypeConstants).Offset(1)
Range ("A:A") =>Columns("A:A")  單欄 Columns(1)
Range ("A:B") >= Columns("A:B")   
要怎麼先把第6欄(Volume)所有值都先除以1000再存入Sheet2呢?
AR = Application.Transpose(CsvRange) ->陣列從儲存格導入值時 每一維度的下限都是從1 開始  ->For i = 1 To UBound(AR)
  1. AR = Application.Transpose(CsvRange)
  2. For i = 1 To UBound(AR)
  3. AR(i) = AR(i) / 1000
  4. Next
  5. TheRow.Offset(, 2).Resize(, CsvRange.Rows.Count) = AR
複製代碼
回復 17# spermbank
  1. Sub Ex()
  2.     Dim x As Double, i As Double, AA()
  3.     x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  4.     ReDim AA(2 To x, 1 To 4)    '2 To x-> 第一維 指定從 2 到 X
  5.                                 '1 To 4-> 第二維 指定從 1 到 4
  6.     For i = 2 To x              '配合陣列維度的上下限
  7.         With Application
  8.         'With Application.WorksheetFunction                  '正統寫法
  9.             AA(i, 1) = .Sum(Cells(i, 3).Resize(, 5)) / 5
  10.             AA(i, 2) = .Average(Range("A" & i).Resize(, 20))  '20日-20個儲存格中的數值平均
  11.             AA(i, 3) = .Average(Range("A" & i).Resize(, 60))  '60日
  12.             AA(i, 4) = .Average(Range("A" & i).Resize(, 120)) '120日
  13.         End With
  14.     Next
  15. End Sub
  16. Sub Ex1()
  17.     x = Application.WorksheetFunction.CountA(Range("A:A")) '欄位有值範圍計算
  18.     Dim AA(2000, 3)     '2000-> 第一維 0-2000 共20001個
  19.                         '3   -> 第二維 0-3    共4個
  20.     For i = 2 To x
  21.         AA(i - 2, 0) = (Cells(i, 3) + Cells(i, 4) + Cells(i, 5) + Cells(i, 6) + Cells(i, 7)) / 5
  22.         AA(i - 2, 1) = Application.WorksheetFunction.Average(Range("A" & i & ": V" & i)) '20日-20個儲存格中的數值平均
  23.         AA(i - 2, 2) = Application.WorksheetFunction.Average(Range("A" & i & ": BJ" & i)) '60日
  24.         AA(i - 2, 3) = Application.WorksheetFunction.Average(Range("A" & i & ": DR" & i)) '120日
  25.     Next
  26. End Sub
複製代碼

TOP

回復 19# spermbank
工作表儲存格裡的函數 =TODAY()

TOP

        靜思自在 : 不怕事多,只怕多事。
返回列表 上一主題