Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2011, 09:54   #1
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию For Each наоборот

Столкнулся с интересной проблемой. Надо удалить каждую вторую ячейку документа, путем последовательного перебора. Все довольно просто реализуется при переборе от начала к концу документа:
Код:
Dim R As Range
Dim T As Table
Dim C As Cell
Dim N As Long
    
    Set R = ActiveDocument.Range
    N = 0
    For Each T In R.Tables
        For Each C In T.Range.Cells
            N = N + 1
            If (N Mod 2) = 0 Then C.Delete
        Next C
    Next T
А вот от конца к началу документа, все намного сложнее. For Each тут не поможет. А из-за того, что при удалении ячейки, объекты Range изменяются неадекватно, никакой другой вариант перебора реализовать не удалось. Будут идеи?

Проблема относится не только к ячейкам, а к любым элементам документа, которые надо перебирать, при этом по ходу внося изменения в документ.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 28.01.2011, 12:23   #2
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Спрошу по-другому. Как запомнить позицию в документе, чтобы она сохранялась при внесении изменений??? Т.е. при вставке/удалении чего-либо перед/после/в месте позиции. Проблема чувствительна, когда позиция в таблице.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 28.01.2011, 13:36   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я АБСОЛЮТНЫЙ ноль в программировании под MS Word (более того, интуитивно чувствую, что там объектная модель такая, что сам Билл Гейтс в ней ноги себе сломает).
Но, на Вашем месте, я бы посмотрел в сторону закладок (bookmarks) - они как раз привязываются к определённому месту документа и вносимые изменения/добавления/удаления текста на них не влияют (точнее, они "передвигаются" вместе с текстом документа)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.01.2011, 14:39   #4
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

может так (без проверки для 1 таблицы)

Код:
Dim R As Range
Dim T As Table
Dim C As Cell
Dim N As Long,j1,j1k
    
    Set R = ActiveDocument.Range
    N = 0
    j1k=R.Tables(1).ROWS.count
   do while j1k>0
      j1k=j1k-1
     set T=R.Tables(1).ROWS(J1K)
        For Each C In T.Range.Cells
            N = N + 1
            If (N Mod 2) = 0 Then C.Delete
        Next C
   LOOP
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 28.01.2011, 14:42   #5
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
...я бы посмотрел в сторону закладок...
Я прикидывал с закладками, но получается довольно сложно. Идея сделать закладку от края документа до контрольной позиции тоже стопорится при попадании внутрь таблицы Придется создавать минимум две закладки: одна - от края до начала строки таблицы, вторая - внутри строки таблицы. А т.к. при удалении области удаляются и закладки в этой области, то придется контролировать еще их целостность.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 28.01.2011, 14:55   #6
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от shanemac51 Посмотреть сообщение
...может так (без проверки для 1 таблицы)...
Да уж, без проверки. Нет, не то.

Главное реализовать перебор ячеек с конца документа. При этом по ходу перебора может быть удалена таблица, строка, столбец, ячейка. И не смотря на удаление, перебор оставшихся ячеек должен продолжиться.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 28.01.2011, 15:16   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

если For Each тут не поможет, которым я стараюсь не пользоваться может стоить указать конкретное число ячеек
А вообще я опробовал имею таблицу 5 столбцов, 2 строки, в каждую яейку записал её номер от 1 до 10, код сделал, удалились 2, 4, 6, 8, 10
Что не так?
Проблемы не вижу
Ципихович Эндрю вне форума Ответить с цитированием
Старый 28.01.2011, 16:11   #8
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
...Что не так?...
Удаление ячеек взято для примера. Главное - порядок перебора. После удаления ячейки мне надо знать, какая ячейка следующая/предыдущая. Как в For Each, только наоборот.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/
Вождь вне форума Ответить с цитированием
Старый 28.01.2011, 16:49   #9
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию удаление вколлекциях всегда с хвоста

Код:
Sub m110128_1629()

Dim R As Range
Dim T As Table
Dim C As Cell
Dim N As Long, j1, j1k

Set R = ActiveDocument.Range
N = 0
''прямой счет таблиц
''обратный для строк и ячеек
For Each T In R.Tables
  j1k = T.Rows.Count
  Do While j1k > 0
  
    For Each C In T.Rows(j1k).Cells
    N = N + 1
    If (N Mod 2) = 0 Then C.Range.Text = "ddd"
    If (N Mod 2) = 0 Then C.Delete
    Next C
  j1k = j1k - 1
  Loop
Next T

End Sub
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Старый 28.01.2011, 18:19   #10
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,034
По умолчанию

стоить указать конкретное число ячеек
цикл
а после удаления уменьшить на один длину цикла
Ципихович Эндрю вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
бекап только наоборот Cpluser SQL, базы данных 1 23.01.2011 12:30
Все наоборот! ship85 Microsoft Office Excel 0 20.01.2011 14:19
Ввод слова наоборот program123 Общие вопросы Delphi 4 09.05.2009 11:06
ВПР наоборот Python Microsoft Office Excel 6 11.04.2009 00:08
Слово наоборот Ketu Паскаль, Turbo Pascal, PascalABC.NET 12 16.03.2008 00:23