返回列表 上一主題 發帖

[發問] 篩選資料並且放到新的Sheet裡

回復 9# candy516
股票代號: 有誤
表示在Sheets("Sheet1") 沒有用滑鼠選定股票代號
你的檔案Sheets("Sheet1")是選在 A1  "證券代碼"
請在Sheets("Sheet1")的A欄  選定一家的 證券代碼 再試試

TOP

回復 11# GBKEE


成功了!
前輩您所寫的程式是不是只能單獨選一支股票?

TOP

回復 13# candy516
你1樓的訴求不是這樣?
還有其他想法說說看

TOP

回復 14# GBKEE


不好意思~是我表達的不過清楚!
我的訴求是要將十年每股的資料全部抓至一個新的SHEET中!
就像是Hsieh 前輩所寫的程式那樣!
Hsieh 前輩的程式也以幫我解決我的問題!
很謝謝您的幫忙~^^

TOP

回復 15# candy516
試試看是否一樣
  1. Sub Ex()
  2.     Dim 除息日 As Date, 股票 As Range, R As Range, Ar(), E As Integer, i As Integer, ii As Integer
  3.     Sheets("Sheet2").Cells.Clear
  4.     For E = 2 To Sheets("Sheet1").UsedRange.Rows.Count
  5.         Set 股票 = Sheets("Sheet1").UsedRange.Rows(E).Cells(1)
  6.         除息日 = Format(Sheets("Sheet1").UsedRange.Rows(E).Cells(2), "0000/00/00")
  7.         ReDim Ar(1, 0)
  8.         i = 0
  9.         ii = 1
  10.         With Sheets(Year(除息日) & "")
  11.             Set 股票 = .Rows(1).Find(股票, LOOKAT:=xlPart, LookIn:=xlValues)  '找到股票代號名稱 日報酬率欄位
  12.             For Each R In .Range("A3:A" & .Range("A3").End(xlDown).Row)     '
  13.                 If R >= 除息日 And R <= 除息日 + 14 Then
  14.                     Ar(0, i) = R
  15.                     Ar(1, i) = R.Cells(1, 股票.Column)
  16.                     i = i + 1
  17.                     ReDim Preserve Ar(1, i)  '增加陣列的維數
  18.                 End If
  19.             Next
  20.             If i > 0 Then
  21.                 If Sheets("Sheet2").Range("IV" & ii).End(xlToLeft).Offset(, 1).Column >= Columns.Count - 1 Then ii = ii + 14
  22.                 With Sheets("Sheet2").Range("IV" & ii).End(xlToLeft).Offset(, 1) 'Range("IV1")往左有資料的第一個儲存格->Offset(, 1) 向右移動一欄
  23.                     .Cells(1, 2) = 股票
  24.                     .Cells(2, 1) = "年月日"
  25.                     .Cells(2, 2) = "日報酬率"
  26.                     .Cells(3, 1).Resize(i, 2) = Application.WorksheetFunction.Transpose(Ar)
  27.                 End With
  28.             End If
  29.         End With
  30.     Next
  31.     With Sheets("Sheet2")
  32.         .Columns(1).Delete
  33.         .Cells.EntireColumn.AutoFit
  34.         .Cells.EntireRow.AutoFit
  35.     End With
  36. End Sub
複製代碼

TOP

回復 16# GBKEE


這樣就跟Hsieh 所寫的一樣了!
一樣的結果,有不同的寫法!
VBA真的是太厲害了!
我還需要時間來研究一下這些程式碼!
以便我日後可以更改所要抓取的資料!
前輩們真的都很厲害耶!
謝謝您唷!

TOP

回復 6# Hsieh


   請問前輩:
    如果我要將原本的結果改成附檔那樣的方式呈現,我應該改哪個地方的程式碼呢?(附檔的Sheet2)
是這個地方嗎?
      B1.Copy .Cells(r, k)
      B2.Copy .Cells(r, k + 1)
      Rng.Copy .Cells(r + 2, k)
      Rng1.Copy .Cells(r + 2, k + 1)
謝謝您!

股價報酬率.rar (307.58 KB)

TOP

回復 17# candy516
  1. Sub ex()
  2. Dim A As Range, B As Range, B1 As Range, B2 As Range, C As Range, Rng As Range, Rng1 As Range, d As Object
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set sht = Sheets.Add(after:=Sheets(1))
  5. Application.ScreenUpdating = False
  6. With Sheet1
  7.    For Each A In .Range(.[A2], .[A65536].End(xlUp))
  8.       mystr = A & "," & Left(A.Offset(, 1), 4)
  9.       d(mystr) = DateValue(Format(A.Offset(, 1), "0000/00/00"))
  10.    Next
  11. End With
  12. k = 1: r = 1
  13. For Each ky In d.keys
  14. y = Split(ky, ",")(1)
  15. With Sheets(y)
  16. Set C = .Columns("A").Find(d(ky))
  17. Set B = .Rows(1).Find(Split(ky, ",")(0))
  18. If Not C Is Nothing And Not B Is Nothing Then
  19. x = Application.Max(3, C.Row - 14)
  20.    Set Rng = .Cells(x, 1).Resize(15, 1)
  21.    Set Rng1 = .Cells(x, B.Column).Resize(15, 1)
  22.    With sht
  23.       Rng.Copy .Cells(r, k)
  24.       Rng1.Copy .Cells(r, k + 1)
  25.       .Cells(r, 3) = y & "年第" & B.Column - 1 & "筆"
  26.    End With
  27.    r = r + 15
  28.    Else
  29.    MsgBox "無此除權資料"
  30. End If
  31. End With
  32. Next
  33. Application.ScreenUpdating = True
  34. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 18# Hsieh


謝謝前輩!又幫我解決一個問題了!
真的非常感謝您!
^^

TOP

本帖最後由 candy516 於 2011-3-27 17:28 編輯

回復 18# Hsieh


前輩您好~
我將一樣的程式碼入另外一個檔案中執行,但卻不能跑出正確的結果!
像是檔案中的SHEET1裡的證券代碼2801他在2004年出現3次,但他跑出來只會出現一次!(執行結果如附檔的SHEET4)
如果我只想要跑出事件日後第五天的報酬率(包含事件日當天),請問是要改哪裡呢?
不好意思一直麻煩您!= =
謝謝!

data10.rar (98.93 KB)

TOP

        靜思自在 : 人生最大的成就是從失敗中站起來。
返回列表 上一主題