首页 > 解决方案 > VBA - 将CSV中每行的第一个值存储到变量中并移动到特定工作表

问题描述

我对 VBA 比较陌生,如果可能的话,我一直想在 VBA 中执行以下操作

  1. 指向 CSV 文件
  2. 循环遍历每一行
  3. 使用每行的第一个值 - 将行的其余部分存储在特定工作表中

我已经设法做到了第 1 点和第 2 点,但是,我在第 3 点上苦苦挣扎

例如:我的 CSV 文件是这样的:

A00,5675,TGI,6897
R88,7647,35968,35864
R88,5968,34531,44566
Z11,2245,FGH,YIU

我想读取每一行的第一个值,在本例中为 A00、R88、R88 和 Z11。

然后根据该值将该特定行写入相应的工作表。

例如,A00 行将被写入名为 A00 的工作表,依此类推。

我已经得到了这么多的参考:

Sub ImportFile()
Dim ws As Worksheet, strFile As String

strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", , "Please select text file...") 'Select file

'If first value = A00 - write to ActiveWorkbook.Sheets("A00")
'If first value = Z99 - write to ActiveWorkbook.Sheets("Z99")

Set ws = ActiveWorkbook.Sheets("A00") 'Export to this worksheet

With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
     .TextFileParseType = xlDelimited
     .TextFileCommaDelimiter = True
     .Refresh
End With
End Sub

任何帮助将非常感激。

标签: excelvba

解决方案


我已经整理了一些 VBA 代码,这些代码似乎可以按照您的意愿工作。它逐行读取数据文件,使用“,”作为分隔符将此数据拆分为数组,将工作表设置为数组的第一个元素,然后将其余元素放入第一个空白处的单元格中线。


Sub sGetData()
    On Error GoTo E_Handle
    Dim ws As Worksheet
    Dim lngLastRow As Long
    Dim strFile As String
    Dim intFile As Integer
    Dim strInput As String
    Dim aData() As String
    Dim lngLoop1 As Long
    intFile = FreeFile
    strFile = "J:\downloads\test3.txt"
    Open strFile For Input As intFile
    Do
        Line Input #intFile, strInput
        aData() = Split(strInput, ",")
        Set ws = Worksheets(aData(LBound(aData)))
        lngLastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        For lngLoop1 = LBound(aData) + 1 To UBound(aData)
            ws.Cells(lngLastRow + 1, lngLoop1) = aData(lngLoop1)
        Next lngLoop1
    Loop Until EOF(intFile)
sExit:
    On Error Resume Next
    Close #intFile
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sGetData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

它可能与一些“防弹”有关,以处理诸如工作表不存在之类的事情,但它应该给你一个想法。

问候,


推荐阅读