2016-07-28 8 views
1

Я получаю сообщение об ошибке «Переменная объекта не установлена» в строке 15 при запуске моего кода. Я не получаю это каждый раз. Это кажется случайным. Я искал, но не могу найти причин для этого. У меня возникла проблема с тем, что переменная не очищается все время, поэтому я просто добавил строку 42 Set strText = Nothing. Моя проблема с неправильной настройкой переменной исчезла, но теперь у меня это есть. Любая помощь будет принята с благодарностью. Код ниже.VBScript Объектная переменная не установлена ​​

Option Explicit 
Dim i, objFSO, objFile, strText, Fields, TimeStamp, Location, MachNum, Amount, Theme, objSMFile, SMLine, p, CSVLine, objReportFile, FileName 
Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Do while i<>1 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    If objFSO.FileExists("C:\Print\output.txt") Then 
     '*** Clean up CR/LF and Make CSV Variable *** 
     Set objFile = objFSO.OpenTextFile("C:\Print\output.txt", ForReading) 
     If Not objFile.AtEndOfStream Then strText = objFile.ReadAll 
     objFile.Close 
'  WScript.Sleep 1000 
     objFSO.CopyFile "C:\Print\output.txt", "C:\Print\outputCopy.txt" 
     objFSO.DeleteFile("C:\Print\output.txt") 
'  WScript.Sleep 3000 
     strText = Replace(strText, vbCrlf, "") 
     strText = Replace(strText, " ", ";") 
     ' Split by semi-colon into an array... 
     Fields = Split(strText, ";") 
     TimeStamp = Fields(0) 
     Location = Fields(1) 
     MachNum = Fields(3) 
     Amount = Fields(4) 
     '*** Find Machine Number in Slot Master *** 
     Set objSMFile = objFSO.OpenTextFile("C:\Scripts\SlotMaster.csv", ForReading) 
     do while not objSMFile.AtEndOfStream 
      SMLine=objSMFile.readline 
      p=instr(SMLine, MachNum) 
      if p>0 then CSVLine = SMLine 
     Loop 
     ' Split by comma into an array... 
     Fields = Split(CSVLine, ",") 
     Theme = Fields(7) 
     '*** Create Tab Delimited Text File *** 
     FileName = Year(Now) & "-" & Month(Now) & "-" & Day(Now) & " Jackpots.txt" 
     If Not objFSO.FileExists("C:\Print\" & FileName) Then 
      Set objReportFile = objFSO.CreateTextFile("C:\Print\" &FileName) 
      objReportFile.Close 
     End If 
     Set objReportFile = objFSO.OpenTextFile("C:\Print\" & FileName, ForAppending) 
     objReportFile.Write TimeStamp & vbTab & Location & vbTab & Amount & vbTab & Theme & vbCrLf 
     objReportFile.Close 
     Set strText = Nothing 
    End If 
Loop 
+1

Предлагаемое чтение: [Как создать минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve) – wogsland

ответ

6

короткий ответ

strText не является объектом. Его там для обработки строки.

Вы должны, таким образом, переинициализации его:

strText= "" 

LONG ОТВЕТА

Когда вы

Set strText = Nothing 
  1. Вы неявно объявить strText как объект, и, следовательно, это не строка больше. Поэтому при попытке присвоить ему значение "" (пустая строка) не допускается.
  2. Вы уменьшаете опорный счетчик, что делает объект не адресуемым больше и кандидатом для сборщика мусора. Таким образом, в следующий раз на нем будет выполнено Replace() или .ReadAll, это провалится, потому что его больше не существует. И даже если бы он существовал, он потерпел бы неудачу, потому что это не строка, как указано ранее.
+0

Теперь я получаю случайный «Подзаголовок вне диапазона:» [номер : 0] "в строке 17. –