Здравствуйте, к сожалению своими силами в создании макроса далеко я не ушёл, прошу помощи разобраться в форматировании.
Объясню кратко суть проблемы.
Документ состоит из много-много таких маленьких кусочков, идущих один за другим. Как мне убрать весь текст из него, оставив только строчки, где указаны все данные по расходным и возвратным накладным. и второе, как в строчках "Возвратные накладные" значения даты и номер накладной поменять на дату и номер из столбцов смежной страницы т.е. к примеру: ВозвратнаяНакладная Е-00001022 11.01.12 номер и дату поменять на 34128М13214 05.01.12г. из этой же строки
Здравствуйте, к сожалению своими силами в создании макроса далеко я не ушёл, прошу помощи разобраться в форматировании.
Объясню кратко суть проблемы.
Документ состоит из много-много таких маленьких кусочков, идущих один за другим. Как мне убрать весь текст из него, оставив только строчки, где указаны все данные по расходным и возвратным накладным. и второе, как в строчках "Возвратные накладные" значения даты и номер накладной поменять на дату и номер из столбцов смежной страницы т.е. к примеру: ВозвратнаяНакладная Е-00001022 11.01.12 номер и дату поменять на 34128М13214 05.01.12г. из этой же строкиGringo
Грубо говоря имеется документ, который содержит некоторую текстовую шапку, затем идёт шапка таблицы и собственно сама таблица, которая содержит список возвратных и расходных накладных. (считайте это 1 файлом) и подобных файлов огромное количество, удалять у каждого шапку и менять вручную номера накладных и их даты очень долгая работа. Требуется рациональный подход, в макрасах не нашёл подобного условия для проверки, замены и удаления ненужного текста.
Цитата (Michael_S)
ни ... (чего) не понятно.
вроде просто всё изложил)
Грубо говоря имеется документ, который содержит некоторую текстовую шапку, затем идёт шапка таблицы и собственно сама таблица, которая содержит список возвратных и расходных накладных. (считайте это 1 файлом) и подобных файлов огромное количество, удалять у каждого шапку и менять вручную номера накладных и их даты очень долгая работа. Требуется рациональный подход, в макрасах не нашёл подобного условия для проверки, замены и удаления ненужного текста.Gringo
изложено несложно, но изложение и пример не совпадают. Да и в примере непонятки (и, по всей видимости, не только мне) - что из чего нужно получить.
Цитата (Gringo)
вроде просто всё изложил)
изложено несложно, но изложение и пример не совпадают. Да и в примере непонятки (и, по всей видимости, не только мне) - что из чего нужно получить.Michael_S
изложено несложно, но изложение и пример не совпадают. Да и в примере непонятки (и, по всей видимости, не только мне) - что из чего нужно получить.
сделал более понятно. На втором листе сделал вид к которому после форматирования я прихожу.
Лист 1 исходный пример как это выглядит в документе) идут данные по каждой точке, описание заканчиваются начинается следующая и т.д. документ раздувается на 6-10 тысяч строк, удалять вручную ну очень долго. Лист 2 документ на выходе. Убираются лишние строки, в строках Возвратные накладные заменяются дата и номер накладной.
Цитата (Michael_S)
изложено несложно, но изложение и пример не совпадают. Да и в примере непонятки (и, по всей видимости, не только мне) - что из чего нужно получить.
сделал более понятно. На втором листе сделал вид к которому после форматирования я прихожу.
Лист 1 исходный пример как это выглядит в документе) идут данные по каждой точке, описание заканчиваются начинается следующая и т.д. документ раздувается на 6-10 тысяч строк, удалять вручную ну очень долго. Лист 2 документ на выходе. Убираются лишние строки, в строках Возвратные накладные заменяются дата и номер накладной.Gringo
можно без макросов по следующей схеме: 1. выделяем всё, нажимаем "объединение ячеек" - объединённые ячейки разъединяются 2. выделяем столбцы с 1 по 7 и сортируем по 1му* 3. удаляем весь текст, оказавшийся внизу. если важен исходный порядок - предварительно вводим дополнительный 8й столбец с номерами по порядку сплошняком, и после удаления текстовых строк сортируем уже по нему, чтобы восстановить порядок следования записей.
* замену номеров не учёл - тогда не по 7й выделяем, а по 10й или 11й Саму замену можно макросом осуществить или через вспомогательный столбец с формулами если(), или же отсортировать по 10му и скопировать
можно без макросов по следующей схеме: 1. выделяем всё, нажимаем "объединение ячеек" - объединённые ячейки разъединяются 2. выделяем столбцы с 1 по 7 и сортируем по 1му* 3. удаляем весь текст, оказавшийся внизу. если важен исходный порядок - предварительно вводим дополнительный 8й столбец с номерами по порядку сплошняком, и после удаления текстовых строк сортируем уже по нему, чтобы восстановить порядок следования записей.
* замену номеров не учёл - тогда не по 7й выделяем, а по 10й или 11й Саму замену можно макросом осуществить или через вспомогательный столбец с формулами если(), или же отсортировать по 10му и скопироватьRalf
Сообщение отредактировал Ralf - Четверг, 28.02.2013, 20:58
Sub macr1() Application.ScreenUpdating = 0' не обновлять экран sn_ = ActiveSheet.Name 'sn_ - это номер тек. листа Sheets.Add 'вставить новый лист With Sheets(sn_) 'работаем в листе sn_ .Cells.UnMerge 'разъединить все ячейки .Columns("J:K").Replace What:=" ", Replacement:="", LookAt:=xlWhole 'в столбцах jk заменить все ячейки с пробелами на пустые ячейки .Columns("J:K").Copy' скопировать столбцы jk .Columns("C:D").PasteSpecial Paste:=xlPasteAll, SkipBlanks:=True 'вставить в столбцы cd спецвставкой с галкой "пропускать пустые ячейки" .Columns("A:G").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd 'поставить автофильтр и поставить фильтр по столбцу а все больше нуля .Columns("A:G").SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1") 'скопировать видимые ячейкии вставить в новый лист (который вставили раньше) End With 'конец работы в листе sn_ Range("A1").EntireRow.Delete 'на новом листе грохнуть первую строку Range("A1").EntireColumn.Delete 'грохнуть первый столбец Columns("A:F").EntireColumn.AutoFit' поставить автоширину на оставшиеся столбцы Application.ScreenUpdating = 1 'обновлять экран как обычно End Sub
[/vba]
Такой вариант [vba]
Код
Sub macr1() Application.ScreenUpdating = 0' не обновлять экран sn_ = ActiveSheet.Name 'sn_ - это номер тек. листа Sheets.Add 'вставить новый лист With Sheets(sn_) 'работаем в листе sn_ .Cells.UnMerge 'разъединить все ячейки .Columns("J:K").Replace What:=" ", Replacement:="", LookAt:=xlWhole 'в столбцах jk заменить все ячейки с пробелами на пустые ячейки .Columns("J:K").Copy' скопировать столбцы jk .Columns("C:D").PasteSpecial Paste:=xlPasteAll, SkipBlanks:=True 'вставить в столбцы cd спецвставкой с галкой "пропускать пустые ячейки" .Columns("A:G").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd 'поставить автофильтр и поставить фильтр по столбцу а все больше нуля .Columns("A:G").SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("A1") 'скопировать видимые ячейкии вставить в новый лист (который вставили раньше) End With 'конец работы в листе sn_ Range("A1").EntireRow.Delete 'на новом листе грохнуть первую строку Range("A1").EntireColumn.Delete 'грохнуть первый столбец Columns("A:F").EntireColumn.AutoFit' поставить автоширину на оставшиеся столбцы Application.ScreenUpdating = 1 'обновлять экран как обычно End Sub
спасибо большое, если не трудно, можете мне, недалёкому, объяснить значение каждой строчки. Чтобы в подобных документах выполнять подобные преобразования самому впредь. Заранее благодарен
Цитата (_Boroda_)
Такой вариант
спасибо большое, если не трудно, можете мне, недалёкому, объяснить значение каждой строчки. Чтобы в подобных документах выполнять подобные преобразования самому впредь. Заранее благодарен Gringo
.Columns("A:G").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd 'поставить автофильтр и поставить фильтр по столбцу а все больше нуля
вот тут непонятно для чего этот фильтр? и фильтр больше 0, что нам это условие даёт? И ещё вопрос зачем мы удаляем первую строку и первый столбец?
.Columns("A:G").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd 'поставить автофильтр и поставить фильтр по столбцу а все больше нуля
вот тут непонятно для чего этот фильтр? и фильтр больше 0, что нам это условие даёт? И ещё вопрос зачем мы удаляем первую строку и первый столбец?Gringo
Фильтр "больше 0" выводит нам только те строки, где в столбце А есть цифры. В первой строке у нас кусок шапки (красный такой), а в первом столбце цифры, которые в Вашем листе 2 отсутствуют. Если хотите оставить, то не удаляйте.
Фильтр "больше 0" выводит нам только те строки, где в столбце А есть цифры. В первой строке у нас кусок шапки (красный такой), а в первом столбце цифры, которые в Вашем листе 2 отсутствуют. Если хотите оставить, то не удаляйте._Boroda_
'сортировка по возрастанию и удаление столбца Columns("A:A").Select Range("A1:F30000").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Columns("F:F").Select Selection.Delete Shift:=xlToLeft Range("M7").Select End Sub
[/vba]
как мне задать сортировку, чтобы сортировались не 30000 тысяч записей, а весь столбец F, независимо от его размера? Документ 60000 строк переваривать таким образом не получилось, только частями.
Цитата (_Boroda_)
библиотека
Спасибо
дальше своими силами и знаниями построил такого монстра, чтоб документ довести до ума [vba]
Код
Private Sub CommandButton1_Click() 'основная замена и удаление лишних строк
'сортировка по возрастанию и удаление столбца Columns("A:A").Select Range("A1:F30000").Sort Key1:=Range("A1"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal Columns("F:F").Select Selection.Delete Shift:=xlToLeft Range("M7").Select End Sub
[/vba]
как мне задать сортировку, чтобы сортировались не 30000 тысяч записей, а весь столбец F, независимо от его размера? Документ 60000 строк переваривать таким образом не получилось, только частями.Gringo
Сообщение отредактировал Gringo - Пятница, 01.03.2013, 16:01
Спасибо, а я сижу велосипед изобретаю))) Только не ясно мне, почему ручной ввод параметра 60000 он игнорирует, выбрасывая ошибку, а без указания интервала пережёвывает, занимает этот процесс секунд 5-15)
Спасибо, а я сижу велосипед изобретаю))) Только не ясно мне, почему ручной ввод параметра 60000 он игнорирует, выбрасывая ошибку, а без указания интервала пережёвывает, занимает этот процесс секунд 5-15)Gringo
Сообщение отредактировал Gringo - Пятница, 01.03.2013, 15:54