Страницы: 1 2 След.
RSS
VBA. Макрос на обработку ряда CSV файлов в папке
 
Добрый день всем.
Ситуация такая, в папке есть куча файлов в CSV формате
Нужно в каждом файле в столбце F - цена, сделать к цене + 17%, т.е. цена * 1.17
При этом в столбце F могут быть как текстовые, так и числовые значения, так же попадаются ошибки.
До этого делала с обычным excel файлом, все работает, а тут ерунда получается.
Код макроса и образец файла прикладываю ниже.
Заранее спасибо.

Sub Bez_scidki()
   Dim folderPath As String
   Dim fileName As String
   Dim wb As Workbook
   Dim ws As Worksheet
   Dim lastRow As Long
   Dim i As Long
   Dim cellValue As Double
   
   ' Укажите путь к папке с файлами
   folderPath = "C:\Users\123\Desktop\Площадки\123\2024.07.16\New\"
   
   ' Перебираем все файлы в папке
   fileName = Dir(folderPath & "\*.csv")
   While fileName <> ""
       ' Открываем файл
       Set wb = Workbooks.Open(folderPath & "\" & fileName)
       
       ' Получаем первый лист
       Set ws = wb.Sheets(1)
       
       ' Проверяем, можно ли преобразовать столбец H в числовой формат
       For i = 2 To ws.Range("F" & ws.Rows.Count).End(xlUp).Row
           If IsNumeric(ws.Cells(i, "F").Value) Then
               cellValue = CDbl(ws.Cells(i, "F").Value) * 1.17
               ws.Cells(i, "F").Value = Format(cellValue, "0.00")
           Else
               ws.Cells(i, "F").Value = "0"
           End If
       Next i
       
       ' Сохраняем файл
       wb.Save
       
       ' Закрываем файл
       wb.Close
       
       ' Переходим к следующему файлу
       fileName = Dir()
   Wend
   
   MsgBox "Обработка файлов завершена.", vbInformation
End Sub
 
Здравствуйте. Вот в этой инструкции:
Код
              cellValue = CDbl(ws.Cells(i, "F").Value) * 1.17


cellValue - это что?

Помимо этого, когда вы руками открываете файл CSV - в каком столбце файла данные? Я так подозреваю, что в А, а в F ничего нету.
Изменено: Пытливый - 16.07.2024 20:15:03
Кому решение нужно - тот пример и рисует.
 
Не знаю, GPT писал, для excel работало. Для csv разрешение поменяла, не работает.
Хм скорее всего по столбцам Вы правы. Но тогда я в растерянности, как вообще изменить данные. Ручками более 50 файлов тяжело и долго.  
Изменено: Екатерина - 16.07.2024 20:08:42
 
Предложите адекватное (соответствующее Вашей задаче) название для темы, модераторы поменяют
ПРАВИЛА ФОРУМА
Цитата
2. Если создаете новую тему

  2.1. Название темы должно отражать смысл проблемы. Темы с названиями "Помогите", "Help", "Срочно", "Нужен макрос" - плохая идея.
Помощь будет приостановлена до устранения
Согласие есть продукт при полном непротивлении сторон
 
Прошу указать тему как "Помощь с макросом на обработку ряда CSV файлов в папке". Дубль тему удалить.
 
Эти файлы нужно открывать кодом как текст, бить в массив, там обрабатывать одно поле, и выгружать в другой файл.
Ну или построчно перегонять в другой файл, что собственно по сути одно и тоже.
А после открытия, изменения и сохранения Экселем файл уже будет другим, неизвестно примет ли его далее ваш техпроцесс...
Изменено: Hugo - 16.07.2024 20:25:26
 
Сравните - годится результат?
Тут правда округление сперва забыл, теперь заменил файл, тут округлено. 5 округляет вниз, Эксель форматом смотрю вверх... первая строка файла.
Изменено: Hugo - 16.07.2024 21:03:13
 
Хотя сейчас проверил в 365 - не портит уже csv Эксель, Открыл, чуть изменил, сохранил - разница только в том что менял. Молодцы ))
 
