изменение CSV-файла с помощью VBA - PullRequest
2 голосов
/ 08 октября 2019

Мне нужна помощь в изменении файла CSV с помощью VBA. Я провел исследование и придумал это решение. Тем не менее, я не могу получить ожидаемый результат. Так, например, у меня есть файл CSV:

ProductID,ProductName,SupplierName,CategoryID,Unit,Price
,,,,,
1,Chais,John Ray,1,10 boxes x 20 bags,18.00093483
2,Chang,Michael,1,24 - 12 oz bottles,19.66890343

Я хочу изменить все значения в productname и suppliername. И измените что-то вроде комбинации ProductID и имени столбца. Мой ожидаемый результат должен выглядеть следующим образом:

    ProductID,ProductName,SupplierName,CategoryID,Unit,Price
,,,,,
1,1 ProductName,1 SupplierName,1,10 boxes x 20 bags,18.00093483
2,2 ProductName,2 SupplierName,1,24 - 12 oz bottles,19.66890343

Это может происходить несколько раз и может изменить местоположение столбца. Это мой код:

Sub test()

    Dim FilePath As String, LineFromFile As Variant, LineItems() As String, strFile As Variant
    FilePath = "C:\Users\mestrivo\Documents\Files\MyFirstProg\test.csv"
    Open FilePath For Input As #1

    Do Until EOF(1)
        Line Input #1, LineFromFile
        LinteItems = Split(LineFromFile, ",")
        LineItems(1) = LineItems(0) & " ProductName"
        LineItems(2) = LineItems(0) & " SupplierName"
        strFile = Join(LineItems, ",")
    Loop

    Open "C:\Users\mestrivo\Documents\Files\MyFirstProg\test - 2.csv" For Output As #1

    Print #1, strFile
    Close #1

End Sub

Пожалуйста, помогите мне проверить мой код. Я получил ошибку в этой части:

Open "C:\Users\mestrivo\Documents\Files\MyFirstProg\test - 2.csv" For Output As #1

он говорит, что файл уже открыт.

Ответы [ 2 ]

2 голосов
/ 08 октября 2019

НИКОГДА не пишите жестко кодовые файловые дескрипторы, они не для вас, а для VBA для запроса того, что доступно, и дает вам бесплатный, пригодный для использования дескриптор файла. Для этого используйте функцию FreeFile.

Dim fileHandle As Long
fileHandle = FreeFile

Затем замените все жестко заданные маркеры #1 на #fileHandle.

Невозможно открыть два разных файла, используя один и тот же дескриптор. ,Вы уже открыли файл для ввода:

Open FilePath For Input As #1

Итак, когда вы пытаетесь использовать тот же дескриптор для вывода ...

Open "C:\Users\mestrivo\Documents\Files\MyFirstProg\test - 2.csv" For Output As #1

Вот когда вы получаете ошибку;вы еще не закрыли дескриптор #1, и теперь вы пытаетесь использовать его повторно, чтобы открыть другой файл - вы не можете этого сделать.

Вы имеете дело с двумя файлами, так что либо выоткройте первый, прочитайте его, , затем закройте его , прежде чем открывать второй, напишите в него и затем закройте его - или, вы открываете оба и пишете одному, как читаете другой, затем закрываетеоба.

В любом случае, вы не должны жестко кодировать дескрипторы файлов. Используйте FreeFile, чтобы получить бесплатный дескриптор файла. Всегда.

0 голосов
/ 08 октября 2019

Попробуйте это:

Sub test()
    Dim FilePath As String, LineFromFile As Variant, _
    LineItems() As String, strFile As Variant

    FilePath = "mycsv.csv"
    Open FilePath For Input As #1

    Do Until EOF(1)
        Line Input #1, LineFromFile
        LineItems() = Split(LineFromFile, ",")

        'I suggest to add the following 'If' statements
        If LineItems(0) <> "" Then
            LineItems(1) = LineItems(0) & " ProductName"
            LineItems(2) = LineItems(0) & " SupplierName"
        End If

        If strFile <> "" Then strFile = strFile & Chr(10)
        '-------------------------------------------------

        strFile = strFile & Join(LineItems, ",")
    Loop

    'In the next 'Open' statement you are trying to
    'assign an object over another that's already opened,
    'therefore you must close the previous object first
    'and / or declare the second one with another name
    Close #1
    Open "mycsv2.csv" For Output As #1
    Print #1, strFile
    Close #1
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...