Страницы: 1
RSS
Вставка разрыва при условии размещения двух меток, определяющих место расположения рисунка
 
Добрый день!

не могу похвастать глубокими знаниями в VB поэтому прошу помощи.
Задача следующая:
есть экселевский отчет в котором есть только 1 лист (закладка). на закладке после последней таблицы (таблиц может быть произвольное количество, с разным наполнением и разной высотой строк) проставляется 2 метки в первом столбце А:
StartPaint
EndPaint,
которые указывают границы местоположения картинки которая вставляется в отчет - скан Печати организации

нужно определить позицию у каждой метки и определить будут ли эти метки располагаться на ОДНОЙ странице экселя.
Если физически метки располагаются не на ОДНОЙ странице - то перед меткой StartPaint делаем принудительный разрыв - pageBreak

сами метки я могу могу определить через команду
Код
Set ActiveCell = objWorkbook.ActiveSheet.Range("A:A").Find("EndPaint", , -4163, 1, 2, 1, True, False) 

и могу определить строку на которой метка надодится - ActiveCell.row, а вот с определением на ОДНОЙ странице или нет находятся метки - затык.

Подскажите плиз как можно решать мой вопрос?
 
Цитата
BukvaED написал: могу определить строку на которой метка надодится - ActiveCell.row
Номер строки с горизонтальной границей страницы можно определить так
Код
HPageBreak.Location.Row
Согласие есть продукт при полном непротивлении сторон
 
Добрый день, Sanja!

У меня выдается ошибка  на строке, где применил
Код
msgBox objWorkbook.ActiveSheet.HPageBreak.Location.Row 

Объект не поддерживает это свойство или метод Код: 800А01В6.

Я определяю кол-во разрывов на странице
Код
   pb = objWorkbook.ActiveSheet.HPageBreaks.Count
   msgBox "кол-во разрывов в файле: " +  CStr(pb)

затем использую цикл чтобы попытаться определить сколько же строк у меня на каждой странице
Код
For I = 1 To pb
msgBox "разрыв -: " + CStr(I) & " "   & CStr(objWorkbook.ActiveSheet.HPageBreaks(1).Location) & "  add_t0 = "&add_t0
    ' If add_t0 < objWorkbook.ActiveSheet.HPageBreaks(I).Location.Row - 1 Then Exit For   
   
   msgBox objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row
   msgBox objWorkbook.ActiveSheet.HPageBreak.Location.Row
Next
MsgBox "Текущая строка на " & CStr(I) & "-й странице"

так вот команда кода
Код
msgBox objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row 
возвращает всегда (на каждом разрыве) одной и тоже число - 79 именно столько у меня на 1 странице Экселя (проверял открыв файл в экселе и пронумеровав строки)

на второй странице у меня 77 записей
на третьей - 79
на четвертой  и последующих 79

Я же хочу понять как мне вернуть то кол-во строк которое содержит каждая страница?
Изменено: BukvaED - 27.03.2019 12:20:13 (Замечание от модератора)
 
BukvaED, обратитк внимание на оформление Вашего последего сообщения. В дальнейшем - сами так, хорошо?
 
Файл-пример приложите
Согласие есть продукт при полном непротивлении сторон
 
Приложил в архиве, так как сам файл представляет собой xml и занимает куда больший объем чем можно приложить по правилам форума

Только одно добавление метка 1 в приложенном файле имеет название  - Ruk
метка 2 - имеет название - EndReport
Изменено: BukvaED - 27.03.2019 12:42:57 (уточнение ранее не описанное)
 
Доброго дня всем!

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

вложил свой vbs скрипт в архиве logo_one_pdf.zip.

Проблему с определением меток я решил (наверно). Наверно пишу потому как до конца не понятно почему у меня значение разрыва показывается всегда 79, хотя строк по факту на 2 странице 77. Ну да ладно - с этим буду позже разбираться....

сейчас затык возник на вставке разрыва, если алгоритм определил что метки находятся на разных страни.

не могу никак вставить этот разрыв.

официальная дока приводит такой пример:
Код
With Worksheets(1) 
 .HPageBreaks.Add .Range("F25") 
 .VPageBreaks.Add .Range("F25") 
End With

в моем случае это выглядит так

Код
    objWorkbook.ActiveSheet.Range("A666").Activate
    objWorkbook.ActiveSheet.Range("A666").Select
     objWorkbook.ActiveSheet.HPageBreaks.Add.Range("A666")

