Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] копирование столбца из excel в другой excel (http://forum.oszone.net/showthread.php?t=334752)

romfus 10-05-2018 11:15 2812916

копирование столбца из excel в другой excel
 
Добрый день имеются множество файлов ( пример прикрепил ). Можно ли как то из этих всех файлов вырезать только один столбец (NUM ) И чтоб нумерация из этих столбцов была полностью видна. То есть при нажатии скриптов создавались бы excel файлы только с Num столбцами. Эти файлы лежат на D:\Новая папка а экспорт новых excel файлов например на D:\Новая папка2

romfus 10-05-2018 11:17 2812917

Вложений: 1
Вот сам файл

Iska 10-05-2018 11:34 2812921

Цитата:

Цитата romfus
имеются множество файлов ( пример прикрепил ). »

Если речь ведётся о «множестве», лучше сразу давать два-три файла, а не один, дабы было с чем работать.

Цитата:

Цитата romfus
Можно ли как то из этих всех файлов вырезать только один столбец (NUM ) И чтоб нумерация из этих столбцов была полностью видна. То есть при нажатии скриптов создавались бы excel файлы только с Num столбцами. Эти файлы лежат на D:\Новая папка а экспорт новых excel файлов например на D:\Новая папка2 »

Можно. Только не на пакетных файлах, а посредством чего0либо, поддерживающего Automation — WSH, PowerShell, AutoIt и т.п.

А какова цель сего действа? Вот мы удалили из листа Рабочей книги все столбцы, кроме num, выровняли его, сохранили под тем же именем в конечный каталог. Затем другую Рабочую книгу, третью… А что дальше?

romfus 10-05-2018 11:43 2812923

Вложений: 1
Да просто этих файлов у меня штук 100. и так каждый открывать удалять на это времени много уходит. Просто мне нужно этот Num столбец потом будет еще распечатать. Проще ж потом выделить сформированные файлы и все разом пустить на печать а не открывать каждый потом удалять потом на печать. Вот вам 2 файл для примера.

romfus 10-05-2018 11:44 2812924

Да и мне нужно чтобы оригинал файла сохранился. Хотя знаете можно просто тогда удалить из оригинала и все. Я если что найду способ как оригиналы найти

Iska 10-05-2018 14:54 2812955

romfus, ну, пробуйте (на WSH):
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder
Dim strDestFolder

Dim objFSO
Dim objFile

Dim objExcel


strSourceFolder = "C:\Мои проекты\0155\Source"
strDestFolder  = "C:\Мои проекты\0155\Destination"

Set objExcel = Nothing

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
        If objFSO.FolderExists(strDestFolder) Then
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                                Case "xls", "xlsx"
                                        If objExcel Is Nothing Then
                                                Set objExcel = WScript.CreateObject("Excel.Application")
                                        End If
                                       
                                        With objExcel
                                                With .Workbooks.Open(objFile.Path)
                                                        With .Worksheets.Item(1)
                                                                If StrComp(.Cells(1, 1).Value, "num", vbTextCompare) = 0 Then
                                                                        With .UsedRange.EntireColumn
                                                                                .Offset(0, 1).Delete
                                                                                .AutoFit
                                                                        End With
                                                                Else
                                                                        WScript.Echo "Can't find [num] in A1 cell in first worksheet in [" & objFile.Name & "] workbook."
                                                                End If
                                                        End With
                                                       
                                                        .SaveAs objFSO.BuildPath(strDestFolder, objFile.Name)
                                                        .Close
                                                End With
                                        End With
                                Case Else
                                        ' Nothing to do
                        End Select
                Next
               
                objExcel.Quit
               
                Set objExcel = Nothing
        Else
                WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


Но у меня возник вопрос — вот, Вы распечатываете результирующие Рабочие книги. И только? А потом они Вам не требуются, и Вы их удаляете? Если так, то вовсе нет никакой нужды в сохранении Рабочих книг: можно удалить все столбцы, кроме num, подогнать ширину столбца num по содержимому, отправить результат на печать и закрыть Рабочую книгу, никуда не сохраняя :). Как Вам такое? Или же Вы там ещё каким-то хитрым образом подгоняете, масштабируете, соединяете результирующие данные?

romfus 10-05-2018 15:05 2812961

Что-то не запускается скрипт. Как его запустить? Дак нам приходит ежедневно по 100 таких файлов. Это ж нужно каждый так открывать удалять печатать и т д

