- 帖子
- 90
- 主題
- 16
- 精華
- 0
- 積分
- 114
- 點名
- 0
- 作業系統
- XP
- 軟體版本
- sp2
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2011-7-9
- 最後登錄
- 2018-10-7
|
2#
發表於 2012-6-23 18:00
| 只看該作者
本帖最後由 white5168 於 2012-6-23 22:57 編輯
在Sheet1的程式碼- Private Sub 大盤成交資訊_Click()
- Dim Year As String
- Dim Mon As String
-
- Year = Format(Range("C1"), "0000") '修改字串格式
- Mon = Format(Range("C2"), "00") '修改字串格式
- Call Run(Year, Mon) '呼叫Module1中的函數
- End Sub
複製代碼 在Module1的程式碼- Sub Run(Year As String, Month As String)
- Dim sheetName As String
- sheetName = "Temp"
-
- If CheckSheetExist(sheetName) <> True Then '確定Temp工作表是否存在,若不存在則呼叫AddTempSheet建立Temp工作表
- Call AddTempSheet(sheetName)
- End If
-
- Call ClearTempTablesData(sheetName) '避免Temp工作表存在時資料格式未清除,而清除
- Call GetPrice(sheetName, Year, Month) '從TWSE取得大盤歷史資料
- Call ClearsheetTablesData("Sheet1") '清除原本在Sheet1工作表的資料
- Call SetCellWidthSize(sheetName) '設定TWSE取得的資料所造成的格式,將此格式調整為excel預設的儲存格格式
- Call CopyDatatoSheet(sheetName) '將Temp工作表資料拷貝至Sheet1工作表
- Call DeleteTempSheet(sheetName) '刪除Temp工作表
- Sheets("Sheet1").Select '將focus設定到Sheet1工作表
- End Sub
- Function CheckSheetExist(sheetName As String) As Boolean
- Dim i As Integer
- CheckSheetExist = False
- For i = 1 To Worksheets.Count '取得目前工作表的數量
- If sheetName = Worksheets(i).Name Then '判斷指定的工作表名稱是否存在,存在則回傳找到工作表的訊息
- CheckSheetExist = True '將找到的訊息設定至回傳值
- End If
- Next
- End Function
- Sub AddTempSheet(sheetName As String)
- ActiveWorkbook.Worksheets.Add After:=Worksheets(Worksheets.Count) '建立指定工作到現存工作表的對後面
- Worksheets(Worksheets.Count).Select '選擇建立工作表
- ActiveSheet.Name = sheetName '修改工作表名稱
- End Sub
- Sub GetPrice(sheetName As String, Year As String, Month As String)
-
- Sheets(sheetName).UsedRange.Select '選取指定工作表A1:H50的儲存格範圍
- Selection.Clear '清除所選取儲存格格式
- Selection.ClearContents '清除所選取的資料
- Sheets(sheetName).Range("A1").Select '選取Temp工作表A1儲存格,避免使用QueryTable後,因為資料擠壓會造成儲存格右移,導致foucs不在A1儲存格上而發生錯誤訊息
-
- '以下就不多介紹,Excel相關內容
- With ActiveSheet.QueryTables.Add(Connection:= _
- "TEXT;http://www.twse.com.tw/ch/trading/exchange/FMTQIK/FMTQIK2.php?STK_NO=&myear=" & Year & "&mmon=" & Month & "&type=csv", _
- Destination:=Range("A1"))
- .Name = "大盤歷史資料"
- .FieldNames = True
- .RowNumbers = False
- .FillAdjacentFormulas = False
- .PreserveFormatting = True
- .RefreshOnFileOpen = False
- .RefreshStyle = xlInsertDeleteCells
- .SavePassword = False
- .SaveData = True
- .AdjustColumnWidth = True
- .RefreshPeriod = 0
- .TextFilePromptOnRefresh = False
- .TextFilePlatform = 950
- .TextFileStartRow = 1
- .TextFileParseType = xlDelimited
- .TextFileTextQualifier = xlTextQualifierDoubleQuote
- .TextFileConsecutiveDelimiter = False
- .TextFileTabDelimiter = False
- .TextFileSemicolonDelimiter = False
- .TextFileCommaDelimiter = True
- .TextFileSpaceDelimiter = False
- .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
- .TextFileTrailingMinusNumbers = True
- .Refresh BackgroundQuery:=False '若沒有 Sheets(sheetName).Range("A1").Select,在此行會發生錯誤
- If Err.Number <> 0 Then Err.Clear: MsgBox "資料查詢失敗" '被免資料抓取不成功,而顯示訊息
- End With
- End Sub
- Sub SetCellWidthSize(sheetName As String)
- Dim n As Integer
- Worksheets(sheetName).Select
- n = ActiveSheet.Range("A1").End(xlDown).Row '取得選取有存在資料的儲存格列數
- ActiveSheet.Range("A1:F" & n).UseStandardWidth = True '設定指定工作表的儲存格寬度為預設值
- End Sub
- Sub CopyDatatoSheet(sheetName As String)
- Dim n As Integer
-
- Worksheets(sheetName).Select '選取指定名稱工作表
- n = ActiveSheet.Range("A3").End(xlDown).Row - 1 '取得選取有存在資料的儲存格列數
- ActiveSheet.Range("A3:F" & n).Copy '複製選取的儲存格資料
-
- Worksheets("Sheet1").Select '選取Sheet1工作表
- Range("A5").Select '選取A5儲存格
- ActiveSheet.Paste '貼上資料
- End Sub
- Sub ClearsheetTablesData(sheetName As String)
- Dim n As Integer
- Dim qyt As QueryTable
-
- Worksheets(sheetName).Select
- If ActiveSheet.Range("A5") <> "" Then '判斷目前的活頁簿是否有資料存在, 這行可以再寫的更謹慎,歡迎各位自行修改
- n = ActiveSheet.Range("A5").End(xlDown).Row '選取目前活頁簿從A4位置到最後一行的範圍
- For Each qyt In ActiveSheet.QueryTables '選取用QueryTables抓取的每一行
- qyt.Delete '將使用QueryTables方法所產生的行進行刪除,避免QueryTables用久了,造成系統堆積一堆QueryTables的垃圾,如此系統才部會變慢
- Next
- ActiveSheet.Range("A5:G" & n).Clear '清除所選取儲存格格式
- ActiveSheet.Range("A5:G" & n).ClearContents '清除所選取的資料
- Else
- ActiveSheet.Range("A5:G40").Clear '清除所選取儲存格格式
- ActiveSheet.Range("A5:G40").ClearContents '清除所選取的資料
- End If
- End Sub
- Sub DeleteTempSheet(sheetName As String)
- Worksheets(sheetName).Select
- Application.DisplayAlerts = False '關閉警告視窗
- Worksheets(sheetName).Delete '刪除作用中的工作表
- Application.DisplayAlerts = True '恢復警告視窗
- End Sub
- Sub ClearTempTablesData(sheetName As String)
- Dim n As Integer
- Dim qyt As QueryTable
-
- Worksheets(sheetName).Select '選取指定名稱工作表
- If ActiveSheet.Range("A1") <> "" Then
- n = ActiveSheet.Range("A1").End(xlDown).Row '選取目前活頁簿從A1位置到最後一行的範圍
- For Each qyt In Worksheets(sheetName).QueryTables '選取用QueryTables抓取的每一行
- qyt.Delete '將使用QueryTables方法所產生的行進行刪除,避免QueryTables用久了,造成系統堆積一堆QueryTables的垃圾,如此系統才部會變慢
- Next
- ActiveSheet.Range("A1:F" & n).Clear '清除所選取儲存格格式
- ActiveSheet.Range("A1:F" & n).ClearContents '清除所選取的資料
- Else
- ActiveSheet.UsedRange.Clear '清除所選取儲存格格式
- ActiveSheet.UsedRange.ClearContents '清除所選取的資料
- End If
- End Sub
複製代碼 |
|