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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2010, 20:50   #1
andrkar
 
Регистрация: 21.01.2010
Сообщений: 5
По умолчанию Выборка из массива

Нужна помощь! В ворде С помощью макроса получил одномерный массив символьный фиксированной длины. Нужно из него получить другой массив, исключив из исходного массива одинаковые строки. Количество элементов массива заранее неизвестно (получается программно). для завершения программы необходима данная функция. А я в ступоре. Вроде все просто должно быть.
Заранее благодарен
andrkar вне форума Ответить с цитированием
Старый 22.01.2010, 00:09   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Количество элементов в одномерном массиве определяется функцией UBound(массив)
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 22.01.2010, 04:06   #3
andrkar
 
Регистрация: 21.01.2010
Сообщений: 5
Вопрос

Может я немного не так написал условие?.. Количество элементов в данном массиве я получаю макросом после некоторой обработки текста. Массив из строк есть, количество элементов в массиве известно. Нужно только исключить из массива одинаковые строки, причем используя не текстовое, а бинарное сравнение строк (то есть используя StrComp)
andrkar вне форума Ответить с цитированием
Старый 22.01.2010, 05:29   #4
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Аналогия в Excel

В принципе подошёл бы код от Pavel55.

Только тогда надо массив поместить в Excel. Или ту же идею использовать здесь.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 22.01.2010, 06:10   #5
Вождь
Форумчанин
 
Аватар для Вождь
 
Регистрация: 29.09.2008
Сообщений: 378
По умолчанию Двойная работа

А что мешает еще при создании массива, не добавлять в него одинаковые элементы?

Если строк очень много, то для их хранения и обработки лучше использовать отдельный документ Word.
Макросы на заказ и готовый пакет - http://mtdmacro.ru/

Последний раз редактировалось Вождь; 22.01.2010 в 08:10.
Вождь вне форума Ответить с цитированием
Старый 22.01.2010, 09:49   #6
andrkar
 
Регистрация: 21.01.2010
Сообщений: 5
По умолчанию

согласен, сейчас думаю над тем, как формировать массив без повторений.
вообще полностью задача звучит так - необходимо в текущем документе найти все сокращения (то есть слова состоящие только из заглавных русских или английских букв) и из них сформировать таблицу трех столбцов, в которых - наййденные сокращения без повторения в первом столбце, во всех ячейках второго столбца знак тире, третий столбец пустой.
Кто что посоветует с формирование массива без повторений??

Последний раз редактировалось andrkar; 22.01.2010 в 09:56. Причина: полное описание задачи
andrkar вне форума Ответить с цитированием
Старый 22.01.2010, 10:37   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
Кто что посоветует с формирование массива без повторений??
Создайте новую коллекцию и перед занесением очередного элемента в массив, добавляйте этот элемент в коллекцию, перехватывая возможную при этом ошибку. Т.к. двух одинаковых членов коллекции быть не может, то это значит, что если ошибка возникла, то такой элемент уже есть и добавлять его в массив не нужно. Пусть, например, переменная ABCD содержит текущее значение. Тогда:
Код:
Dim x As New Collection
On Error Resume Next
x.Add ABCD, CStr(ABCD)
If Err = 0 Then
    'Добавляем в массив
Else
    On Error GoTo 0
End If
Ваш массив не будет содержать повторений. Также, можно использовать словарь.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 22.01.2010 в 11:30.
SAS888 вне форума Ответить с цитированием
Старый 22.01.2010, 13:38   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

С использованием вспомогательного документа. В результате работы процедуры получим массив с не повторяющимися аббревиатурами. Последний элемент массива будет пустым.
Код:
Sub CreateArray()
  Dim oTempDoc As Document
  Dim oWorkDoc As Document
  Dim nPar As Long
  Dim arAbbrs() As String
  
  Set oWorkDoc = ActiveDocument
  Set oTempDoc = Documents.Add(Visible:=False)
  
  'Ищем все аббревиатуры
  With oWorkDoc.Range.Find
    .Text = "<[A-ZА-ЯЁ]@>"
    .MatchWildcards = True
    While .Execute
      'В конец временного документа вставляем найденную аббревиатуру и новый абзац
      oTempDoc.Range.InsertAfter .Parent.Text
      oTempDoc.Range.InsertParagraphAfter
      DoEvents
    Wend
  End With
  
  'Удаляем повторения
  nPar = 1
  While nPar <= oTempDoc.Paragraphs.Count - 1
    With oTempDoc.Range(oTempDoc.Paragraphs(nPar).Range.End, oTempDoc.Range.End).Find
      .Text = oTempDoc.Paragraphs(nPar).Range.Text
      .Replacement.Text = ""
      .Execute Replace:=wdReplaceAll
    End With
    DoEvents
    nPar = nPar + 1
  Wend
  
  'Удаляем два пустых абзаца подряд
  With oTempDoc.Range.Find
    .Text = "^p^p"
    .Execute Replace:=wdReplaceAll
  End With
  
  'Преобразовываем в массив
  arAbbrs = Split(oTempDoc.Range.Text, vbCr)
  
  'Закрываем временный документ без сохранения настроек
  oTempDoc.Close False
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 22.01.2010, 18:10   #9
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

Зачем создавать новый документ? чето слишком сложно для такой задачи...
Вместе с ViterAlex'ом можно и так:
Код:
Sub CreateArray()
  Dim arAbbrs() As String
  Dim tstr As String, test As Boolean, i As Integer, c As Integer

  c = 0
  'Ищем все аббревиатуры
  With ActiveDocument.Range.Find
    .Text = "<[A-ZА-ЯЁ]@>"
    .MatchWildcards = True

    While .Execute
      tstr = .Parent.Text
      if c > 0 then
         test = true
         for i = 0 to c-1 
            if tstr = arAbbrs(i) then 
              test = false
              exit for
            end if
         next i
         if test then
            redim preserve arAbbrs(c)
            arAbbrs(c)=tstr
            c=c+1
         end if
      else
         redim arAbbrs(0)
         arAbbrs(0) = tstr
         c=c+1
      end if
      DoEvents
    Wend
  End With
и в arAbbrs будет нужный массив... и бдет быстрее работать...
tolikman вне форума Ответить с цитированием
Старый 22.01.2010, 18:16   #10
andrkar
 
Регистрация: 21.01.2010
Сообщений: 5
По умолчанию Вариант решения задачи до получения массива

Option Explicit 'Объявлять переменные
Dim masssokr(1000) As String ' определение массива для найденных строк
--------------------------------------------
это сделано в начале модуля, снаружи функций и подпрограмм.
Далее - функция проверки совпадения элементов и добавления уникального в массив.

Function CheckAdd_STR(STR As String) As Long
Dim I As Long
Static mass_N As Long
For I = 0 To mass_N
If STR = masssokr(I) Then
CheckAdd_STR = mass_N
Exit Function
End If
Next I
masssokr(mass_N) = STR
mass_N = mass_N + 1
CheckAdd_STR = mass_N
End Function
------------------------------------------------------
Ну а теперь собственно сам код поиска сокращений в документе:
Sub Find_Sokr
Dim I As Long
Dim Sokr_N As Long ' число найденных сокращений

Selection.HomeKey Unit:=wdStory 'переходим к началу документа
With Selection.Find 'Задаем условия для поиска
.Text = "<[A-ZА-ЯЁ][A-ZА-ЯЁ]@>" 'комбинация подстановочных знаков,
'позволяющая выбирать слова, состоящие
'только из заглавных русских и английских
'букв

.Forward = True 'направление поиска
.Wrap = wdFindStop 'условие остановки поиска
.MatchWildcards = True 'флаг, включающий использование подстановчных знаков
End With

Do While Selection.Find.Execute = True 'цикл поиска от начала до конца документа
Selection.Find.ClearFormatting
Sokr_N = CheckAdd_STR(Selection.Text) 'Счетчик уникальных элементов в массиве
Loop
End Sub
-----------------------------------------------------------
необходимые данные находятся в массиве
masssokr () размером Sokr_N
Ну а далее уже можно с этими данным делать нужные манипуляции
andrkar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выборка из массива marchukav Microsoft Office Excel 5 26.11.2009 19:31
Выборка по двум критериям массива в Excel Ultramax Microsoft Office Excel 1 26.11.2009 17:41
Выборка массива по битовой сетке Sairaks Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 17.11.2009 19:36
Случайна выборка из массива spectralw Помощь студентам 0 01.05.2009 21:03
выборка и сравнение из массива Dennikid Общие вопросы Delphi 15 03.10.2008 09:25