Вообще код заработал с одним дополнением - см. скрин.
Но вот сохранённое отличается от файла 1213123... Хотя при сохранении руками было ОК...
Изменено: Hugo - 16.07.2024 20:56:22
 
Екатерина,  проверьте.
С Вашим показанным csv работает.
 
Полный файл не обрабатывает выдает ошибку "Type mismatch"
В строке b(5) = Round(b(5) * proc, 2)

Забавно, но только определенные файлы.
Видно в файлах с ошибками встречается какой-то формат данных не подходящих для обработки.

Вечером еще погоняю. В каком месте именно ошибается непонятно, хотя один файл с ошибкой я точно выделила.  
Изменено: Екатерина - 17.07.2024 03:19:03 (Но там встретилась и ячейка "Знач" и текстовые данные в числовых.)
 
Цитата
Екатерина написал:
В строке b(5) = Round(b(5) * proc, 2)
- значит там не число, а текст. или нет цены.
Можете в этом месте ошибки (пока жёлтым подсвечено) посмотреть что за файл и в какой строке ошибка
Код
Sub obrabotka(s$, proc As Double)
Dim a, b, i&, result As Variant
a = Split(ReadTXTfile(s), vbNewLine)
For i = 1 To UBound(a)
If Len(a(i)) Then
b = Split(a(i), ";")
b(5) = Round(b(5) * proc, 2)
a(i) = Join(b, ";")
End If
Next
result = Writer_To(Join(a, vbNewLine), s)
End Sub

s - имя файла
i -  строка
b - массив данных строки.
Может там строка криво бьётся, выпадает одна ;
Если там всё ОК и цена не должна там быть - можно эту ошибку пропустить и не писать тогда строку назад в массив (a(i) = Join(b, ";")) а идти дальше.

Кстати можно этим кодом (когда всё наладится) цены и назад все быстро вернуть - ставим процент 1/1,17
 
Да, там текст. Можно как-то сделать, чтобы эти ошибки пропускались или строка с ошибкой удалялась? Я сегодня пыталась через gpt наваять. Но там похоже еще и есть места где сбита разбивка CSV, поэтому он мне пихает около 200 строк с ссылкой на соседнюю (предыдущую ячейку) в строке. Выложить сейчас не могу код, так как файлы дома на компьютере.

Последнее уже тоже оценила, спасибо большое)  
 
Цитата
Екатерина написал:
Можно как-то сделать, чтобы эти ошибки пропускались
- можно.
Оцените вариант.
Но сообщений об ошибках в сообщение влезает что-то около 18 штук, если больше то можно эту строку писать куда-то например прямо на этот лист.
И кстати если их не много и есть желание запомнить - с месиджбокса можно скопипастить!
 
Цитата
написал:
- можно.Оцените вариант.Но сообщений об ошибках в сообщение влезает что-то около 18 штук, если больше то можно эту строку писать куда-то например прямо на этот лист.И кстати если их не много и есть желание запомнить - с месиджбокса можно скопипастить!
Спасибо огромное. Посмотрю дома, на работе, к сожалению нет доступа к файлам нормального.
 
Цитата
Екатерина написал:
Но там похоже еще и есть места где сбита разбивка CSV
- если это нормальные файлы, то тогда их этим кодом не обработать, их нужно отдельно отложить и думать что с ними делать. Может первым кодом открывать, но там видите на скринах как оно сохраняет.. А вручную открыть/закрыть у меня сохранил нормально.
 
Цитата
написал:
если это нормальные файлы, то тогда их этим кодом не обработать, их нужно отдельно отложить и думать что с ними делать. Может первым кодом открывать, но там видите на скринах как оно сохраняет.. А вручную открыть/закрыть у меня сохранил нормально.
Я делала, чтобы копировались ошибки в excel отдельный файлик. У меня чуть больше 200 вышло с ошибками из нескольких десятков тысяч записей. Видела, что он тащит в проверку ячейки из столбцов E и D. Нужно смотреть почему, подозреваю, что что-то с разделителями. С утра не успела посмотреть. Разово попробую пройтись посмотреть, руками где нужно поправить. Позже эти файлы будут в работе долгое время, до очередного парсинга со стороны.  
 
