Извлеките значения из CSV и поместите их на лист Excel

#excel #vba #csv

Вопрос:

У меня есть CSV-файл под названием HardwareMonitoring.csv, расположенный в маршруте D:GPU Информация

Мне нужно запустить макрос в моем файле Excel, чтобы извлечь некоторую информацию из файла CSV и поместить ее в лист Excel 1 следующим образом:

 LAST value of column B of CSV file should be placed in the cell G2 of the Excel file 
LAST value of column C of CSV file should be placed in the cell A2 of the Excel file 
LAST value of column D of CSV file should be placed in the cell B2 of the Excel file 
LAST value of column E of CSV file should be placed in the cell C2 of the Excel file 
LAST value of column F of CSV file should be placed in the cell D2 of the Excel file 
LAST value of column G of CSV file should be placed in the cell E2 of the Excel file 
LAST value of column H of CSV file should be placed in the cell F2 of the Excel file 
 

Обратите внимание: Строка последнего значения не всегда будет одной и той же строкой, она будет отличаться

Изображение последних строк CSV-файла
введите описание изображения здесь

Изображение файла Excel, в котором будет выполняться макрос
введите описание изображения здесь

Изображение того, как должен выглядеть Excel после запуска макроса
введите описание изображения здесь

Если макрос обнаруживает значения в файле Excel, идея заключается в том, что он может переопределить значения с помощью новых значений

Комментарии:

1. По крайней мере, какой разделитель использует csv-файл в обсуждении? Запятая? Tab ? Я имею в виду, является ли это файл с разделителями запятыми или какого типа, с этой точки зрения?

Ответ №1:

Извлечение из CSV

 Option Explicit

Sub UpdateRecent()
    
    ' Constants
    Const sFolderPath As String = "D:GPU Info"
    Const sfName As String = "HardwareMonitoring.csv"
    Const sCols As String = "B:H"
    Const dName As String = "Sheet1"
    Const dFirst As String = "A2"
    
    Application.ScreenUpdating = False
    
    ' Source
    
    ' Check for existence of file.
    Dim sFilePath As String: sFilePath = sFolderPath amp; sfName
    If Dir(sFilePath) = "" Then
        MsgBox "The file '" amp; sFilePath amp; "' does not exist."
        Exit Sub
    End If
    
    ' Close file if open.
    Dim swb As Workbook
    On Error Resume Next
    Set swb = Workbooks(sfName)
    On Error GoTo 0
    If Not swb Is Nothing Then
        swb.Close SaveChanges:=True
    End If
    
    ' Open file depending on the list separator. This works for me
    ' on my computers, but is not correct. You may need to use
    ' only one of those without the 'Select Case' or use 'OpenTextFile'
    ' illustrated in FaneDuru's solution.
    Select Case Application.International(xlListSeparator)
    Case ","
        Set swb = Workbooks.Open(Filename:=sFilePath)
    Case ";"
        Set swb = Workbooks.Open(Filename:=sFilePath, Local:=True)
    Case Else
        MsgBox "The list separator '" _
            amp; Application.International(xlListSeparator) amp; "' is not covered."
        Exit Sub
    End Select
    
    Dim sws As Worksheet: Set sws = swb.Worksheets(1)
    
    Dim sCell As Range
    Set sCell = sws.Cells.Find("*", , xlFormulas, , xlByRows, xlPrevious)
    If sCell Is Nothing Then
        swb.Close SaveChanges:=False              
        MsgBox "The worksheet is empty."
        Exit Sub
    End If

    Dim sData As Variant: sData = sws.Columns(sCols).Rows(sCell.Row).Value
    
    swb.Close SaveChanges:=False
    
    ' Result
    
    Dim cCount As Long: cCount = UBound(sData, 2)
    Dim dData As Variant: ReDim dData(1 To 1, 1 To cCount)
    dData(1, cCount) = sData(1, 1)
    Dim c As Long
    For c = 2 To cCount
        dData(1, c - 1) = sData(1, c)
    Next c
    
    ' Destination
    
    Dim dwb As Workbook: Set dwb = ThisWorkbook ' workbook containing this code
    Dim dws As Worksheet: Set dws = dwb.Worksheets(dName)
    Dim dCell As Range: Set dCell = dws.Range(dFirst)
    
    dCell.Resize(, cCount).Value = dData
    'dwb.Save

    Application.ScreenUpdating = True

End Sub
 

Комментарии:

1. Работаю над фликом! Спасибо!

Ответ №2:

Пожалуйста, попробуйте следующий код. Он не открывает файл csv в Excel. Предполагается, что разделителем csv является запятая ( » ,»), а разделителем строк является vbCrLf . Если нет, они должны быть изменены при отправке кода определенного сообщения. Он помещает результат обработки на активный лист, но легко адаптировать код для выбора необходимого:

 Private Sub ExtractFromCSV()
    Dim ws As Worksheet, strFile As String, sep As String, arrCSV, arrLast, i As Long, strProbl As String
                           
    Set ws = ActiveSheet 'you can use here the sheet you need (maybe "Sheet1")

    strFile = "D:GPU InfoHardwareMonitoring.csv"
    
    'Put the content of the csv file in an array (split by the line ending separator). If not vbCrLf, use the appropriate one:
    arrCSV = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(strFile, 1).ReadAll, vbCrLf)
      If UBound(arrCSV) = 0 Then MsgBox "The end line delimiter is not the chosen one (vbCrLf)...": Exit Sub
      
    sep = ","   'the csv file separator. Use here the correct one if not comma
    arrLast = Split(arrCSV(UBound(arrCSV)), sep) 'split the last array row, by csv separator (comma, Tab etc.)
      If UBound(arrLast) = 0 Then MsgBox "The csv delimiter is not the chosen one...": Exit Sub
      
      'Put the extracted values in their place on the sheet:
     ws.Range("A2:G2").value = Array(arrLast(2), arrLast(3), arrLast(4), arrLast(5), arrLast(1))
End Sub
 

Комментарии:

1. Разделитель CSV-файлов «,» но когда я выполняю его, в нем говорится «Ошибка 424, требуется объект», есть представление о том, что происходит?