но используя его я получал ошибку - Недопустимое число аргументов или присвоение значения свойства 800A01С2

попробовал в экселе запустить макрос и вручную вставить разрыв в нужной строке

Код
ActiveWindow.SmallScroll Down:=-33  Range("A666").Select  ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

Стал использовать этот код в своем скрипте в таком виде

Код
objWorkbook.ActiveSheet.Range("A666").Activate
    objWorkbook.ActiveSheet.Range("A666").Select
 '    objWorkbook.ActiveSheet.HPageBreaks.Add.Range("A666")
    
  '  ActiveWindow.SmallScroll Down:=-33
  '  Range("A666").Select
    ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

- но получил ошибку
строка 106 символ 56 Предполагается наличие инструкции 800A04000. Что за инструкция?

Прошу помощи у знающих - как поправить код, чтобы разрыв встал перед меткой Ruk
спасибо!
 
Цитата
BukvaED написал: вложил свой vbs скрипт
Это форум по Excel и его встроенный язык -VBA
Приложите файл-пример в формате Excel со своим макросом и НЕ в архиве!
Согласие есть продукт при полном непротивлении сторон
 
наверно я обратился не на тот форум. так как у меня сперва формируется файл xml,
который затем обрабатывается внешним vbs cкриптом, который открывает этот xml файл Экселем и далее собственно его обрабатывает .
Спасибо за то, что дали возможность задать вопрос.
Изменено: BukvaED - 28.03.2019 11:54:07
 
Нет слов русском языке ..... применительно к текущей ситуации... одни нелитературные выражения..... НО

похоже нашел я выход

в моем vbs скрипте для простановки разрыва нужно было прописать
Код
objWorkbook.ActiveSheet.Rows(add_t-1).PageBreak = -4135
где (add_t-1) - позиция или номер строки для разрыва страницы

а -4135 - это xlPageBreakManual .

Кодом  -4135 заменяем xlPageBreakManual по причине указанной на одном другом хорошем форуме -
Цитата
VBScript ничего не знает про экселевские константы. Заменяйте их числовыми значениями:

во всяком случае прописав эту конструкцию у меня скрипт заработал... Буду дальше отлаживать.
 
Всем доброго времени суток!
В скрипте есть кусок кода определяющий разрывы между страницами
Код
pb = objWorkbook.ActiveSheet.HPageBreaks.Count
msgBox "кол-во разрывов в файле: " +  CStr(pb)

For I = 1 To pb  msgBox "разрыв -: " + CStr(I) & " "   & CStr(objWorkbook.ActiveSheet.HPageBreaks(1).Location) & "  add_t0 = "&add_t0

msgBox objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row

Next
MsgBox "Текущая строка на " & CStr(I) & "-й странице"

должна ли строчка

Код
  msgBox objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row

возвращать разные значения, каждое для своей страницы в случае если

на первой странице находится 5 строк - т.е. должно вернуться - 5

на второй - 10 строк - т.е. должно вернуться - 10

на третьей - 15 - соответственно 15?

И еще вопрос - я правильно понимаю что цифирка после оператора  
Код
 HPageBreaks(1)
это не что иное как номер Листа (закладки) располагающейся в книге?

Изменено: BukvaED - 29.03.2019 12:37:18
 
Цитата
BukvaED написал: это не что иное как номер Листа (закладки) располагающейся в книге?
Нет. 1 - это номер границы страницы в коллекции HPageBreaks
Согласие есть продукт при полном непротивлении сторон
 
Код
objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row 
всегда возвращает одно и тоже значение? ведь на страницах разное кол-во строк может быть.

под границей страницы что подразумевается?  свзана ли граница страницы с её разрывом?
 
Ваш код возвращает номер строки 1-го разрыва страницы Активного листа
Попробуйте такой код
Код
Dim sh As Worksheet
Dim HPB As HPageBreak
For Each sh In Worksheets
    For Each HPB In sh.HPageBreaks
        MsgBox "Лист - '" & sh.Name & "'" & vbNewLine & _
                "Номер строки разрыва страницы - '" & HPB.Location.Row & "'"
    Next
Next
Согласие есть продукт при полном непротивлении сторон
 
в чистом виде применить Ваш код не могу - выдается ошибка Предполагается наличие окончания инструкции (с отсылом на строчку объявления sh)

