Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Автоматизация экспорта данных из Excel

Ответить
Настройки темы
Любой язык - [решено] Автоматизация экспорта данных из Excel

Старожил


Сообщения: 303
Благодарности: 19

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: xlsx форум.xlsx
(8.7 Kb, 6 просмотров)
Доброго.
Прощу помощи в решении вот такой задачи:
Есть файл Excel с внутренними листами, необходимо обрабатывать Лист под названием "Данные"
В данном листе необходимо проверить столбец "ФИО" и выбрать из него (если возможны два условия) пустую ячейку или по слову "Свободный"
Выгрузить выбранные данные в новый файл сохраняя структуру
Файл можно перетирать, хотелось бы скрипт, чтобы потом его можно было закинуть в планировщик.
Большое спасибо.

Отправлено: 10:08, 27-05-2016

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


vbs-скрипт
Код: Выделить весь код
Book = "Z:\форум.xlsx"
BookOut="Z:\форум_свобода.xlsx"

    List = "Данные" ' Имя листа с данными
    Col1 = "A"  ' Первая колонка с данными
    Col2 = "H"  ' Последняя колонка с данными
    Col0 = "D"  ' Колонка с данными для анализа
    Row1 = 2    ' Первая строка с данными

Set FSO = CreateObject("Scripting.FileSystemObject")
Set XL = CreateObject("Excel.Application")
XL.Visible = True
XL.Workbooks.Open Book

XL.Sheets(List).Select
    
    C1 = XL.Range(Col1 + "1").Column
    C2 = XL.Range(Col2 + "1").Column
    C0 = XL.Range(Col0 + "1").Column
    
    R1 = Col1 + CStr(Row1)
    
    i = Row1 - 1
    Do
        i = i + 1
        L = False
        For j = C1 To C2
            L = L Or XL.Range(R1).Offset(i - Row1, j - C1) <> ""
        Next
        If Not L Then Exit Do
    Loop
    Row2 = i - 1
    
    ' Dim Mas As Variant
    Mas = XL.Range(R1 + ":" + Col2 + CStr(Row2))
    XL.Range(R1 + ":" + Col2 + CStr(Row2)).ClearContents
    N1 = LBound(Mas, 1)
    N2 = UBound(Mas, 1)
    
    N22 = UBound(Mas, 2) - LBound(Mas, 1)
    R22 = Col1 + CStr(Row1) + ":" + Col2 + CStr(Row1)
    ReDim Mas1(N22)
    NN = 0
    For i = N1 To N2
        j = C0 - C1 + N1
        If (Len(Trim(Mas(i, j))) = 0) Or (InStr(1, Mas(i, j), "Свобод") <> 0) Then
            For jj = 0 To N22
                Mas1(jj) = Mas(i, jj + N1)
            Next
            XL.Range(R22).Offset(NN, 0) = Mas1
            NN = NN + 1
            ' MsgBox CStr(i) + " " + Mas(i, j)
        End If
    Next
    
    XL.Range("A1").Select


If FSO.FileExists(BookOut) Then FSO.DeleteFile(BookOut)

XL.ActiveWorkbook.SaveAs BookOut
XL.Quit

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 29-05-2016 в 19:17.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:14, 29-05-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
XL. ActiveWorkbook.SaveAs BookOut »
Как тут пробел затесался?
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:13, 29-05-2016 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Iska, Вкрался. Исправил. Но, самое интересное, работало нормально.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 19:20, 29-05-2016 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Но, самое интересное, работало нормально. »
Странно. Я, впрочем, не проверял.

Отправлено: 19:53, 29-05-2016 | #5


Старожил


Сообщения: 303
Благодарности: 19

Профиль | Отправить PM | Цитировать


Доброго дня. Спасибо за скрипт.
Но у меня еще просьба, попробовал оптимизировать скрипт под свой файл, получил ошибку
Скрытый текст

List = "Данные" ' Имя листа с данными
Col1 = "C" ' Первая колонка с данными
Col2 = "L" ' Последняя колонка с данными
Col0 = "F" ' Колонка с данными для анализа
Row1 = 2 ' Первая строка с данными

Что в 28 строке символ 13 - несоответствие типа

Отправлено: 12:43, 30-05-2016 | #6


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Fantastish, А что в 28 строке скрипта? Упакуйте или переименуйте его в тхт, пришлите, надо смотреть. А еще лучше с Вашим ексел-файлом. Упакуйте, можете с паролем, пароль в личное сообщение. То, что Вы выложили - похоже ошибочно. У вас в имени колонки "С" русская буква.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 30-05-2016 в 13:26.

