在后台工作簿中打开多个CSV,按日期排序并将特定列导入活动工作簿

时间:2018-09-21 12:05:30

标签: vba excel-vba loops csv

我有一个启用宏的工作簿(MRMTool_V6),在第一行中有资产名称。在A列中,我有日期,从最新到最旧的排序。

MRMTool_V6

我需要一些帮助来弄清楚如何打开一个新的工作簿-TempFile,它将通过MRMTool_V6第1行中的项目循环,将.CSV文件导入TempFile,按日期对数据进行排序,然后复制“关闭” ”,然后将其粘贴到主文件-MRMTool_V6。比清除TempFile的内容和连接,并对下一个资产重复相同的操作。

对于第1行中的每个资产,我都需要这样做,最好在后台完成,而不显示TempFile中发生的进程。

我需要这个,因为数据的长度不一致。对于大多数资产,我有不同的收盘价。将所有资产的所有数据导入单个文件后,需要按日期(从最新到最旧)进行排序。完成后,“出现数据漏洞。

我设法创建了一个文件,该文件之前会导入所有收盘价。

Data before sorting

按日期排序时,这就是结果。

data after sorting

这是我在此文件中使用的循环”

Dim CPDB As Worksheet
Dim FSO As Object
Dim Folder As Object
Dim CurrFile As Object
Dim i As Variant

Set CPDB = Sheets("Close Prices Database")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Folder = FSO.GetFolder("C:\Users\Betty\AppData\Roaming\MetaQuotes\Terminal\" & _
                                "B4D9BCD10BE9B5248AFCB2BE2411BA10\MQL4\Files")
Set CurrFile = Folder.Files

'   IMPORT HISTORICAL DATA FROM .CSV TO SHEET 'CPDB' FOR ALL ITEMS

    For Each CurrFile In Folder.Files
        i = CPDB.Cells(3, CPDB.Columns.Count).End(xlToLeft).Column
        If CPDB.Cells(2, 2) <> "" Then
            With CPDB.QueryTables.Add(Connection:="TEXT;" & CurrFile, _
                                        Destination:=CPDB.Cells(3, i + 1))
                .TextFileCommaDelimiter = True
                .TextFileSpaceDelimiter = True
                .TextFileColumnDataTypes = Array(9, 9, 9, 9, 9, 1, 9, 9, 9, 9)
                .Refresh BackgroundQuery:=False
                i = i + 1
            End With
        End If
    Next

您可以在这里找到此旧文件的完整代码:

https://pastebin.com/CwuJKJUb

为避免这种情况,我需要分别打开每个资产的.CSV文件,按日期对其进行排序,然后将收盘价导入主文件。

非常感谢所有指示和指导。

1 个答案:

答案 0 :(得分:0)

这不只是将多个CSV文件中的数据合并到Excel中的单个工作表中吗?我阅读了您的描述,但是我不知道该排序与什么有关。如果需要排序,则可以在所有内容合并在一起后最后进行。

' Merge data from multime files into one sheet.
Sub R_AnalysisMerger()
    Dim WSA As Worksheet
    Dim bookList As Workbook
    Dim SelectedFiles() As Variant
    Dim NFile As Long
    Dim FileName As String
    Dim Ws As Worksheet, vDB As Variant, rngT As Range

    Application.ScreenUpdating = False


    Set Ws = ThisWorkbook.Sheets(1)
    Ws.UsedRange.Clear
    'change folder path of excel files here
    SelectedFiles = Application.GetOpenFilename(filefilter:="Excel Files (*.csv*), *.csv*", MultiSelect:=True)


    For NFile = LBound(SelectedFiles) To UBound(SelectedFiles)
        FileName = SelectedFiles(NFile)
        Set bookList = Workbooks.Open(FileName, Format:=2)
        Set WSA = bookList.Sheets(1)
        With WSA
            vDB = .UsedRange
            Set rngT = Ws.Range("a" & Rows.Count).End(xlUp)(2)
            If rngT.Row = 2 Then Set rngT = Ws.Range("a1")
            rngT.Resize(UBound(vDB, 1), UBound(vDB, 2)) = vDB

            bookList.Close (0)
        End With
    Next
    Application.ScreenUpdating = True
    Ws.Range("A1").Select

End Sub