Форум программистов, компьютерный форум, киберфорум
VBScript/JScript/WSH/WMI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
VBS

По очереди открывать каждый CSV-файл, запускать макрос и сохранять этот файл в формате XLSX

02.02.2017, 00:06. Показов 2711. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите написать скрипт который будет:

У меня есть много файлов в папке С:\1\ имя1.csv имя2.csv .... имя99.csv
Нужно чтобы скрипт открывал файлы по очереди и запускал макрос, после выполнения макроса сохранял файл в С:\2\ как имя1.xlsx имя2.xlsx .... имя99.xlsx


Добавлено через 1 час 25 минут
Нашел на сайте вот этот скрипт:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
strTempPath = "D:\PRIBOR"
Set objFSO=CreateObject("Scripting.FileSystemObject") 
Set objFolder=objFSO.GetFolder(strTempPath) 
 
 
For Each objFile In objFolder.Files 
Ext = Mid(objFile, InstrRev(objFile, ".") + 1)
 
If Ext = "xls" Then 
OutFile = Left(objFile.Path, Len(objFile.Path) - Len(Ext) - 1)
Set XL = CreateObject("Excel.Application")
XL.Visible = False
XL.Workbooks.Open objFile
XL.ActiveWorkbook.SaveAs OutFile & ".csv",6
XL.ActiveWorkbook.Saved = True
XL.ActiveWindow.Close
XL.Quit
End If
Next
Он открывает файл и сохраняет с другим расширением. Помогите дописать его, чтобы перед закрытием он сначала выполнял макрос

Добавлено через 1 час 10 минут
Заметил такую проблему, если запустить первую часть скрипта:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 strTempPath = "D:\PRIBOR"
Set objFSO=CreateObject("Scripting.FileSystemObject") 
Set objFolder=objFSO.GetFolder(strTempPath) 
 
 
For Each objFile In objFolder.Files 
Ext = Mid(objFile, InstrRev(objFile, ".") + 1)
 
If Ext = "csv" Then 
OutFile = Left(objFile.Path, Len(objFile.Path) - Len(Ext) - 1)
Set XL = CreateObject("Excel.Application")
XL.Visible = True
XL.Workbooks.Open objFile
End
То имя.csv открывается и значения всех ячеек переносятся в столбец А и разделяются между собой знаком ; (2;5;65;56;34;76).
А если открыть файл имя.csv вручную, то все нормально, каждое значение в своей ячейки. Подскажите как открыть скриптом этот долбанный.csv чтобы значения оставались в своих ячейках?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.02.2017, 00:06
Ответы с готовыми решениями:

Как можно открывать и сохранять файл через диалоговые окна?
Есть типизированная файловая переменная, как можно открывать и сохранять файл через диалоговые окна?

Ряд динамически созданных MaskedTextBox сохранять в файл/открывать из файла
Помогите разобраться с SaveFileDialog. Вот наворотил : private void saveToolStripMenuItem_Click(object sender, EventArgs e) ...

Макрос. Файл закрыть и не сохранять
Всем доброго времени суток. собственно, вопрос прописан в теме . этот код ActiveWorkbook.Save ActiveWindow.Close ...

11
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
02.02.2017, 10:08
Цитата Сообщение от Tromal5 Посмотреть сообщение
... перед закрытием он сначала выполнял макрос...
используйте метод Run объекта Application:
Visual Basic
1
XL.Run "module1.test1"
Здесь test1 - имя запускаемого макроса, module1 - имя модуля, в котором описан макрос.
Цитата Сообщение от Tromal5 Посмотреть сообщение
... как открыть скриптом этот долбанный.csv чтобы значения оставались в своих ячейках?
Попробуйте использовать вместо метода Open объекта Workbooks метод OpenText того же объекта, указав True в качестве значения параметра Local (он последний, 18-й по счёту):
Visual Basic
1
XL.Workbooks.OpenText objFile, , , , , , , , , , , , , , , , , True
0
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
02.02.2017, 12:21  [ТС]
Попробовал запустить на рабочем компе, получается совсем странно:
Исходный csv:
Code
1
2
3
4
       А      В      С      D
1:  Пусто | 3,15 | 5,67 | 4,85 |
2:  Пусто | 5,66 | 9,99 | 2,25 |
3:  Пусто | 1,45 | 5,08 | 6;53 |
Открывается методом Open:
Code
1
2
3
4
        А          В      С      D
1:      3;     | 15;5 | 67;4 |  85  |
2:      5;     | 66;9 | 99;2 |  25  |
3:      1;     | 45;5 | 08;6 |  53  |
Открывается методом OpenText:
Code
1
2
3
4
               А            В       С       D
