2015-07-24 2 views
0

У меня есть этот код VBA, который проверяет все файлы в папке. Если файл не является pdf, он открывает его. Затем он создает петли для каждого абзаца в тексте, и если параграф содержит некоторые фиксированные символы, он экспортирует текст абзаца и значения в БД доступа.Объектная переменная или с переменной блока не установлена ​​

код работает 80% времени, но в другое время, я получаю сообщение об ошибке сказав:.

переменная объекта или переменная блока не установлена»ошибка

Это мой код :

Sub retrieve() 
Dim wfile, strinsert, fileorigine, parastringa, parastring, myOutput, price, quantity, filename As String 
Dim Myrange As Range 
Dim objPara 
Dim accessdb As Access.Application 
Dim para As Paragraph 
Dim date_created, date_last_modified As Date 
Dim currfile As Document 
Application.DisplayAlerts = False 
Set accessdb = CreateObject("Access.Application") 
With accessdb 
.OpenCurrentDatabase ("C:\Users\myuser\Desktop\macro\DataBaseFr.accdb") 
.Visible = True 
.DoCmd.SetWarnings False 


For i = 0 To 100 'This will have to be updated with a counter 

If i = 0 Then ' For the first call to dir 
    wfile = Dir("C:\Users\myuser\Desktop\macro\doc\") 
Else 
    wfile = Dir 'all calls to Dir after the first 
End If 

'if .pdf then skip 
If Right(wfile, Len(wfile) - InStrRev(wfile, ".")) = "pdf" Then 
    Else 
    Set currfile = Documents.Open("C:\Users\myuser\Desktop\macro\doc\" & wfile) 
    'for each paragraph 
    fileorigine = Replace(Left(currfile.Name, (InStrRev(currfile.Name, ".", -1, vbTextCompare) - 1)), "'", "") 
    date_last_modified = Format(FileDateTime(currfile.FullName), "d/m/yy h:n ampm") 
    date_created = currfile.BuiltInDocumentProperties("Creation Date") 

    For Each para In currfile.Paragraphs 
     Set objPara = para.Range 
     objPara.Find.Text = "€" 
     objPara.Find.Execute 
     'if the line contains € 
     If objPara.Find.Found Then 
      If Left(para.Range.Text, 7) = "Sum" Then 
      'if the line contains € AND Sum 
      parastringa = para.Previous.Range.Text 
      parastring = parastringa 
      quantity = Trim(Left(para.Range.Text, (InStrRev(para.Range.Text, "€") - 1))) 
      price = Trim(Right(para.Range.Text, ((Len(para.Range.Text) - InStrRev(para.Range.Text, "€"))))) 
      Else 'if it is not a sum line 
       parastringa = para.Range.Text 
       parastring = Trim(Left(parastringa, (InStrRev(parastringa, "€") - 1))) 
       price = Trim(Right(parastringa, ((Len(parastringa) - InStrRev(parastringa, "€"))))) 
       quantity = "" 
      End If 
       strinsert = " INSERT INTO Base " & "([origin], [Description],[date_created],[Datelast],[quantity], [price]) VALUES ('" & fileorigine & "', '" & parastring & "', '" & date_created & "' , '" & date_last_modified & "', '" & quantity & "' , '" & price & "');" 
       CurrentDb.Execute strinsert, dbFailOnError 
     Else 
     End If 
    Next para 

    currfile.Close SaveChanges:=False 
End If 
i = i + 1 
Next 
CurrentDb.Close 
End With 
Application.DisplayAlerts = True 

End Sub` 

Что могло случиться и как это исправить

+0

Начните с правильного измерения ваших переменных - как показано на даты. – Gustav

+0

Вы имеете в виду, что размещение всех Dims в одной строке может вызвать проблемы? – Jack

+0

Где ошибка? на какой строке происходит сбой кода? – Gene

ответ

1

Будьте внимательны при обращении к объектам, свойствам и т. Д. Из другого приложения, в этом случае доступ к объекту «CurrentDb» из Word VBA.

Поскольку вы работаете в With accessdb блоке, это должно быть достаточно, чтобы изменить

CurrentDb.Execute strinsert, dbFailOnError 

в

.CurrentDb.Execute strinsert, dbFailOnError 

и

CurrentDb.Close 

в

.CurrentDb.Close 

Как только вы на нем, также вытащите окончательный .DisplayAlerts = True в блок С.

+0

Большое спасибо за ваш ответ, я постараюсь как можно скорее и вернусь к вам! – Jack

+0

Точно так же, как объяснение: без точки в качестве спецификатора для объекта accessdb, VBA может только догадываться, что такое '' CurrentDB' '- когда он догадывается, что это некоторая нормальная переменная Word VBA (которая в этом случае, конечно, не задана), вы получите ваша ошибка. С предыдущей точкой вы убедитесь, что VBA «знает», что вы на самом деле ссылаетесь на 'accessdb.CurrentDB'. – LocEngineer

+0

Вот и все, спасибо! – Jack

Смежные вопросы