Следующий код успешно удаляет выбранный 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 были удалены.
А что это If index > 1 Then
именно? Вы выполняете итерацию с For index = 1 To cc.RepeatingSectionItems.Count
, поэтому на второй итерации индекс всегда будет> 1, если cc.RepeatingSectionItems.Count > 1
.
Логическая ошибка, показанная здесь, и другие ошибки в вашем предыдущем посте предполагают, что вы не понимаете некоторых основных понятий; Я предлагаю вам начать с более фундаментальных методов выполнения программы и взять один из них, например этот
Я пытаюсь разрешить пользователю удалять любой выбор, но всегда сохраняю один раздел независимо. If index > 1 Then
предотвращает удаление первого раздела. If index > 2 Then
предотвращает удаление первых двух разделов. Цель состоит в том, чтобы сделать этот индекс динамическим. Независимо от того, какие разделы удалены, пользователь никогда не сможет удалить какой-либо раздел, если остался только один.
@MarceloScofanoDiniz - в опубликованном коде нет логической ошибки. Цикл For index = 1...Next
предназначен для определения порядкового номера выбранного элемента повторяющегося раздела, поскольку в объектной модели нет способа сделать это.
@ Тимоти: Действительно, я неправильно выразился; Я имел в виду удаление коллекции от первого к последнему, а не обычное в обратном порядке. Мохамад: если вы хотите всегда сохранять один раздел, но не первый, как ваш код, один из способов добиться этого — знать, какой индекс вы хотите сохранить, удалить в обратном порядке, пропустив один индекс, который вы хотите сохранить.
Следующий код успешно удаляет выбранный RSCC, но всегда предотвращает удаление первого RSCC. удаляет выбранный ГПКС или все кроме первого?
@MarceloScofanoDiniz - только выбранный RSI.
@MarceloScofanoDiniz- Индексы будут различаться в зависимости от того, какие разделы добавляются и удаляются. Я хочу сохранить по крайней мере один индекс независимо от того, стоит ли использовать функцию count
, чтобы, когда в RSCC остался только один оставшийся раздел, возникла ошибка, чтобы предотвратить удаление этого единственного оставшегося раздела?
Ваш код уже предотвращает удаление index = 1
, верно? Но вы хотите предоставить способ сохранить, скажем, index = 2
удаление 1 и 3. Правильно?
Перво-наперво: откуда вы знаете индекс, идентификатор, тег или любой другой маркер из RSCC, который пользователь хочет сохранить? Эта информация является ключевой, потому что вам нужно сравнить ее с итератором и сохранить только тогда, когда whatever = selected.whatever
@MarceloScofanoDiniz - вы зацикливаетесь на ненужных деталях. Все, что хочет сделать ОП, — это убедиться, что cc.RepeatingSectionItems.Count > 1
перед удалением и что cc.RepeatingSectionItems.Count >= 1
после удаления.
@ Тимоти Рилатт- Так мне больше не нужно использовать index
?
Вам все еще нужно использовать index
, так как это необходимо для циклического просмотра коллекции RSI.
@TimothyRylatt, я до сих пор не понимаю: его код уже предусматривает, что останется последний раздел; что его код не гарантирует, так это то, какой индекс следует сохранить. Насколько мне известно, ГПКС не выставляет индекс в VBA. Зная правильный индекс, чтобы сохранить его, решите его, потому что вместо If index > 1 Then
он сделает If index <> indexToPreserve
@MarceloScofanoDiniz - ты слишком много думаешь об этом. Индекс не имеет значения. ОП не знает, какой «индекс» нужно сохранить. Требуемый код просто должен удалить выбранные RSI, всегда гарантируя, что RSCC содержит как минимум один RSI.
@TimothyRylatt и Мохамад: загляните в эту тему. Я очень склонен предположить, что, хотя RSCC и красив для пользователя, это не лучший способ, если вам нужно извлечь информацию или манипулировать ею через VBA.
@MarceloScofanoDiniz - Я не знаю, почему ты меня отмечаешь. Это не мой вопрос.
Хорошо. Берегите себя, носите маски, счастливого 2021 года :)
@TimothyRylatt- Для начала я попытался изменить For index = 1 To cc.RepeatingSectionItems.Count
на For index = 0 To cc.RepeatingSectionItems.Count > 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
Спасибо, сэр! С Рождеством!
Не замечал этого до сих пор, но этот код предотвращает удаление последнего раздела. Глядя на код, я не понимаю, как это возможно. Должен предотвращать удаление только в том случае, если остался какой-либо один раздел.
@MohamadBachrouche - Мое время ценно. Я не собираюсь тратить больше времени, объясняя вам это.
Хорошо. Тогда не могли бы вы указать мне направление ресурсов, которые могут помочь объяснить это, так что вам не нужно?
Я видел вашу предыдущую тему; пожалуйста, расскажите нам, что вы пытаетесь сделать; понимаете ли вы, что удаление контроля контента сохранит введенный текст, и вы можете разрешить или запретить пользователям удалять контроль контента?