2016-11-16 1 views
0

У меня есть данные в столбцах excel, и я хочу извлечь первые 7 столбцов и сохранить их в другом файле csv. Имя файла будет в определенной форме основываться на информации, которую я собираю от пользователя, используя форму и другие данные, такие как отметка времени.Как сохранить заданный диапазон в excel как csv?

Я использую следующий код:

With Application.FileDialog(msoFileDialogFolderPicker) 
    .Title = "Select a Folder" 
    .AllowMultiSelect = False 
    .InitialFileName = "" '<~~ The start folder path for the file picker. 
    If .Show <> -1 Then GoTo NextCode 
    MyPath = .SelectedItems(1) & "\" 
End With 

NextCode: 

    With ActiveWorkbook 
     .SaveAs Filename:=MyPath & MyFileName, FileFormat:=xlCSV, CreateBackup:=False 
     Application.DisplayAlerts = False 
     ThisWorkbook.CheckCompatibility = False 
     .Close False 
    End With 

Но это пишет все столбцы в выводе CSV, а также закрывает открытый XLS (который я не хочу, чтобы закрыть).

+0

Совет: вместо 'Если .Show <> -1 Тогда GoTo NextCode', вы мог бы сделать 'If .Show = -1 Then Exit Sub' и избежать' GoTo' и метки строки. –

ответ

0

Это довольно игривый подход. Возможно, это не слишком практично, я также подозреваю, что это довольно медленно с большими объемами данных.

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

Option Explicit 

Sub ExportRange() 

    Dim mytxt As String 
    Dim fld As Object 

    With GetRecordset(ThisWorkbook.Sheets(2).UsedRange) 

     For Each fld In .Fields 
      mytxt = mytxt & fld.Name & ";" 
     Next fld 

     mytxt = mytxt & vbNewLine 

     While Not .EOF 
      For Each fld In .Fields 
       mytxt = mytxt & fld.Value & ";" 
      Next fld 
      mytxt = mytxt & vbNewLine 
      .movenext 
     Wend 

     Debug.Print mytxt 

    End With 

    Open ThisWorkbook.Path & "\test.csv" For Binary Access Write As #1 
     Put #1, , mytxt 
    Close #1 

End Sub 

Он использует эту функцию для чтения диапазонов (.UsedRange в моем примере) в наборах записей, без определения ADOdb ссылок и создания DB-Connection:

Function GetRecordset(rng As Range) As Object 
    'https://usefulgyaan.wordpress.com/2013/07/11/vba-trick-of-the-week-range-to-recordset-without-making-connection/ 

    Dim xlXML As Object 
    Dim rst As Object 

    Set rst = CreateObject("ADODB.Recordset") 
    Set xlXML = CreateObject("MSXML2.DOMDocument") 
    xlXML.LoadXML rng.Value(xlRangeValueMSPersistXML) 

    rst.Open xlXML 
    Set GetRecordset = rst 
End Function 

Edit:

Open ThisWorkbook.Path & "\test.csv" For Binary Access Write As #1 создает файл (если он не существует) и открывает его.

Очевидно, что вы можете использовать что-то вроде MyPath & "\test' & format(now, "yyyymmdd_hhmmss") & ".csv" вместо того, чтобы использовать файл с отметкой времени в папке вы выбрали с FolderPicker

+0

Как назвать файл, используя информацию, которую я собираю от пользователя в форме и отметке времени, и сохранить csv в папке выбора? –

Смежные вопросы