Так же мне не нужен цикл по всем Закладкам книги, если в моем случае у меня ОДНА закладка!
И напоминаю - что у меня не макрос из Экселя запускаемый, а отдельный vbs скрипт. этим наверно и объясняется что я не могу применить Ваш код у себя в чистом виде...

Ддругой вложенный цикл у Вас идет по разрывам страницы.... Вот это уже мне ближе и нужнее...

Что сделал я - убрал ваш код из своего...  решил посмотреть  Что оператор vbNewLine будет возращать у меня.

Код
pb = objWorkbook.ActiveSheet.HPageBreaks.Count
msgBox "кол-во разрывов в файле: " +  CStr(pb)   

For I = 1 To pb
'msgBox "разрыв -: " + CStr(I) & " "   & CStr(objWorkbook.ActiveSheet.HPageBreaks(1).Location) '& "  add_t0 = "&add_t0
nr = (objWorkbook.ActiveSheet.HPageBreaks(1).Location.Row) * I
msgBox "разрыв -: " + CStr(Chr(10)) & "  " &vbNewLine

Next

так вот сообщение при отработке скрипта возвращается только символы - "разрыв -:"  , а то что сидит в самом операторе vbNewLine не возвращается.


почему так?
может быть я ошибаюсь - но Ваш  
Код
sh.HPageBreaks
должен быть идентичен моему
Код
pb = objWorkbook.ActiveSheet.HPageBreaks.Count

разве нет?

если я комментарю .Count
Код
pb = objWorkbook.ActiveSheet.HPageBreaks '.Count

и запускаю скрипт  - то получаю ошибку

Недопустимое число аргументов или присвоение значения свойства: 'pb'


в общем пока не понимаю  - как получать (в моем случае) ту строку на которой физически заканчивается разрыв.
Изменено: BukvaED - 29.03.2019 13:35:17
 
Цитата
BukvaED написал:
в чистом виде применить Ваш код не могу - выдается ошибка Предполагается наличие окончания инструкции (с отсылом на строчку объявления sh)
Так самому Sub...End Sub добавить не судьба!?
Код
Sub BukvaED
Dim sh As Worksheet
Dim sh As WorksheetDim HPB As HPageBreak
For Each sh In Worksheets
    For Each HPB In sh.HPageBreaks
        MsgBox "Лист - '" & sh.Name & "'" & vbNewLine & _
                "Номер строки разрыва страницы - '" & HPB.Location.Row & "'"
    Next
Next
end sub
Изменено: Sanja - 29.03.2019 13:47:16
Согласие есть продукт при полном непротивлении сторон
 
Цитата
BukvaED написал: Что оператор vbNewLine будет возращать у меня
Это не оператор, и ничего он Вам не вернет. Это функция переноса строки на новую строку
Цитата
BukvaED написал: может быть я ошибаюсь - но Ваш  ..... должен быть идентичен моему ....разве нет?
Конечно нет.  Это совсем разные вещи. У меня коллекция, у Вас количество элементов в коллекции.
Ну и далее по тексту видно, что еще очень плаваете в предмете, Вам бы теорию подучить
Изменено: Sanja - 29.03.2019 13:43:41
Согласие есть продукт при полном непротивлении сторон
 
Код
что еще очень плаваете в предмете, Вам бы теорию подучить
И это верно на 100%! в свое оправдание могу сказать, что в начале темы в первом топике я написал
Код
не могу похвастать глубокими знаниями в VB поэтому прошу помощи.

Поэтому все правильные определения с точки зрения гуру VB могу называть неверно! Не судите строго.

А учиться - приходится походу (сроки сжаты - задачи разнообразные) и честно сказать не всегда глубоко зачастую.

Все мы чему-то учимся (если хотим) каждый день, в том числе друг у друга!  :)

 
Цитата
BukvaED написал: Поэтому все правильные определения с точки зрения гуру VB могу называть неверно!
Дело не в том, как Вы их называете, называйте как хотите, а в том что Вы не знаете основ. Объекты путаете со значениями и прочее. Трудно двигаться вперед без базовых знаний, на одной практике ;)  
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
Это не оператор, и ничего он Вам не вернет. Это функция переноса строки на новую строку
Наверное, не надо вводить в заблуждение новичка, он и так
Цитата
BukvaED написал:
могу называть неверно
vbNewLine - это текстовая константа, набор символов, который, во многих случаях, при выводе строки (например с помощью MsgBox) показывает, что в данном месте надо выводит на следующей строке. И, в данном случае, не имеет абсолютно никакого отношения к разрывам строк в Excel, а применена только чтобы сообщение в MsgBox не было слишком широким.
Цитата
Sanja написал:
Трудно двигаться вперед без базовых знаний, на одной практике
Однако большинство так и делает...
 
