Word-VBA-Как предотвратить удаление выбранных элементов управления содержимым повторяющегося раздела, если остался только один раздел?

Следующий код успешно удаляет выбранный RSCC, но всегда предотвращает удаление первого RSCC.

 Dim cc As ContentControl
    If Selection.Information(wdInContentControl) Then
        Set cc = Selection.ParentContentControl
        If Not cc.Type = wdContentControlRepeatingSection Then
            Do Until cc.Type = wdContentControlRepeatingSection
                Set cc = cc.ParentContentControl
            Loop
        End If
        Dim index As Long
        For index = 1 To cc.RepeatingSectionItems.Count
            If Selection.Range.InRange(cc.RepeatingSectionItems(index).Range) Then
                If index > 1 Then
                    cc.RepeatingSectionItems(index).Delete
                Else
                    MsgBox Prompt: = "You cannot delete this.", Title: = "Error"
                End If
                Exit For
            End If
        Next index
    End If

Моя цель состоит в том, чтобы иметь возможность удалить любой выбранный RSCC, но не в том случае, если остался какой-либо один RSCC.

Другими словами, если у меня есть три RSCC (1,2,3), вместо того, чтобы всегда защищать раздел 1, я хотел бы защитить раздел 2, если я должен удалить раздел 1 и 3, или защитить раздел 3, если разделы 1 и 2 были удалены.

Я видел вашу предыдущую тему; пожалуйста, расскажите нам, что вы пытаетесь сделать; понимаете ли вы, что удаление контроля контента сохранит введенный текст, и вы можете разрешить или запретить пользователям удалять контроль контента?

Marcelo Scofano Diniz 18.12.2020 20:20

А что это If index > 1 Then именно? Вы выполняете итерацию с For index = 1 To cc.RepeatingSectionItems.Count, поэтому на второй итерации индекс всегда будет> 1, если cc.RepeatingSectionItems.Count > 1.

Marcelo Scofano Diniz 18.12.2020 20:25

Логическая ошибка, показанная здесь, и другие ошибки в вашем предыдущем посте предполагают, что вы не понимаете некоторых основных понятий; Я предлагаю вам начать с более фундаментальных методов выполнения программы и взять один из них, например этот

Marcelo Scofano Diniz 18.12.2020 20:38

Я пытаюсь разрешить пользователю удалять любой выбор, но всегда сохраняю один раздел независимо. If index > 1 Then предотвращает удаление первого раздела. If index > 2 Then предотвращает удаление первых двух разделов. Цель состоит в том, чтобы сделать этот индекс динамическим. Независимо от того, какие разделы удалены, пользователь никогда не сможет удалить какой-либо раздел, если остался только один.

Mohamad Bachrouche 18.12.2020 22:00

@MarceloScofanoDiniz - в опубликованном коде нет логической ошибки. Цикл For index = 1...Next предназначен для определения порядкового номера выбранного элемента повторяющегося раздела, поскольку в объектной модели нет способа сделать это.

Timothy Rylatt 19.12.2020 12:39

@ Тимоти: Действительно, я неправильно выразился; Я имел в виду удаление коллекции от первого к последнему, а не обычное в обратном порядке. Мохамад: если вы хотите всегда сохранять один раздел, но не первый, как ваш код, один из способов добиться этого — знать, какой индекс вы хотите сохранить, удалить в обратном порядке, пропустив один индекс, который вы хотите сохранить.

Marcelo Scofano Diniz 19.12.2020 20:32

Следующий код успешно удаляет выбранный RSCC, но всегда предотвращает удаление первого RSCC. удаляет выбранный ГПКС или все кроме первого?

Marcelo Scofano Diniz 19.12.2020 20:33

@MarceloScofanoDiniz - только выбранный RSI.

Timothy Rylatt 19.12.2020 21:08

@MarceloScofanoDiniz- Индексы будут различаться в зависимости от того, какие разделы добавляются и удаляются. Я хочу сохранить по крайней мере один индекс независимо от того, стоит ли использовать функцию count, чтобы, когда в RSCC остался только один оставшийся раздел, возникла ошибка, чтобы предотвратить удаление этого единственного оставшегося раздела?

Mohamad Bachrouche 20.12.2020 22:25

Ваш код уже предотвращает удаление index = 1, верно? Но вы хотите предоставить способ сохранить, скажем, index = 2 удаление 1 и 3. Правильно?