1:      3;15;5;67;4;85  | Пусто | Пусто | Пусто | 
2:      5;66;9;99;2;25  | Пусто | Пусто | Пусто | 
3:      1;45;5;08;6;53  | Пусто | Пусто | Пусто |
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
02.02.2017, 12:30
Tromal5, приложите, пожалуйста, исходный CSV-файл (если не секрет, конечно).
0
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
02.02.2017, 14:26  [ТС]
В архиве исходный csv и конечный результат xlsx
Вложения
Тип файла: zip download.zip (591.0 Кб, 4 просмотров)
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
02.02.2017, 21:24
В вашем случае открывать CSV-файл надо так:
Visual Basic
1
XL.Workbooks.OpenText objFile, , , , , , , True
Однако, вероятно, будет проблема с кириллицей, т.к. исходный файл имеет кодировку UTF-8.
В этом случае перевести заголовочную часть на рабочем листе в нормальный вид можно, например, так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Set objFS = CreateObject("Scripting.FilesystemObject")
arrTemp = Split(objFS.OpenTextFile(objFile, 1).ReadAll, ";")
strTemp = StrConv(arrTemp(1), "utf-8", "windows-1251")
Set XL = CreateObject("Excel.Application")
XL.Visible = True
XL.Workbooks.OpenText objFile, , , , , , , True
XL.ActiveWorkbook.Worksheets(1).Range("a1").Value = StrConv(arrTemp(0), "utf-8", "windows-1251")
XL.ActiveWorkbook.Worksheets(1).Range("b1").Value = Mid(strTemp, 1, InStr(strTemp, vbLf) - 1)
XL.ActiveWorkbook.Worksheets(1).Range("a3").Value = Mid(strTemp, InStrRev(strTemp, vbLf) + 1)
 
'======
 
Function StrConv(strTxt, strSrcCharset, strDstCharset)
Dim objStream
 
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Mode = 3
objStream.Open
objStream.Charset = strDstCharset
objStream.WriteText strTxt
objStream.Position = 0
objStream.Charset = strSrcCharset
StrConv = objStream.ReadText
End Function
0
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
23.03.2017, 11:09  [ТС]
Спасибо за помощь, сейчас файл открывается и сохраняется как нужно. Но так как этот файл будет использоваться на разных компьютерах, то макрос нужно вписать​ внутри кода.С этим у меня небольшая проблема.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
strTempPath = "C:\Do*cuments and Settings*\757-Shishov\Рабочий стол\груздов"
Set objFSO=CreateObj*ect("Scripting.FileS*ystemObject")
Set objFolder=objFSO*.GetFolder(strTempPa*th)    
For Each objFile In objFolder.Files
Ext = Mid(objFile, InstrRev(objFile, ".") + 1)  
If Ext = "csv" Then OutFile = Left(objFi*le.Path, Len(objFile*.Path) - Len(Ext) - 1)
 
Set XL = CreateObjec*t("Excel.Application*")
XL.Visible = True
'XL.Workbooks.Open objFile,,,,,,,,,,,,,T*rue
 
XL.Workbooks.OpenText objFile, , , , , , , True
 
 
XL.Columns("A:A").Se*lect
    XL.Selection.Del*ete Shift = xlToLeft
    XL.Rows("1:1").S*elect
    XL.Selection.Del*ete Shift = xlUp
    XL.Selection.Del*ete Shift = xlUp
    XL.Cells.Select
    XL.Range("HO208"*).Activate
    XL.Selection.Col*umnWidth = 0.25
    XL.Cells.EntireR*ow.AutoFit               
    XL.Selection.Row*Height = 2.25
    XL.ActiveWindow.*ScrollRow = 1
    XL.ActiveWindow.*ScrollColumn = 1
 
    XL.Selection.For*matConditions.AddCol*orScale ColorScaleTy*pe = 3
XL.Selection.For*matConditions(Select*ion.FormatConditions*.Count).SetFirstPrio*rity
XL.Selection.For*matConditions(1).Col*orScaleCriteria(1).T*ype = _
        xlConditionV*alueLowestValue
    With XL.Selectio*n.FormatConditions(1*).ColorScaleCriteria*(1).FormatColor
        .Color = 7039480
        .TintAndShade = 0
    End With
XL.Selection.For*matConditions(1).Col*orScaleCriteria(2).T*ype = _
        xlConditionV*aluePercentile
XL.Selection.For*matConditions(1).Col*orScaleCriteria(2).V*alue = 50
    With XL.Selectio*n.FormatConditions(1*).ColorScaleCriteria*(2).FormatColor
        .Color = 8711167
        .TintAndShade = 0
    End With