Это сообщение посчитали полезным следующие участники:

Отправлено: 13:07, 30-05-2016 | #7


Старожил


Сообщения: 303
Благодарности: 19

Профиль | Отправить PM | Цитировать


Отправил в пм, спасибо

Отправлено: 13:31, 30-05-2016 | #8


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Fantastish, Ваша ситуация оказалась сложнее.
1. В исходном файле несколько листов с взаимными связями
2. Формулы не всегда выдают корректный результат
Вот изменённый код с учетом особенностей Вашей таблицы.
Код: Выделить весь код
Book = "Z:\Данные2.xlsx"
BookOut="Z:\форум_свобода.xlsx"

    List = "Данные" ' Имя листа с данными
    Col1 = "A"  ' Первая колонка с данными
    Col2 = "R"  ' Последняя колонка с данными
    Col0 = "F"  ' Колонка с данными для анализа
    Row1 = 2    ' Первая строка с данными

Set FSO = CreateObject("Scripting.FileSystemObject")
Set XL = CreateObject("Excel.Application")

With XL

.Visible = True

.Workbooks.Open Book
.Sheets(List).Select

    .Range(Col1+":"+Col2).Copy
    aaa=.Range(Col1+":"+Col2).PasteSpecial(-4163, -4142, False, False)
    
    .Sheets(List).Copy

    .Windows(FSO.GetFile(Book).Name).Close (False)
    
    C1 = .Range(Col1 + "1").Column
    C2 = .Range(Col2 + "1").Column
    C0 = .Range(Col0 + "1").Column
    
    R1 = Col1 + CStr(Row1)
    
    i = Row1 - 1
    Do
        i = i + 1
        L = False
        For j = C1 To C2
    		On Error Resume Next
    		RR1=.Range(R1).Offset(i - Row1, j - C1)
    		If Err.Number <> 0 Then
			RR1="Н/Д"
			.Range(R1).Offset(i - Row1, j - C1)=RR1
    		End If
            	L = L Or RR1 <> ""
        Next
        If Not L Then Exit Do
    Loop
    Row2 = i - 1
    
    ' Dim Mas As Variant
    Mas = .Range(R1 + ":" + Col2 + CStr(Row2))
    .Range(R1 + ":" + Col2 + CStr(Row2)).ClearContents
    N1 = LBound(Mas, 1)
    N2 = UBound(Mas, 1)
    
    N22 = UBound(Mas, 2) - LBound(Mas, 1)
    R22 = Col1 + CStr(Row1) + ":" + Col2 + CStr(Row1)
    ReDim Mas1(N22)
    NN = 0
    For i = N1 To N2
        j = C0 - C1 + N1
        If (Len(Trim(Mas(i, j))) = 0) Or (InStr(1, Mas(i, j), "Свобод") <> 0) Then
            For jj = 0 To N22
                Mas1(jj) = Mas(i, jj + N1)
            Next
            .Range(R22).Offset(NN, 0) = Mas1
            NN = NN + 1
            ' MsgBox CStr(i) + " " + Mas(i, j)
        End If
    Next
    
    .Range("A1").Select


If FSO.FileExists(BookOut) Then FSO.DeleteFile(BookOut)

.ActiveWorkbook.SaveAs BookOut
.Quit
End With

1. Формируется новая таблица с одним листом безо всяких формул
2. Игнорируются ошибки при работе Ваших формул

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:35, 30-05-2016 | #9


Старожил


Сообщения: 303
Благодарности: 19

Профиль | Отправить PM | Цитировать


Огромное спасибо
Вопрос:
параметр .Visible = True - определяет в silent режиме откроется приложение или нет?
и еще одна глупая возможность, может ли скрипт в процессе обработки, удалять (подчищать пустые строки)?

Отправлено: 17:54, 30-05-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Автоматизация экспорта данных из Excel

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBA - Помогите написать макрос в Excel, экспорт данных из Excel в Word. E.v.g Программирование и базы данных 7 03-05-2018 22:18
2013 - excel загрузка данных из инернета Alexander_88 Microsoft Office (Word, Excel, Outlook и т.д.) 0 28-07-2015 13:15
VBS/WSH/JS - Импорт данных в форму Excel из xml файла VictorST Скриптовые языки администрирования Windows 2 28-06-2015 12:52
VBS/WSH/JS - [решено] Как сделать вывод данных из excel в html? McLotos Скриптовые языки администрирования Windows 0 27-04-2014 12:31
[решено] PHP Вызрузка данных в Excel, из БД zvezda_t Вебмастеру 9 29-04-2011 18:41




 
Переход