А все . Работает. А вот такой вопрос. А нельзя ли чтобы столбец NUM шел не просто вниз а по всему листу?. ПРи печати хорошая Экономия бумаги получится. То что я вам кинул это самый маленький файл. Так если на печатаь бросать результат получается на 8 листов аж

Iska 10-05-2018 15:21 2812964

Цитата:

Цитата romfus
Что-то не запускается скрипт. Как его запустить? »

Сохранить код в файл с расширением .vbs, указав свои пути к исходному и целевому каталогам. Запустить двойным щелчком.

Цитата:

Цитата romfus
Дак нам приходит ежедневно по 100 таких файлов. Это ж нужно каждый так открывать удалять печатать и т д »

Так я и предлагаю: если Вы только печатаете результирующие Рабочие книги, и ничего больше — сделать так, чтобы Вам не приходилось каждую исправленную Рабочую книгу открывать, печатать и закрывать. Пробуем, делаем?

romfus 10-05-2018 15:24 2812965

Давайте. Попробуем

Iska 10-05-2018 15:48 2812970

romfus, а что с текущим скриптом — заработал он у Вас, або нет?

romfus 10-05-2018 15:49 2812971

Заработал да. Я отписался что работает

Iska 10-05-2018 15:56 2812974

Цитата:

Цитата romfus
Давайте. Попробуем »

Пробуйте:
Скрытый текст
Код:

Option Explicit

Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objExcel


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objExcel = Nothing
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                                Case "xls", "xlsx"
                                        If objExcel Is Nothing Then
                                                Set objExcel = WScript.CreateObject("Excel.Application")
                                        End If
                                       
                                        With objExcel
                                                With .Workbooks.Open(objFile.Path)
                                                        With .Worksheets.Item(1)
                                                                If StrComp(.Cells(1, 1).Value, "num", vbTextCompare) = 0 Then
                                                                        With .UsedRange.EntireColumn
                                                                                .Offset(0, 1).Delete
                                                                                .AutoFit
                                                                        End With
                                                                       
                                                                        .PrintOut
                                                                Else
                                                                        WScript.Echo "Can't find [num] in A1 cell in first worksheet in [" & objFile.Name & "] workbook."
                                                                End If
                                                        End With
                                                       
                                                        .Close False
                                                End With
                                        End With
                                Case Else
                                        ' Nothing to do
                        End Select
                Next
               
                objExcel.Quit
               
                Set objExcel = Nothing
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


Путь к исходной папке указывается параметром скрипта (также можно просто перетащить исходную папку на скрипт в Проводнике).

romfus 10-05-2018 16:05 2812979

Usage cscript.exe //nologo "3.vbs" <Source folder> как тут быть?

а все разобрался

Iska 10-05-2018 16:09 2812985

Цитата:

Цитата romfus
Заработал да. Я отписался что работает »

Ясно. Я не увидел то, что Вы дописывали.

Цитата:

Цитата romfus
А вот такой вопрос. А нельзя ли чтобы столбец NUM шел не просто вниз а по всему листу?. ПРи печати хорошая Экономия бумаги получится. То что я вам кинул это самый маленький файл. Так если на печатаь бросать результат получается на 8 листов аж »

Можно будет попробовать. Сверху вниз, затем слева направо, затем опять сверху вниз, затем опять слева направо, …, затем следующий лист и повторяем то же самое, так?

romfus 10-05-2018 16:11 2812986

так да

Iska 10-05-2018 16:11 2812987

Цитата:

Цитата romfus
Usage cscript.exe //nologo "3.vbs" <Source folder> как тут быть?
а все разобрался »

Удобнее всего Вам будет просто перетаскивать папку на скрипт в Проводнике — подхватить папку, перетащить и бросить её на скрипт.

romfus 10-05-2018 16:12 2812988

Да да. Я тут разобрался уже

Iska 10-05-2018 16:24 2812991

Цитата:

Цитата romfus
так да »

Тогда давайте, чтоб не заниматься излишней универсализацией (да я и не уверен, что такое возможно в принципе, всё ж это не Microsoft Access), Вы посчитаете, сколько столбцов у Вас, на Вашем принтере, умещаются на одной странице при печати (и, кстати, мы будем вставлять для наглядности по короткому пустому вспомогательному столбцу между основными?) и сколько строк у Вас умещается на одной странице при печати. От этого и будем танцевать.

romfus 10-05-2018 16:42 2812997

7 строк по горизонтали и 56 по вертикали

Iska 10-05-2018 16:47 2812998