XL.Selection.For*matConditions(1).Col*orScaleCriteria(3).T*ype = _
        xlConditionV*alueHighestValue
    With XL.Selectio*n.FormatConditions(1*).ColorScaleCriteria*(3).FormatColor
        .Color = 8109667
        .TintAndShade = 0
    End With
 
 
'XL.ActiveWorkbook.S*aveAs OutFile & ".xl*sx" , 51
'XL.ActiveWorkbook.S*aved = True
'XL.ActiveWindow.Clo*se
'XL.Quit
 
Next
Строка: 28
Символ: 5
Ошибка: Индекс выходит за пределы допустимого диапазона.
До этой строки все работает как нужно.

Добавлено через 14 минут
Сори, В коде появились звездочки почему-то, не могу убрать их. Вот еще раз код без звездочек.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
strTempPath = "C:\Documents and Settings\757-Shishov\Рабочий стол\груздов"
Set objFSO=CreateObject("Scripting.FileSystemObject")
Set objFolder=objFSO.GetFolder(strTempPath)    
For Each objFile In objFolder.Files
Ext = Mid(objFile, InstrRev(objFile, ".") + 1)  
If Ext = "csv" Then OutFile = Left(objFile.Path, Len(objFile.Path) - Len(Ext) - 1)
 
Set XL = CreateObject("Excel.Application")
XL.Visible = True
'XL.Workbooks.Open objFile,,,,,,,,,,,,,True
 
XL.Workbooks.OpenText objFile, , , , , , , True
 
 
XL.Columns("A:A").Select
    XL.Selection.Delete Shift = xlToLeft
    XL.Rows("1:1").Select
    XL.Selection.Delete Shift = xlUp
    XL.Selection.Delete Shift = xlUp
    XL.Cells.Select
    XL.Range("HO208").Activate
    XL.Selection.ColumnWidth = 0.25
    XL.Cells.EntireRow.AutoFit               
    XL.Selection.RowHeight = 2.25
    XL.ActiveWindow.ScrollRow = 1
    XL.ActiveWindow.ScrollColumn = 1
 
    XL.Selection.FormatConditions.AddColorScale ColorScaleType = 3
XL.Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
XL.Selection.FormatConditions(1).ColorScaleCriteria(1).Type = _
        xlConditionValueLowestValue
    With XL.Selection.FormatConditions(1).ColorScaleCriteria(1).FormatColor
        .Color = 7039480
        .TintAndShade = 0
    End With
XL.Selection.FormatConditions(1).ColorScaleCriteria(2).Type = _
        xlConditionValuePercentile
XL.Selection.FormatConditions(1).ColorScaleCriteria(2).Value = 50
    With XL.Selection.FormatConditions(1).ColorScaleCriteria(2).FormatColor
        .Color = 8711167
        .TintAndShade = 0
    End With
XL.Selection.FormatConditions(1).ColorScaleCriteria(3).Type = _
        xlConditionValueHighestValue
    With XL.Selection.FormatConditions(1).ColorScaleCriteria(3).FormatColor
        .Color = 8109667
        .TintAndShade = 0
    End With
 
 
'XL.ActiveWorkbook.SaveAs OutFile & ".xlsx" , 51
'XL.ActiveWorkbook.Saved = True
'XL.ActiveWindow.Close
'XL.Quit
 
Next
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
23.03.2017, 12:05
Оператор в строке 28 должен выглядеть так:
Visual Basic
1
XL.Selection.FormatConditions.AddColorScale 3
1
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
23.03.2017, 13:03  [ТС]
Спасибо, помогло. Оставил только эту строчку, остальные убрал, так как они все равно не дают нужный мне результат.
Сейчас код работает, но есть один недостаток.
Когда он раскрашивает ячейки, то он меньшие значения красит в красный, а большие в зеленый. Впринципе можно оставить и так, но так как это тепловизионный снимок, то гарячие места хотелось бы видеть красным, а не зеленым.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
strTempPath = "C:\Documents and Settings\757-Shishov\Рабочий стол\груздов"
Set objFSO=CreateObject("Scripting.FileSystemObject")
Set objFolder=objFSO.GetFolder(strTempPath)    
For Each objFile In objFolder.Files
Ext = Mid(objFile, InstrRev(objFile, ".") + 1)  
If Ext = "csv" Then OutFile = Left(objFile.Path, Len(objFile.Path) - Len(Ext) - 1)
 
Set XL = CreateObject("Excel.Application")
XL.Visible = True
'XL.Workbooks.Open objFile,,,,,,,,,,,,,True
 
