Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Помогите разобраться с повторяющимися данными в VBS (http://forum.oszone.net/showthread.php?t=261420)

Boris26rus 28-05-2013 23:32 2158125

Помогите разобраться с повторяющимися данными в VBS
 
Вложений: 1
  • Ent.xlsx (10.90 KB, скачиваний: 14)
Добрый вечер.
Я только учусь писать на VBS. Общий смысл такой - берем данные из Excel и переносим их в Word.
Проблема - в Excel-файле бывают несколько одинаковых строк, которые все переносятся в Word. Но мне не надо их переносить, если они одни и те же (например в Excel есть: Иванов
Петров
Иванов
- перенести нужно: "Иванов, Петров")
В VBS написал так:

IF objRec.Fields(2) = "Фамилия" THEN fio = fio1&chr(13)&objRec.Fields(3)&"," &chr(13)& "прож. по адресу:"


И получается так:
"Иванов
прож. по адресу:
Петров
прож. по адресу:
Иванов
прож. по адресу:"

А нужно:
"Иванов
прож. по адресу:
Петров
прож. по адресу:"

Помогите, пожалуйста!

Полный код:
Код:

Set oArg = Wscript.Arguments
fName = oArg.Item(0)

Set objCon = CreateObject("ADODB.Connection")
Set objRec = CreateObject("ADODB.Recordset")

objCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="&fName&";Extended Properties=""Excel 12.0 Xml;HDR=Yes;"";"
objRec.Open "Select * From [ReportData$]",objCon,3,3

Do Until objRec.EOF
               
        IF objRec.Fields(2) = "Фамилия" THEN fio        = fio&chr(13)&objRec.Fields(3)&"," &chr(13)& "прож. по адресу:"

          objRec.MoveNext
Loop

Set oWord = CreateObject("Word.Application")
oWord.Visible = True
Const wdReplaceAll = 2

Set oDoc = oWord.Documents.Open("C:\Данные\Фамилии.rtf")
Set oSel = oWord.Selection
oSel.Find.Forward = TRUE
oSel.Find.MatchWholeWord = TRUE

oSel.Find.Execute "fio"            ,,,,,,,,,fio            ,wdReplaceAll
oDoc.SaveAs("c:\Данные\Фамилии "&fio&".doc")


Iska 29-05-2013 05:58 2158204

Boris26rus, выложите образец документа Excel, выложите Ваш код. Целиком, а не одну строку.

Iska 29-05-2013 22:10 2158846

Код:

objRec.Open "SELECT DISTINCT * FROM [ReportData$]", objCon, 3, 3
SELECT (Transact-SQL) ? Выражение SELECT (Transact-SQL).

Boris26rus 30-05-2013 12:38 2159206

Спасибо!
А как привязать это именно к переменной "fio"?
При запуске, когда много фамилий, выдает ошибку - "Слишком длинный строковый параметр".
Может подскажите как исправить.

Iska 30-05-2013 15:01 2159316

Цитата:

Цитата Boris26rus
А как привязать это именно к переменной "fio"? »

А причём тут переменная?

Цитата:

Цитата Boris26rus
При запуске, когда много фамилий, выдает ошибку - "Слишком длинный строковый параметр". »

Выложите архив под паролем c документом на RGhost, ссылку на архив и пароль — в личку.

Iska 31-05-2013 05:15 2159673

Boris26rus, проблема к запросу к рабочей книге не имеет отношения. Слишком длинная строка («por1») для использования в диалоге поиска и замены:
Код:

oSel.Find.Execute "por1"          ,,,,,,,,,por1            ,wdReplaceAll
— вижу, Вы так и не добавили предикат «DISTINCT» в запрос.

Если добавить — то следующей ошибкой будет «Несоответствие типа» в:
Код:

oSel.Find.Execute "raschet"        ,,,,,,,,,raschet        ,wdReplaceAll
поскольку переменная «raschet» оказывается равна «Null».

Boris26rus 31-05-2013 12:09 2159806

Iska, добрый день и спасибо!
Я «DISTINCT» вставил сразу, но как Вы и указали, стала возникать ошибка с переменной «raschet». Тогда я и спросил как можно привязать «DISTINCT» только к той переменной, которой нужен такой "фильтр" (самостоятельные эксперименты по "привязке" у меня были безрезультатны).
А вот по слишком длинной строке пробовал разбить так:

Код:

Sub Replace(rtext,text)
        if len(text)>255 then
                oSel.Find.Execute rtext  ,,,,,,,,,"temp"  ,wdReplaceAll
                i=len(text)/250       
                if (i-FIX(i))>0 then i=FIX(i)+1
                z=1
                For y=1 to i
                        stext=Mid(text,z,248) + " temp"
                        oSel.Find.Execute " temp"  ,,,,,,,,,stext  ,wdReplaceAll
                        z=y*248+1
                NEXT
        else
                oSel.Find.Execute rtext  ,,,,,,,,,text  ,wdReplaceAll
        end if
        oSel.Find.Execute " temp"  ,,,,,,,,,""  ,wdReplaceAll
End Sub

- не помогло.
Не пойму почему переменная «raschet» равна «Null» и как избежать ошибки.

Iska 31-05-2013 20:29 2160092

Вы спросили:
Цитата:

Цитата Boris26rus
Проблема - в Excel-файле бывают несколько одинаковых строк, которые все переносятся в Word. Но мне не надо их переносить, если они одни и те же »

я показал, как избавиться от повторов. Весь же Ваш алгоритм я не рассматривал — он чересчур запутан и не очень логичен.


Время: 19:55.

Время: 19:55.
© OSzone.net 2001-