Создать CSV из массива в VBA - PullRequest
2 голосов
/ 16 ноября 2010

Я начинающий программист, пытающийся автоматизировать некоторые повторяющиеся задачи на рабочем месте, которые должны выполняться умным сценарием вместо людей.Я сделал несколько VBA и Java, но очень простые вещи.

У нас есть некоторые данные, сгенерированные проверенной онлайн-формой, которая отправляется по электронной почте в почтовый ящик, а затем фильтр в почтовом клиенте (Outlook 2010) помещаетэто в определенную папку.Мое намерение состоит в том, чтобы написать некоторый VBA, который при запуске проверит содержимое этой папки, а затем для каждого почтового элемента получит текст сообщения в виде строки, создаст массив, а затем запишет содержимое массива в файл .csv.Затем я получу другое приложение (iMacros для Firefox), которое будет читать CSV и взаимодействовать с внутренним корпоративным веб-приложением, чтобы сделать все остальное.

Я думаю, что могу сделать все это, кроме записи содержимого массива в CSV..

Лучше всего я смотрю на примеры кода (я пытаюсь понять документацию по объектной модели MS), но лучшее, что я могу найти для записи массива VBA в CSV, это что-то вроде:

  'save the file
  Open sFileName For Output As #7
  For n = 0 To UBound(MyArray, 1)
    Print #7, Format(MyArray(n, 0), "0.000000E+00")
  Next n
  Close #7

Я думаю, что это VB, а не VBA, но справедлива ли общая идея здесь?Или, если у кого-то еще есть пример кода для начала работы или какие-либо другие указатели, я был бы очень признателен.

PS Также видел Как сохранить двумерный массив в виде файла csv? но не могу этого понять.

Ответы [ 2 ]

2 голосов
/ 25 апреля 2012

Код ниже работает для преобразования 2D-массивов в CSV.Я не написал код, но проверил его, и он работает!

' SaveAsCSV saves an array as csv file. Choosing a delimiter different as a comma, is optional.
'
' Syntax:
' SaveAsCSV dMyArray, sMyFileName, [sMyDelimiter]
'
' Examples:
' SaveAsCSV dChrom, app.path & "\Demo.csv"       --> comma as delimiter
' SaveAsCSV dChrom, app.path & "\Demo.csv", ";"  --> semicolon as delimiter
'
' Rev. 1.00 [8 jan 2003]
' written by P. Wester
' wester@kpd.nl


Public Sub SaveAsCSV(MyArray() As Variant, sFilename As String, Optional sDelimiter As String = ",")

Dim n As Long 'counter
Dim M As Long 'counter
Dim sCSV As String 'csv string to print

On Error GoTo ErrHandler_SaveAsCSV


'check extension and correct if needed
If InStr(sFilename, ".csv") = 0 Then
  sFilename = sFilename & ".csv"
Else
  While (Len(sFilename) - InStr(sFilename, ".csv")) > 3
    sFilename = Left(sFilename, Len(sFilename) - 1)
  Wend
End If

'If MultiDimensional(MyArray()) = False Then '1 dimension

  'save the file
'  Open sFileName For Output As #7
'  For n = 0 To UBound(MyArray(), 1)
'    Print #7, Format(MyArray(n, 0), "0.000000E+00")
'  Next n
'  Close #7

'Else 'more dimensional

  'save the file
  Open sFilename For Output As #7
  For n = 1 To UBound(MyArray(), 1)
    sCSV = ""
    For M = 1 To UBound(MyArray(), 2)
      sCSV = sCSV & Format(MyArray(n, M)) & sDelimiter
    Next M
    sCSV = Left(sCSV, Len(sCSV) - 1) 'remove last Delimiter
    Print #7, sCSV
  Next n
  Close #7

'End If

Exit Sub


ErrHandler_SaveAsCSV:
  Close #7
1 голос
/ 16 ноября 2010

Я не работаю с VB, поэтому я не уверен насчет открытого файла для вывода # 7, но если это сработает (протестируйте его с каким-либо случайным выводом), тогда ваш фрагмент кода правильный.Единственное, что у вас должен быть еще один вызов Print, где вы добавляете «,».

Просто убедитесь, что на последней итерации вы не добавляете ",".Вы можете сделать это, добавив оператор If, который будет проверять, если n = UBound (MyArray) - 1 (индекс последнего элемента).

Надеюсь, это поможет,

PM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...