XL.Workbooks.OpenText objFile, , , , , , , True
 
 
XL.Columns("A:A").Select
    XL.Selection.Delete Shift = xlToLeft
    XL.Rows("1:1").Select
    XL.Selection.Delete Shift = xlUp
    XL.Selection.Delete Shift = xlUp
    XL.Cells.Select
    XL.Range("HO208").Activate
    XL.Selection.ColumnWidth = 0.25
    XL.Cells.EntireRow.AutoFit               
    XL.Selection.RowHeight = 2.25
    XL.ActiveWindow.ScrollRow = 1
    XL.ActiveWindow.ScrollColumn = 1
 
    XL.Selection.FormatConditions.AddColorScale 3
 
'XL.ActiveWorkbook.SaveAs OutFile & ".xlsx" , 51
'XL.ActiveWorkbook.Saved = True
'XL.ActiveWindow.Close
'XL.Quit
 
Next
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
23.03.2017, 14:25
Ну, используйте что-нибудь такое:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
XL.Columns("A:A").Select
    XL.Selection.Delete Shift = xlToLeft
    XL.Rows("1:1").Select
    XL.Selection.Delete Shift = xlUp
    XL.Selection.Delete Shift = xlUp
    XL.Cells.Select
    XL.Range("HO208").Activate
    XL.Selection.ColumnWidth = 0.25
    XL.Cells.EntireRow.AutoFit               
    XL.Selection.RowHeight = 2.25
    XL.ActiveWindow.ScrollRow = 1
    XL.ActiveWindow.ScrollColumn = 1
 
    XL.Selection.FormatConditions.AddColorScale 3
    XL.Selection.FormatConditions(XL.Selection.FormatConditions.Count).SetFirstPriority
    XL.Selection.FormatConditions(1).ColorScaleCriteria(1).Type = 1
    With XL.Selection.FormatConditions(1).ColorScaleCriteria(1).FormatColor
        .ThemeColor = 7
        .TintAndShade = 0.5
    End With
    XL.Selection.FormatConditions(1).ColorScaleCriteria(3).Type = 2
    With XL.Selection.FormatConditions(1).ColorScaleCriteria(3).FormatColor
        .Color = 255
        .TintAndShade = 0
    End With
Вы всегда можете подобрать приемлемый вариант, поэкспериментировав с настройками условного форматирования при включенном режиме записи макроса.
После завершения оформления остановите запись и посмотрите получившийся код.
Учтите, что все именованные константы объектной модели Excel надо заменить на их числовые значения. Например, константу xlConditionValueLowestValue надо заменить на значение 1.
0
0 / 0 / 0
Регистрация: 01.02.2017
Сообщений: 6
23.03.2017, 16:25  [ТС]
А чем заменить xlConditionValuePercentile и xlConditionValueHighestValue ?
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
24.03.2017, 05:32
Tromal5, всё необходимое можно легко найти с помощью инструмента Object Browser.
Миниатюры
По очереди открывать каждый CSV-файл, запускать макрос и сохранять этот файл в формате XLSX  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2017, 05:32
Помогаю со студенческими работами здесь

Помогите пожалуйста, не могу разобраться как сохранять файл, например в формате bmp?
Помогите пожалуйста, не могу разобраться как сохранять файл, например в формате bmp? uses graphabc; var pic: picture; y:...

Если я пишу программу на языке Delphi в блокноте, то в каком формате нужно сохранять файл?
если я пишу программу на языке Delphi в блокноте , то в каком формате нужно сохранять ?

Как программно сохранять файл xls в текстовом формате, и всё время в одно и тоже место?
Коллеги, доброго времени суток! Помогите, как програмно сохранять файл *.xls в текстовом формате и всё время в одно и тоже место (имя). ...

ПУСТЬ это текстовый файл, который содержит НЕСКОЛЬКО ЦЕЛЫХ ЧИСЕЛ. ОТКРЫТЬ этот текстовый файл и КАЖДЫЙ С ЧИСЕЛ вознести В КУБ.
ПУСТЬ это текстовый файл, который содержит НЕСКОЛЬКО ЦЕЛЫХ ЧИСЕЛ. ОТКРЫТЬ этот текстовый файл и КАЖДЫЙ С ЧИСЕЛ вознести В КУБ.

Java Server-Client. Сервер должен сохранять время запроса, сам запрос(сообщение) и IP, с которого пришел запрос в CSV файл
Работал на одном компе, так что адрес локальный. Проблема в том, что мой CSV файл пустой. Java только начал изучать, так что если честно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru