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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2010, 22:26   #1
chugo
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 46
По умолчанию Как использовать файл в место массива?

Доброго времени суток!

У меня задача сравнить все слова в документе с массивом...

Собственно ниже простой код который это обеспечит.
Но слов может быть очень много и в место массива
хотелось использовать старонный файл к примеру "slovar.txt"

Это возможно?


Код:
Private Sub CommandButton1_Click()
Dim i, j, WCount As Integer
Dim Slovo As String
Dim Slovar As Variant

Slovar = Array("Слово1 ", "Слово2 ", "Слово3 ", "...")     'slovar.txt ????

WCount = ActiveDocument.Words.Count

For i = 1 To WCount
    ActiveDocument.Words(i).Select
    Slovo = Selection.Text
    
    For j = 0 To 3
        If Slovo = Slovar(j) Then
            MsgBox ("Некоторые действия")
            Exit For
        Else
            MsgBox ("Или некоторые действия")
        End If
    Next

Next

End Sub
chugo вне форума Ответить с цитированием
Старый 14.08.2010, 22:59   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Не очень верный подход: на больших и даже не очень больших файлах будет заметно тормозить. Здесь нужно использовать поиск в документе.
Читать из текстового файла тоже можно. Удобно будет, если в текстовом файле каждое слово будет начинаться с новой строки, тогда можно читать вот так:
Код:
Dim FileNum As Byte
Dim strText As String 'переменная, в которую будем читать очередное слово
FileNum = FreeFile
Open "Полный путь к файлу" For Input As FileNum
'Построчное чтение из файла
Do While Not EOF(FileNum)
    Line Input #FileNum, strText
    'Здесь запускаем поиск текущего слова в документе
Loop
Close FileNum
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 15.08.2010, 11:01   #3
chugo
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 46
По умолчанию

Спасибо! Напишу что получится...
chugo вне форума Ответить с цитированием
Старый 16.08.2010, 13:20   #4
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

я использую такой код:
Код:
Const ForReading = 1

Dim Слова() As String       'Массив слов из словаря
Dim fso, File    'Переменные для работы с файлами

Set fso = CreateObject("Scripting.FileSystemObject")  'Объект для работы с файлами
'Открываем файл основного словаря
Set File = fso.OpenTextFile("d:\Словарь.txt", ForReading, False) 'Открываем файл для чтения
Слова() = Split(File.ReadAll(), vbNewLine)  'Считываем файл в массив
File.Close                                  'Закрываем файл
КолСтрок = UBound(Слова())  'Размер считанного массива
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 16.08.2010, 21:37   #5
chugo
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 46
По умолчанию

Skif-F и viter.alex оба варианта на этом этапе подходят для моей задачи.
Но вот беда -- что то с файла данные не правильно читает...

Файл сохраняю в UTF-8
Пишу "Слово1" и выводит "Слово1"

На латинских символах все в порядке
Как быть с нелатинскими символами?
chugo вне форума Ответить с цитированием
Старый 17.08.2010, 12:28   #6
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Почему UTF-8?
Когда я решал похожую задачу, то создал текстовый файл "Словарь.txt", в Блокноте его заполнил словами (каждое слово на своей строке, т.е. символ переноса строки (vbNewLine) являлся разделителем слов в словаре) и впоследствии использовал этот словарик, редактируя его при необходимости в том же самом блокноте.
Если же тебе необходимо хранить текст именно в кодировке UTF-8, то делай загрузку по методу viter.alex и перекодируй слова в процессе загрузки.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 17.08.2010, 12:35   #7
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Также не рекомендую использовать конструкции .Words(i), т.к. они очень медленные.
Предлагаю посмотреть на эту тему, посвящённую обработке документов Word по словам
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 17.08.2010, 13:18   #8
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Перекодировка из Юникода:
Код:
StrConv("строка",vbFromUnicode)
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 20.08.2010, 14:38   #9
chugo
Пользователь
 
Регистрация: 19.02.2009
Сообщений: 46
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Перекодировка из Юникода:
Код:
StrConv("строка",vbFromUnicode)
В общем перекодировка таким образом так и не получился
После долгого поиска по гугл нашел выход только в коде много ничего не понял... зато результат есть

Код:
'============== Start Form1 ===========
Private Const CP_UTF8 = 65001

Private Declare Function MultiByteToWideChar Lib "kernel32" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, _
   ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _
   ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Public Function sUTF8ToUni(bySrc() As Byte) As String
' Converts a UTF-8 byte array to a Unicode string
Dim lBytes As Long, lNC As Long, lRet As Long

   lBytes = UBound(bySrc) - LBound(bySrc) + 1
   lNC = lBytes
   sUTF8ToUni = String$(lNC, Chr(0))
   lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(bySrc(LBound(bySrc))), lBytes, StrPtr(sUTF8ToUni), lNC)
   sUTF8ToUni = Left$(sUTF8ToUni, lRet)
End Function

Private Function ConvertUTF8File(sUTF8File As String) As String
Dim iFile As Integer, bData() As Byte, sData As String, lSize As Long

   ' Get the incoming data size
   lSize = FileLen(sUTF8File)
   If lSize > 0 Then
       ReDim bData(0 To lSize - 1)

       ' Read the existing UTF-8 file
       iFile = FreeFile()
       Open sUTF8File For Binary As #iFile
       Get #iFile, , bData
       Close #iFile

       ' Convert all the data to Unicode (all VB Strings are Unicode)
       sData = sUTF8ToUni(bData)
   Else
       sData = ""
   End If
   ConvertUTF8File = sData
End Function



'============== End Form1 ===========
Private Sub CommandButton2_Click()
Dim vLine As Variant, sFileBody As String

   ' Load the UTF-8 file body into a Unicode string variable
   sFileBody = ConvertUTF8File("c:\txtutf8.txt")
   ' Remove the leading Unicode marker from the body (i.e. the &HFEFF sequence)
   sFileBody = Mid$(sFileBody, 2)
   Debug.Print sFileBody
   ' Now add the separate lines to out list box
   For Each vLine In Split(sFileBody, vbCrLf)
       List1.AddItem CStr(vLine)
   Next vLine
End Sub
Смотрю на код и думаю...
РАЗВЕ МИКРОСОФТ НЕ МОГ ПРИДУМАТЬ ЛЕГЧЕ СПОСОБА? ЭТОЖ МАРАЗМ КАКОЙ ТО!

Последний раз редактировалось chugo; 20.08.2010 в 14:43.
chugo вне форума Ответить с цитированием
Старый 23.08.2010, 11:02   #10
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

т.е. ты считаешь, что Microsoft должна была предусмотреть команды Бейсика на все случаи жизни? подумай, какого размера была бы библиотека?
А в коде всё просто - есть функция MultiByteToWideChar, взятая из .dll, для упрощения работы с ней сделана вспомогательная функция ConvertUTF8File, а процедура CommandButton2_Click перекодирует текстовый файл из формата в формат, используя описанные выше функции.
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinInet загрузить файл во временной файл , использовать, потом удалить Человек_Борща Работа с сетью в Delphi 5 03.08.2010 13:46
Как резервировать место при создании файла? 3D Hunter Общие вопросы Delphi 13 23.07.2010 18:42
Как выставить место по итогам конкурса mityakul Microsoft Office Excel 13 12.04.2010 18:25
Как место меню закрытия окна вставить что-то свое? chandrasecar Win Api 12 12.10.2008 01:45