PDA

Показать полную графическую версию : Помогите разобраться с повторяющимися данными в VBS


Boris26rus
28-05-2013, 23:32
Добрый вечер.
Я только учусь писать на 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
Boris26rus, выложите образец документа Excel, выложите Ваш код. Целиком, а не одну строку.

Iska
29-05-2013, 22:10
objRec.Open "SELECT DISTINCT * FROM [ReportData$]", objCon, 3, 3

SELECT (Transact-SQL) (http://msdn.microsoft.com/ru-ru/library/ms189499(v=sql.90).aspx) → Выражение SELECT (Transact-SQL) (http://msdn.microsoft.com/ru-ru/library/ms176104(v=sql.90).aspx).

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

Iska
30-05-2013, 15:01
А как привязать это именно к переменной "fio"? »
А причём тут переменная?

При запуске, когда много фамилий, выдает ошибку - "Слишком длинный строковый параметр". »
Выложите архив под паролем c документом на RGhost, ссылку на архив и пароль — в личку.

Iska
31-05-2013, 05:15
Boris26rus, проблема к запросу к рабочей книге не имеет отношения. Слишком длинная строка («por1») для использования в диалоге поиска и замены:
oSel.Find.Execute "por1" ,,,,,,,,,por1 ,wdReplaceAll
— вижу, Вы так и не добавили предикат «DISTINCT» в запрос.

Если добавить — то следующей ошибкой будет «Несоответствие типа» в:
oSel.Find.Execute "raschet" ,,,,,,,,,raschet ,wdReplaceAll
поскольку переменная «raschet» оказывается равна «Null».

Boris26rus
31-05-2013, 12:09
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
Вы спросили:Проблема - в Excel-файле бывают несколько одинаковых строк, которые все переносятся в Word. Но мне не надо их переносить, если они одни и те же »
я показал, как избавиться от повторов. Весь же Ваш алгоритм я не рассматривал — он чересчур запутан и не очень логичен.




© OSzone.net 2001-2012