通过VBA导入和过滤.CSV文件到Excel

我试图从.csv导入到Excel电子表格中的数据(20)列,同时清理导入的数据。

我是使用VBA在Excel中执行任何操作的新手。 我的编程经验仅限于从大学回来的VB,所以我对这个想法有所了解。 我更愿意投入时间和精力,甚至购买几本书(有什么build议?)。

.csv文件如下所示:

Job:JS_010815_HEASB,Version:2.40,Units:USSurveyFeet,,,,,,,,,,,,,,,,, PS1457,17262086.61,711051.298,509.153,CONTROL POINT,,,,,,,,,,,,,,, JS2924,17262069.42,711898.13,505.726,CKP,CKP:POINT ID,PS7431,CKP:NOTES,,,,,,,,,,,, PS7431,17262069.36,711898.141,505.705,CP,CP:STYLE,PRIM. CONTROL,CP:TYPE,60D NAIL,CP:SIZE,,CP:CONDITION,UNDISTURBED,CP:PROTECTION,OTHER (SEE NOTES),CP:NOTES,,,, CD7,17262018.81,711181.868,508,PI,,,,,,,,,,,,,,, CD8,17262889.87,711158.429,510,PI,,,,,,,,,,,,,,, PS2337,17258986.57,711490.088,506.345,PI,,,,,,,,,,,,,,, CD5,17262001.04,711782.507,500,PI,,,,,,,,,,,,,,, JS2925,17261586.74,711741.759,502.677,WELD,WELD:TYPE,MAIN LINE,WELD:XRAY#,BML-901,WELD:JOINT# AHEAD,1708,WELD:JNT HD HEAT#,M75460,WELD:JOINT # BEHIND,1709,WELD:JNT BK HEAT#,M75460,WELD:STATION,716+59,WELD:NOTES JS2926,17261586.56,711746.613,507.221,NG,NG:REMARKS,4.5 COV,,,,,,,,,,,,, JS2927,17261628.59,711745.877,502.167,WELD,WELD:TYPE,TIE IN,WELD:XRAY#,BTI-028,WELD:JOINT# AHEAD,1724,WELD:JNT HD HEAT#,M75455,WELD:JOINT # BEHIND,1708,WELD:JNT BK HEAT#,M75460,WELD:STATION,717+01,WELD:NOTES JS2928,17261670.4,711749.899,501.692,WELD,WELD:TYPE,MAIN LINE,WELD:XRAY#,BML-926,WELD:JOINT# AHEAD,1725,WELD:JNT HD HEAT#,M75455,WELD:JOINT # BEHIND,1724,WELD:JNT BK HEAT#,M75455,WELD:STATION,717+43,WELD:NOTES 

我需要做的两件事是:

  1. 除去每个单元格中的“:”和其前面的内容。

  2. (次要)我想要在单元格A1中的信息,即作业:JS_010815_HEASB,并将其插入每行的末尾。

我build议最简单的方法是将其拆分成单独的部分:

  1. 导入(不确定是否要自动化,但如果你这样做,我已经包含了说明)。
  2. 过滤单元格,删除“:”
  3. 复制单元格A1结束(或移动列A,不确定)

import

导入非常简单,可以通过如下方式完成:

 Sub importCSV(file As String, wsName As String) Dim connection As String connection = "TEXT;" + file With Worksheets(wsName).QueryTables.Add(Connection:=connection, Destination:=Worksheets(wsName).Range("A1")) .Name = file .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlOverwriteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 437 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False ' If you were using a file with some other type of delimeter, you'd set this to false and then that one to true .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .Refresh BackgroundQuery:=False End With End Sub 

其中file是文件(包括目录), wsName是要导入到的工作表的名称。

过滤

要过滤单元格,请尝试以下操作:

 Sub filter(wsName As String) Dim c As Range For Each c In Worksheets(wsName).usedRange.Cells c.value = Right(c.value, Len(c.value) - InStr(c.value, ":")) Next End Sub 

它所做的是循环遍历给定工作表的usedRange中的每个单元格(其中wsName是工作表的名称),并将对象c为它。 然后,我们可以简单地将c.value设置为我们想要的任何新值,在我们的例子中,任何右边的所有东西:

为此,我们使用Right()函数,该函数接受一个string和一个integer作为length并返回右边的许多字符。 要计算出我们需要多less个字符,我们用Len()得到整个string的Len() ,并从中减去直到(包括InStr()的字符数。

InStr()返回字符的位置,如果它在那里,或者0,这意味着如果字符不在那里,我们将用string的长度调用Right() ,所以它会返回完整的input。)

复制

不完全确定你要去这里。 如果您尝试移动整个列,请使用:

 Sub moveColumnToEnd(wsName As String, colNum As Integer) Dim columnCount As Integer With Worksheets(wsName) columnCount = .UsedRange.Columns.Count .Columns(colNum).Cut .Columns(columnCount + 1).Insert End With End Sub 

其中, wsName是工作表的名称, colNum是要移动的列的编号(在您的案例1中)。 希望代码本身是非常明显的。 如果没有,请问。

如果您试图复制单元格A1 ,请尝试以下操作:

 Sub copyA1ToEnd(wsName As String) Dim columnCount As Integer Dim rowCount As Integer Dim copyRange As Range Dim c As Range With Worksheets(wsName) columnCount = .UsedRange.Columns.Count rowCount = .UsedRange.Rows.Count ' What we're doing here is getting the range from the first cell of the last column+1 ' all the way to the bottom most cell of that column. The Cells() command takes it's ' arguments (row, col) not (X, Y) like you'd probably expect. Set copyRange = .Range(.Cells(1, columnCount + 1), .Cells(rowCount, columnCount + 1)) ' Again, like in the filter function, we loop through each cell in the range and set ' it to what we want it to be For Each c In copyRange.Cells c.Value = .Range("A1").Value Next End With End Sub 

其中wsName是工作表的名称。 再次,希望这是相当自我解释。