Alec Perle, спасибо за уточнение
Согласие есть продукт при полном непротивлении сторон
 
будем считать что стороны обменялись любезностями... так сказать...
теперь по существу.

обрамил я Ваш код  Sub...End Sub
и вставил в свой vbs скрипт в самое начало...

чуть дальше по коду вызвал эту процедуру с сокращением - BukvaED
КОМАНДОЙ

CALL BukvaED

Запустил скрипт...

ОШИБКА таже - Предполагается наличие окончания инструкции.

может все таки не написании дело а разных версиях чего либо (экселя, VB)?

ведь несколькими топиками выше (#10) мною было найдено решение которое в моем случае сработало, хотя другие констукции кода по вставке разрыва у меня не работли.

 
Цитата
BukvaED написал: ...и вставил в свой vbs скрипт в самое начало...
может все таки не написании дело а разных версиях чего либо (экселя, VB)?ведь несколькими топиками выше
Еще более 'выше'
Цитата
Sanja написал: Это форум по Excel и его встроенный язык -VBA
Приложите файл-пример в формате Excel со своим макросом и НЕ в архиве!
Изменено: Sanja - 29.03.2019 14:29:15
Согласие есть продукт при полном непротивлении сторон
 
Файл прикладываю.  Это не первоначальный xml ФАЙЛ,  который формируется у меня, а его сохраненный собрат в xlsx
в нем все данные удалены - остался только скелет таблиц с той высотой, масштабом колонтилулом с какой он изначально формируется ( . Сами данные - удалил из-за конфиденциальности.
дополнительно я расставил номера строк по телу отчета - как они отображаются у меня (постранично) вэкселе.
макроса внутри файла у меня нет, так как технология работы отчета не предусматривает его внутри!

свой vbs скрипт приложу позже, так как форум имеет ограничение на вложенные фалы
Изменено: BukvaED - 29.03.2019 15:02:43
 
не понимаю почему я не могу добавить vbs-скрипт который весит 5 КБ?
интерфейс формы ответов после скролл-бара загрузки файла пишет что загружаемые файлы не должны быть размером более 100 Кб.

Косячок обнако в работе форума?

Могу выложить код открыто с "оформлением текста в виде кода". ОК?
Изменено: BukvaED - 29.03.2019 15:22:12
 
Зачем Вы нам все какой-то VBS-скрипт пытаетесь скормить?
Согласие есть продукт при полном непротивлении сторон
 
Коллеги!
Я ничего никому скормить не пытаюсь

Если находящиемся здесь люди далеки от VBS так же как и я - то так и скажите - Мы тебе нечем помочь не можем.
Ты, парень, обратился не по адресу.

Или просто промолчите....

Еще раз уточняю свою задачу и работу собственно - logo_one_pdf.VBS.

есть файл XLM
его заглатывает скрипт logo_one_pdf.VBS
Открывает в Экселе
в нужном месте проставляет разрывы - вернее должен проставить
сохраняет результат в зависимости от условий либо в xlsx либо в pdf

все.

у меня нет макроса в самом Экселевком файле, к сожалению!


Еще раз спрошу - нужно ли выложить мой 5 килобайтный logo_one_pdf.VBS доступными на форуме способами?
Изменено: BukvaED - 29.03.2019 15:35:34
 
Цитата
BukvaED написал:
ОШИБКА таже - Предполагается наличие окончания инструкции.может все таки не написании дело а разных версиях чего либо (экселя, VB)?
Дело в разных версиях языка. Даже не в версиях - VBScript все же другой язык. И предполагается наличие окончания инструкции там, где в VBA продолжение есть, а в VBS - нет. В Вашем случае - в объявлении переменных, в VBS нельзя объявит переменные с указанием типа. Попробуйте вместо
Код
Dim sh As Worksheet
написать
Код
Dim sh
ну и в других местах, где объявляются переменные.
Цитата
BukvaED написал:
у меня нет макроса в самом Экселевком файле, к сожалению!
А вот здесь, учитывая слабые знания VB, VBA и VBS (и отличия в них), я бы порекомендовал писать нужный макрос именно в VBA, а потом уже перенести (с правками) в VBS.
 
Цитата
BukvaED написал: Или просто промолчите....
Допомогался :D  
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх