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 были удалены.


person Mohamad Bachrouche    schedule 18.12.2020    source источник
comment
Я видел ваш предыдущий поток; расскажите, пожалуйста, что вы пытаетесь сделать; Вы понимаете, что удаление элемента управления содержимым сохранит введенный текст, и вы можете разрешить или запретить пользователям удалять элемент управления содержимым?   -  person Marcelo Scofano Diniz    schedule 18.12.2020
comment
И что это именно If index > 1 Then? Вы выполняете итерацию с For index = 1 To cc.RepeatingSectionItems.Count, поэтому на второй итерации индекс всегда будет ›1, если cc.RepeatingSectionItems.Count > 1.   -  person Marcelo Scofano Diniz    schedule 18.12.2020
comment
Показанная здесь логическая ошибка и другие ошибки в вашем предыдущем сообщении предполагают, что вы не понимаете некоторых основных концепций; Я предлагаю вам начать с более фундаментальных методов выполнения программы и взять один, например это   -  person Marcelo Scofano Diniz    schedule 18.12.2020
comment
Я пытаюсь разрешить пользователю удалить любой выбор, но всегда сохранять один раздел. If index > 1 Then предотвращает удаление первого раздела. If index > 2 Then предотвращает удаление первых двух разделов. Цель - сделать этот индекс динамичным. Независимо от того, какие разделы удаляются, пользователь никогда не сможет удалить какой-либо раздел, если остался только один.   -  person Mohamad Bachrouche    schedule 19.12.2020
comment
@MarceloScofanoDiniz - в опубликованном коде нет логической ошибки. Цикл For index = 1...Next предназначен для определения порядкового номера выбранного элемента повторяющегося раздела, поскольку в объектной модели нет способа сделать это.   -  person Timothy Rylatt    schedule 19.12.2020
comment
@ Тимоти: Действительно, я неправильно выразился; Я имел в виду удаление коллекции от первого до последнего, а не обычное обратное. Мохамад: если вы хотите всегда сохранять один раздел, но не первый, как это делает ваш код, один из способов достижения этого - это знание того, какой индекс вы хотите сохранить, удаление в обратном направлении, пропуск одного индекса, который вы хотите сохранить.   -  person Marcelo Scofano Diniz    schedule 19.12.2020
comment
следующий код успешно удаляет выбранный RSCC, но всегда предотвращает удаление первого RSCC. удаляет выбранный RSCC или все, кроме первого?   -  person Marcelo Scofano Diniz    schedule 19.12.2020
comment
@MarceloScofanoDiniz - только выбранный RSI.   -  person Timothy Rylatt    schedule 19.12.2020
comment
@ MarceloScofanoDiniz - индексы будут меняться в зависимости от того, какие разделы добавлены и удалены. Я хочу сохранить хотя бы один индекс независимо от того, нужно ли использовать функцию count, чтобы, когда RSCC имеет только один оставшийся раздел, ошибка запускалась, чтобы предотвратить удаление этого единственного оставшегося раздела?   -  person Mohamad Bachrouche    schedule 21.12.2020
comment
Ваш код уже предотвращает удаление index = 1, верно? Но вы хотите предоставить способ сохранить, скажем, index = 2 удаление 1 и 3. Верно?   -  person Marcelo Scofano Diniz    schedule 21.12.2020
comment
Перво-наперво: как узнать индекс, идентификатор, тег или любой другой маркер из RSCC, который пользователь хочет сохранить? Эта информация является ключевой, потому что вам нужно сравнить ее с итератором и сохранить только тогда, когда whatever = selected.whatever   -  person Marcelo Scofano Diniz    schedule 21.12.2020
comment
@MarceloScofanoDiniz - вы зацикливаетесь на несущественных деталях. Все, что хочет сделать OP, - это убедиться, что cc.RepeatingSectionItems.Count > 1 перед удалением и cc.RepeatingSectionItems.Count >= 1 после удаления.   -  person Timothy Rylatt    schedule 21.12.2020
comment
@Timothy Rylatt: Мне больше не нужно использовать index?   -  person Mohamad Bachrouche    schedule 21.12.2020
comment
Вам по-прежнему нужно использовать index, поскольку он требуется для циклического перебора коллекции RSI.   -  person Timothy Rylatt    schedule 21.12.2020
comment
@TimothyRylatt, я до сих пор не понимаю: его код уже предусматривает, что останется последний раздел; его код не гарантирует, какой индекс следует сохранить. Насколько мне известно, RSCC не предоставляет индекс для VBA. Зная правильный индекс для сохранения, решите его, потому что вместо If index > 1 Then он сделает If index <> indexToPreserve   -  person Marcelo Scofano Diniz    schedule 21.12.2020
comment
@MarceloScofanoDiniz - вы слишком много думаете. Индекс не имеет значения. OP не знает, какой «индекс» необходимо сохранить. Требуемый код просто должен удалить selected RSI, при этом всегда проверяя, что RSCC содержит минимум один RSI.   -  person Timothy Rylatt    schedule 22.12.2020
comment
@TimothyRylatt и Mohamad: взгляните на эта ветка. Я очень склонен предположить, что, хотя RSCC и хорош для пользователя, это не лучший способ, если вам нужно извлекать информацию или манипулировать ею через VBA.   -  person Marcelo Scofano Diniz    schedule 22.12.2020
comment
@MarceloScofanoDiniz - я не знаю, почему вы меня отмечаете. Это не мой вопрос.   -  person Timothy Rylatt    schedule 22.12.2020
comment
В порядке. Будьте осторожны, надевайте маски, счастливого 2021 года :)   -  person Marcelo Scofano Diniz    schedule 22.12.2020
comment
@ TimothyRylatt: Для начала я попытался изменить For index = 1 To cc.RepeatingSectionItems.Count на For index = 0 To cc.RepeatingSectionItems.Count > 1, но это не сработало, или все не так просто?   -  person Mohamad Bachrouche    schedule 22.12.2020


Ответы (1)


person    schedule
comment
Спасибо, сэр! С Рождеством! - person Mohamad Bachrouche; 23.12.2020
comment
Не поднимал это до сих пор, но этот код предотвращает удаление последнего раздела. Глядя на код, я не понимаю, как это возможно. Должен предотвращать удаление только в том случае, если остался хоть один раздел. - person Mohamad Bachrouche; 02.06.2021
comment
@MohamadBachrouche - Мое время ценно. Я не собираюсь тратить больше времени, объясняя вам это. - person Timothy Rylatt; 02.06.2021
comment
Хорошо. Тогда не могли бы вы указать мне на ресурсы, которые могут помочь объяснить это, чтобы вам не приходилось делать это? - person Mohamad Bachrouche; 03.06.2021