Тогда может ещё в этом коде нужно доппроверку сделать - смотреть сколько полей в строке, и если не 11 - значит где-то сбита разметка.
А сейчас может и проскочить если например ОЕМ 33207529217 вместо цены пересчитает, а цену не тронет.
 
Там по идее если ОЕМ то текствое, не должен пересчитать.
Вроде gpt предложил сделать проверку, но она как-то коряво отрабывает.
Вроде и есть, а все равно поверх пытается цену проверять и выводит ошибку, что текстовое значение
Смотреть надо
 
Я прям совсем новичок в vba. Что где и как, смогу понять. Но с ноля код точно не напишу и далеко не все в нем понимаю. Просто есть задача пытаюсь решить с помощь gpt, поисковика и форумов. Excel обработку файлов так сделала, а тут проблемы)
Изменено: Екатерина - 17.07.2024 10:03:22
 
Вот добавил эту обработку, и в первой версии строки неправильно выводил, нужно +1
 
Цитата
написал:
Вот добавил эту обработку, и в первой версии строки неправильно выводил, нужно +1
Спасибо, вечером потестирую
 
Цитата
Екатерина написал:
Там по идее если ОЕМ то текствое, не должен пересчитать

---------------------------
Microsoft Excel
---------------------------
Обработка файлов завершена, есть ошибки в цене:

e:\Temp\Екатерина\\123.csv - строка 3 цена "413v99"

e:\Temp\Екатерина\\1234.csv - строка 7 сбита, цена "44133771,31"

e:\Temp\Екатерина\\12345.csv - строка 6 цена ""
---------------------------
ОК  
---------------------------

Пересчитывает как миленький...  ну если попадёт где значение без букв. Это уже несколько запусков делал, на значение не смотрите
Изменено: Hugo - 17.07.2024 10:08:04
 
ОУ тогда совсем беда печаль.
Надо проверку делать дополнительную.
Если я им ОЕМ запорю меня будут сильно убивать))
 
Цитата
Екатерина написал:
Если я им ОЕМ запорю
- нужно порядок в данных наводить.
Можно ещё дополнительно посмотреть длину этой цены, и чтоб цена была с запятой (круглых и без ,00 наверное нет?) - это если ОЕМ всегда больше самой большой цены
 
Цитата
написал:
- нужно порядок в данных наводить.Можно ещё дополнительно посмотреть длину этой цены, и чтоб цена была с запятой (круглых и без ,00 наверное нет?) - это если ОЕМ всегда больше самой большой цены
На самом деле круглые бывают, по крайней мере отображаются такие. Хотя надо будет посмотреть максимальную длину цены по файлам и сравнить с ОЕМ и уже к этому привязку делать. Но как это сделать я пока не понимаю)
 
Насчет порядка. Как я понимаю, это парсинговые данные с заграничных сайтов. Приходят раз в несколько месяцев. Причем я делала по двум направлениям новые прайсы, там тоже в исходниках такой бардак идет. Что я несколько дней только на формулы потратила.  
Изменено: Екатерина - 17.07.2024 10:14:11
 
Кстати только сейчас заметил что там в пути два \\, но не мешает - это из Вашего первого кода наложилось на мой ))
Так что тут можно путь указывать и без \ в конце
 
Цитата
написал:
Кстати только сейчас заметил что там в пути два \\, но не мешает - это из Вашего первого кода наложилось на мой ))Так что тут можно путь указывать и без \ в конце
Хм буду знать)
 
Насчёт бардака - нужно как-то код продумывать для облегчения работы. может GPT чем-то может помочь с такими файлами, но я не использую в этом направлении.
Страницы: 1 2 След.
Читают тему
Наверх