romfus, Вы точно уверены насчёт семи столбцов? У меня токмо шесть помещаются. И — по короткому пустому столбцу между столбцами будем вставлять для наглядности, або нет?

romfus 10-05-2018 16:49 2812999

не нужно пустого столбца. Да. 7

megaloman 10-05-2018 16:54 2813000

romfus, я сейчас отлучён от компьютера, не могу выдать решение, но лучше написать, например, vbs- скрипт, который последовательно откроет эксел-файлы, выделит в них нужную область и напечатает выделенное. Помнится, такая возможность в экселе была.
Либо создать пустой бланк для печати столбца, настроить параметры листа для аывода, макросом в этом бланке последовательно открывать ваши файлы, забирать нужную область и сразу пускать на печать, затем очищать напечатанное и т д.....
Корёжить исходные файлы или делать кучу новых только для печати- плохая идея. Ведь цель всей возни - напечатать выделенные области из всех указанных файлов.

Iska 10-05-2018 16:59 2813003

megaloman, ну, вроде бы уже решили, что корёжить не будем, сохранять не будем, будем токмо печатать. Осталось сообразить, как сие реализовать наиболее доступным образом ;).

megaloman 10-05-2018 17:02 2813005

Iska, пока я тыркал пальцем в планшет, у Вас состоялось бурное объяснение :) Имхо, проще и надёжнее сделать бланк и далее по тексту предыдущего поста

Iska 10-05-2018 17:34 2813010

romfus, ну, пробуйте, что получилось:
Скрытый текст
Код:

Option Explicit

Const intColumns = 7
Const intRows = 56


Dim strSourceFolder

Dim objFSO
Dim objFile

Dim objExcel

Dim objSourceSheet
Dim objDestSheet

Dim objSourceRange
Dim objDestRange


If WScript.Arguments.Count = 1 Then
        strSourceFolder = WScript.Arguments.Item(0)
       
        Set objExcel = Nothing
       
        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
       
        If objFSO.FolderExists(strSourceFolder) Then
                For Each objFile In objFSO.GetFolder(strSourceFolder).Files
                        Select Case LCase(objFSO.GetExtensionName(objFile.Name))
                                Case "xls", "xlsx"
                                        If objExcel Is Nothing Then
                                                Set objExcel = WScript.CreateObject("Excel.Application")
                                        End If
                                       
                                        With objExcel
                                                With .Workbooks.Open(objFile.Path)
                                                        Set objSourceSheet = .Worksheets.Item(1)
                                                        Set objDestSheet = .Worksheets.Add
                                                       
                                                        If StrComp(objSourceSheet.Cells(1, 1).Value, "num", vbTextCompare) = 0 Then
                                                                Set objSourceRange = objSourceSheet.Range(objSourceSheet.Cells(1, 1), objSourceSheet.Cells(intRows, 1))
                                                                Set objDestRange = objDestSheet.Cells(1, 1)
                                                               
                                                                objSourceRange.Copy objDestRange
                                                               
                                                                Do Until objExcel.Intersect(objSourceSheet.UsedRange, objSourceRange) Is Nothing
                                                                        Set objSourceRange = objSourceRange.Offset(intRows, 0)
                                                                       
                                                                        If objDestRange.Column = intColumns Then
                                                                                objDestSheet.VPageBreaks.Add objDestRange.Offset(0, 1)
                                                                                Set objDestRange = objDestRange.Offset(intRows, 1 - intColumns)
                                                                                objDestSheet.HPageBreaks.Add objDestRange
                                                                        Else
                                                                                Set objDestRange = objDestRange.Offset(0, 1)
                                                                        End If
                                                                       
                                                                        objSourceRange.Copy objDestRange
                                                                Loop
                                                               
                                                                objDestSheet.UsedRange.Columns.AutoFit
                                                               
                                                                objDestSheet.PrintOut
                                                        Else
                                                                WScript.Echo "Can't find [num] in A1 cell in first worksheet in [" & objFile.Name & "] workbook."
                                                        End If
                                                       
                                                        .Close False
                                                End With
                                        End With
                                Case Else
                                        ' Nothing to do
                        End Select
                Next
               
                objExcel.Quit
               
                Set objExcel = Nothing
        Else
                WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
                WScript.Quit 2
        End If
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source folder>"
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


После седьмого столбца и после каждой пятьдесят шестой строки вставляются жёсткие разрывы страницы.


Время: 18:33.

Время: 18:33.
© OSzone.net 2001-