[CDR 2017-2022] Увеличение цифры в файле при каждом запуске макроса.

  • Автор темы Автор темы tohaa
  • Дата начала Дата начала

tohaa

Участник
Топикстартер
Сообщения
260
Реакции
14
Добрый день уважаемые товарищи. Помогите решить такую задачу.

Макрос добавляет номер (например 00) на страницу документа.

Нужно, чтобы при наличии номера на странице (уже есть 00), рядом добавлялся номер на 1 больше существующего(00, 01...).

Старый номер должен остаться.
 
А как отличить номер от всех иных прочих текстовых объектов на странице?
Видимо дать объекту имя, сосчитать количество одинаковых имен на странице и добавить 1 к этой цифре. Вот как это написать в макрос я не представляю.
 
сосчитать количество одинаковых имен на странице
Брр а разве на странице может быть много номеров? Вдобавок, как быть, если номер уже поставлен рядом - это будет номер или уже не номер и нужно ставить другой номер на то же место?
Вы для начала хотя бы ТЗ внятно сформулируйте
К тому же, мне непонятна сама суть вопроса - вы пишете макрос сами и в гдето споткнулись (в каком конкретно месте?) или, по традициям этого форума, хотите отдать его на краудсорсинг, надеясь, что вам и техзадание в процессе доделают?
 
  • Спасибо
Реакции: ~RA~
Код:
Sub plus1()
  On Error Resume Next
  max = -100
  For Each t In ActivePage.Shapes.FindShapes(, cdrTextShape)
    d = CInt(t.Text.Story)
    If d > max Then max = d
  Next t
  ActiveLayer.CreateArtisticText 0, 0, CStr(max + 1)
End Sub
 
  • Спасибо
Реакции: DukereD и tohaa
рядом добавлялся номер на 1 больше
не рядом - а на невидимый специальный слой - и имя и число будет меняться на +1


Код:
        Sub NameCount()
    Dim NameMax As String, Countr As Integer, Lay As Layer, shN As Shape
    For Each Lay In ActiveDocument.ActivePage.Layers
        If Lay.Name = "Number" Then
                Countr = ActivePage.Layers("Number").Shapes.Count
                NameMax = CStr(Countr)
                Set shN = ActivePage.ActiveLayer.CreateArtisticText(0, 0, "0" & NameMax)
                shN.Name = "0" & NameMax
                ActivePage.Layers("Number").Visible = False
                Exit Sub
        End If
    Next Lay
            ActiveDocument.ActivePage.CreateLayer "Number"
            ActivePage.Layers("Number").Activate
            ActivePage.Layers("Number").Visible = False
            Set shN = ActivePage.ActiveLayer.CreateArtisticText(0, 0, "00")
            shN.Name = "00"
 
    End Sub
 
Последнее редактирование:
  • Спасибо
Реакции: tohaa
Код:
Sub plus1()
  On Error Resume Next
  max = -100
  For Each t In ActivePage.Shapes.FindShapes(, cdrTextShape)
    d = CInt(t.Text.Story)
    If d > max Then max = d
  Next t
  ActiveLayer.CreateArtisticText 0, 0, CStr(max + 1)
End Sub
Доброе утро. Подскажите как добавить текущую дату перед добавляемой цифрой? Например "11.02.21_0", "11.02.21_1"...
 
Наверное
Код:
Sub plus1()
  On Error Resume Next
  max = -100
  For Each t In ActivePage.Shapes.FindShapes(, cdrTextShape)
    d = CInt(t.Text.Story)
    If d > max Then max = d
  Next t
  ActiveLayer.CreateArtisticText 0, 0, Date() & "_" & CStr(max + 1)
End Sub
 
  • Спасибо
Реакции: DukereD и tohaa
Наверное
Код:
Sub plus1()
  On Error Resume Next
  max = -100
  For Each t In ActivePage.Shapes.FindShapes(, cdrTextShape)
    d = CInt(t.Text.Story)
    If d > max Then max = d
  Next t
  ActiveLayer.CreateArtisticText 0, 0, Date() & "_" & CStr(max + 1)
End Sub
При таком написании цифра не изменяется. Не могу понять почему. Сразу же попробовал.
 
Чтото делаете не так, только что проверил, работает
 
А, вот вы о чем
Так тогда постановка задачи сама себе противоречит - 11.02.2021_1 по понятным причинам уже не будет номером
 
В общем, пришлось дату создавать отдельным объектом и ровнять к номеру.
 
Код:
Sub plus1()
  dim dt as Shape
  On Error Resume Next
  max = -100
  For Each t In ActivePage.Shapes.FindShapes(, cdrTextShape)
    d = CInt(t.Text.Story)
    If d > max Then max = d
  Next t
  set dt= ActiveLayer.CreateArtisticText( 0, 0, Date())
  ActiveLayer.CreateArtisticText dt.SizeWidth+10, 0, CStr(max + 1)
End Sub
 
Последнее редактирование:
  • Спасибо
Реакции: tohaa
А можно я ещё немножко усложню задачу?)

Как сделать, чтобы поиск номеров, при запуске макроса, происходил только среди номеров добавленных этим макросом?

Сейчас макрос отлично работает пока не встретится какой-то номер в тексте.
 
Можно при создании именовать объекты
Код:
ActiveLayer.CreateArtisticText( 0, 0, "100").Name="Numb"
И поиск проводить уже только среди именованных
Код:
For Each t In ActivePage.Shapes.FindShapes("Numb")
 
  • Спасибо
Реакции: tohaa