Marcelo Scofano Diniz 21.12.2020 03:04

Перво-наперво: откуда вы знаете индекс, идентификатор, тег или любой другой маркер из RSCC, который пользователь хочет сохранить? Эта информация является ключевой, потому что вам нужно сравнить ее с итератором и сохранить только тогда, когда whatever = selected.whatever

Marcelo Scofano Diniz 21.12.2020 03:06

@MarceloScofanoDiniz - вы зацикливаетесь на ненужных деталях. Все, что хочет сделать ОП, — это убедиться, что cc.RepeatingSectionItems.Count > 1 перед удалением и что cc.RepeatingSectionItems.Count >= 1 после удаления.

Timothy Rylatt 21.12.2020 10:15

@ Тимоти Рилатт- Так мне больше не нужно использовать index?

Mohamad Bachrouche 21.12.2020 21:02

Вам все еще нужно использовать index, так как это необходимо для циклического просмотра коллекции RSI.

Timothy Rylatt 21.12.2020 21:11

@TimothyRylatt, я до сих пор не понимаю: его код уже предусматривает, что останется последний раздел; что его код не гарантирует, так это то, какой индекс следует сохранить. Насколько мне известно, ГПКС не выставляет индекс в VBA. Зная правильный индекс, чтобы сохранить его, решите его, потому что вместо If index > 1 Then он сделает If index <> indexToPreserve

Marcelo Scofano Diniz 21.12.2020 21:56

@MarceloScofanoDiniz - ты слишком много думаешь об этом. Индекс не имеет значения. ОП не знает, какой «индекс» нужно сохранить. Требуемый код просто должен удалить выбранные RSI, всегда гарантируя, что RSCC содержит как минимум один RSI.

Timothy Rylatt 21.12.2020 22:19

@TimothyRylatt и Мохамад: загляните в эту тему. Я очень склонен предположить, что, хотя RSCC и красив для пользователя, это не лучший способ, если вам нужно извлечь информацию или манипулировать ею через VBA.

Marcelo Scofano Diniz 22.12.2020 03:05

@MarceloScofanoDiniz - Я не знаю, почему ты меня отмечаешь. Это не мой вопрос.

Timothy Rylatt 22.12.2020 04:17

Хорошо. Берегите себя, носите маски, счастливого 2021 года :)

Marcelo Scofano Diniz 22.12.2020 13:49

@TimothyRylatt- Для начала я попытался изменить For index = 1 To cc.RepeatingSectionItems.Count на For index = 0 To cc.RepeatingSectionItems.Count > 1, и это не сработало, или это не так просто?

Mohamad Bachrouche 22.12.2020 19:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
20
151
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
   Dim cc As ContentControl
   If Selection.Information(wdInContentControl) Then
      Set cc = Selection.ParentContentControl
      If Not cc.Type = wdContentControlRepeatingSection Then
         Do Until cc.Type = wdContentControlRepeatingSection
            Set cc = cc.ParentContentControl
         Loop
      End If
      If cc.RepeatingSectionItems.count > 1 Then
         Dim index As Long
         Dim count As Long
         count = cc.RepeatingSectionItems.count
         For index = cc.RepeatingSectionItems.count To 1 Step -1
            If Selection.Range.InRange(cc.RepeatingSectionItems(index).Range) Then
               If count > 1 Then
                  cc.RepeatingSectionItems(index).Delete
                  count = count - 1
               Else
                  MsgBox Prompt: = "There is only 1 item left so you cannot delete it.", Title: = "Error"
               End If
            End If
         Next index
      Else
         MsgBox Prompt: = "There is only 1 item left so you cannot delete it.", Title: = "Error"
      End If
   End If

Спасибо, сэр! С Рождеством!

Mohamad Bachrouche 23.12.2020 18:08

Не замечал этого до сих пор, но этот код предотвращает удаление последнего раздела. Глядя на код, я не понимаю, как это возможно. Должен предотвращать удаление только в том случае, если остался какой-либо один раздел.

Mohamad Bachrouche 02.06.2021 20:00

@MohamadBachrouche - Мое время ценно. Я не собираюсь тратить больше времени, объясняя вам это.

Timothy Rylatt 02.06.2021 20:39

Хорошо. Тогда не могли бы вы указать мне направление ресурсов, которые могут помочь объяснить это, так что вам не нужно?

Mohamad Bachrouche 03.06.2021 19:22

Другие вопросы по теме