Scripting.FileSystemObject - не фурычит

Олег aka 3вероВоу

в реферансах Scripting Runtime подключена
Dim myfilename As Variant

myfilename = Application.GetOpenFilename
If myfilename = False Then
 Exit Sub
End If

Dim fso As Scripting.FileSystemObject
Dim l As Variant

Set fso = CreateObject("Scripting.FileSystemObject")
Set l = fso.OpenTextFile(myfilename)
ругается:
ActiveX component can't create object
выделяет как ошибку CreateObjectв чем прикол?
19 ответов

Олег aka 3вероВоу

Вот этот код прекрасно работает.
Dim fs, f

 On Error Resume Next

 Set fs = CreateObject("Scripting.FileSystemObject")
 Set f = fs.OpenTextFile("C:\t.txt", <b>8</b>, True, <b>0</b>)
 f.Write DateTime.Date$ & " " & DateTime.Time$ & " : " & Text & vbCrLf
 f.Close
В референс Scripting Runtime ОТКЛЮЧЕНА.


Олег aka 3вероВоу

Спасибо за ответ, но мне ваще-то читать его надо...сорри, что недописал, далее идет:
For t = <b>1</b> To <b>10000</b>
If l.AtEndOfStream <> True Then 
ReDim Preserve a(t)
a(t) = l.ReadLine
Else: GoTo <b>1</b>
End If
Next t

<b>1</b>: l.Close
с Вашим вариантом не считывает строкифайл, который открывается, - текстовый


Олег aka 3вероВоу

Вот этот код прекрасно работает. Dim fs, fOn Error Resume NextSet fs = CreateObject("Scripting.FileSystemObject") Set f = fs.OpenTextFile("C:\t.txt", 8, True, 0) f.Write DateTime.Date$ & " " & DateTime.Time$ & " : " & Text & vbCrLf f.CloseВ референс Scripting Runtime ОТКЛЮЧЕНА.
Конечно прекрасно. Ведь он ничего не делает!Поскольку
В референс Scripting Runtime ОТКЛЮЧЕНА.
то ошибка обязательно возникает, но при
On Error Resume Next
она не показывается, а просто пропускается, как и все остальные. В шести строчках этого кода получаем четыре ошибки.Но это должно работать если включить В референс Scripting Runtimе.Я бы предложил все же явно описывать переменные.
Dim fsoFile As New FileSystemObject
Dim fileStreamIN As TextStream
Set fileStreamIN = fsoFile.OpenTextFile(fileIN)


Олег aka 3вероВоу

А зачем вообще использовать поганый FileSystemObject???Можно просто открывать файл на чтение, или запись, или вообще как хошь.Open Filename For Input As #1For...ReDim Preserve a(t)Line Input #1, a(t)Next...Close #1


Олег aka 3вероВоу

А зачем вообще использовать поганый FileSystemObject???
Прошу прощения, но он совсем даже не поганый. Еcли вы не умеете им пользоваться, не надо валить все на майкрософт. FSO замечательно работает.


Олег aka 3вероВоу

Умеем. Потому и сравниваем.


Олег aka 3вероВоу

Умеем. Потому и сравниваем.
Такая аргументация присуща научной дисциплине под названием "Сравнительная фаллометрия"


Олег aka 3вероВоу

Сорри, был в командировкеНе сорьтесь, горячие финские парни. :)FSO использую, т.к. он быстрее работает, чем просто перебор строксамое интересное, что указанный мной код раньше прекрасно работал... а щас че-то не фурычит? причем ни с того, ни с сегоне пойму почему? ::confused::вернее работает, но считывает пустые строки(файл - источник данных - блаблабла.txt)


Олег aka 3вероВоу

и ещё...хотел получить список файлов из папки:
Function ShowFileList(folderspec)
Dim fso, fld, f1, fc, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(folderspec)
Set fc = fld.Files
For Each f1 In fc
s = s & f1.Name
s = s & vbCrLf
Next
ShowFileList = s

End Function
опять то же самое, выделяет строку и пишет, что, дескать,
не в силах АктивХ сделать мне хорошо


Олег aka 3вероВоу

Может вот это поможет?


Олег aka 3вероВоу

2Melkiades: огромное спасибо!и как я не догадался!недогадлИвый какой-то стал :)там оказываецца баг какой-то...исправление тутВсем спасибо за отзывы


Олег aka 3вероВоу

FSO использую, т.к. он быстрее работает, чем просто перебор строк
В защиту FSO и в качестве примера "перебора строк" привожу пример из реально работающей "примочки".Часть деклараций опущена.
Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" _
 (ByVal lpszSrc As String, ByVal lpszDst As String) As Long

Public Sub Test()
Dim fso As New Scripting.FileSystemObject	'Достаточно 1 объекта на всю работу.
Dim txtFl As Scripting.File			'Формат файла не имеет значения:								 		'важны байты, его составляющие
Set txtFl = fso.GetFile(PathToTxt) 	'DOS-текст (866 кодовая страница)
Dim txtStrmI As Scripting.TextStream		'работа со строками (типа StdIn,StdOut)
'Уходим от файловых операций к операциям с потоком символов:
Set txtStrmI = txtFl.OpenAsTextStream(ForReading, TristateFalse)
'Вместо работы с отдельными строками, считываемыми из потока,
'будем работать со всеми символами потока, включая vbCrLf.
'С этой целью утилизируем ещё одно преимущество современной техники - большую память:
'в одной VB-строке можно разместить все Unicode-символы текстового файла.
Dim sDOS As String			'Исключительно для читабельности кода
Dim sASCII As String			'резервируем ДВЕ строки. WinAPI правильно
Dim RetCode As Long			'перекодирует текст и в случае задания dst=src.
'Без всякого цикла загоняем все ЛОГИЧЕСКИЕ строки в единую строку VB
sDOS = txtStrmI.ReadAll 'весь файл с DOS-текстом загоняем в VB-строку
RetCode = OemToChar(sDOS, sASCII) 'к-рую перекодируем средствами самой Windows.
sDOS = "" 'очищаем ненужную в дальнейшем строку
'Set txtStrmO = fso.OpenTextFile(ThisWorkbook.Path & "\ОТЧЕТ.txt", ForWriting, True, TristateFalse)
'txtStrmO.Write sASCII 'эти три оператора остались из отладочного варианта;
'txtStrmO.Close						 
'Далее можно проводить работу с данными без файловых операций. 
'Можно выделять строки, разбирать строки на термы "от головы до хвоста (InStr)",
' "от хвоста до головы (InStrRev)", "из глубины души (Mid)". Напр.: 
Dim p As Long, q As Long, sPayOrder As String, s As String, v As Variant, k As Long
p = InStr(<b>1</b>, sASCII, VTotal) 'Извлекаем строку, содержащую DOS-сформированную
q = InStr(p, sASCII, vbCrLf) 'базу налогообложения.
v = Split(Mid(sASCII, p, q - p + <b>1</b>), "|") 'Подготовим строку для преобразования
k = UBound(v, <b>1</b>) - <b>1</b> 'в ******
sDOS = v(k): sDOS = Replace(sDOS, ".", ",") 'и сохраним "на потом" в sDOS.

p = InStr(<b>1</b>, sASCII, OsProd, vbTextCompare) 'Из всего документа нам нужна только часть налоговой
q = InStr(p, sASCII, EOPartOne, vbTextCompare) 'с необходимыми и достаточными исходными данными.
sPayOrder = Mid(sASCII, p, q - p) 'Эта часть найдена и помещена в строку-хранилище...
'
' и т.д.
'
End Sub


Олег aka 3вероВоу

Гммм, собственно, о чем пример-то?Получить строку целиком можно и через Open (я знаю 10 способов)Например:Dim f3 As Stringf3 = String(FileLen(MyFile), vbNull)Open MyFile For Binary As #3Get #3, 1, f3Close #3Получаем весь файл в строке f3.А всё остальное (строковые преобразования) к fso отношения не имеет.:))...На самом деле, кому что удобнее.


Олег aka 3вероВоу

подскажите пожалуйста, где "В референс Scripting Runtime" включать и выключать? word русский


Олег aka 3вероВоу

подскажите пожалуйста, где "В референс Scripting Runtime" включать и выключать? word русский
попробуйте обзором выбрать файл из папки system32 scrrun.dll


Олег aka 3вероВоу

воспользуюсь темой. немного похожей.
Dim cnnDBF As ADODB.Connection

With cnnDBF
 .ConnectionString = _
 "Provider=MSDASQL.1;" & _
 "Persist Security Info=False;" & _
 "Data Source=FPD26;" & _
 "Mode=ReadWrite;"
 .CursorLocation = adUseClient
 .CommandTimeout = <b>30</b>
 .Open
 End With
...
On Error GoTo ErrHndlr
 txtSQL = "CREATE TABLE ... "
 txtErr = "Не могу создать файл ведомости " & PathTable & "\" & NameTable
 cnnDBF.Execute txtSQL, , adExecuteNoRecords
 
 txtSQL = "INSERT INTO ...."
 txtErr = "Не могу добавить служебную строку в файл ведомости " & PathTable & "\" & NameTable
 cnnDBF.Execute txtSQL, , adExecuteNoRecords
 
EndFunc:
 CreateVedom = PL.Stream
 If cnnDBF.State <> adStateClosed Then cnnDBF.Close
 On Error GoTo <b>0</b>
 Exit Function
 
ErrHndlr:
 PL.ErrDescription = ": " & txtErr & vbNewLine & "Код: " & Err.Number & " " & Err.Description
 Resume EndFunc

'эта часть отрабатывает без ошибки. cnnDBF.Close должен отработать
....


' сдесь файл переименовывается в силу производственной необходимости
BakFile = Left$(PathNameDBF, InStr(PathNameDBF, ".")) & "bak"
If FSO.FileExists(BakFile) Then FSO.DeleteFile BakFile
FSO.MoveFile PathNameDBF, BakFile 'err[/quote]
создается ДБФник. в него вносятся данные, после чего этот ДБФник необходимо переименовать. файл действительно создается, копируется, открывается на чтение Set F_Bak = FSO.OpenTextFile(BakFile, ForReading)при попытке переименования (или удаления, если использовать копирование-удаление) получаю АкцесДенаид.описанная ситуация возникает на ВинХР и редко на Вин2000.выполнение программы пошагово проходит нормально.вдруг кто сталкивался - в чем может быть загвоздка(гугел, к сожалению, недоступен)


Олег aka 3вероВоу

сорри за форматирование.


Олег aka 3вероВоу

А зачем вообще использовать поганый FileSystemObject???...
Да чем же он поганый?:0)


Олег aka 3вероВоу

Да чем же он поганый?:0)
У него имя длинное, писать долго. Имена объектов должны быть короткими и легкими. Вот например i или j, в крайнем случае k. А объект у которого в имени аж шестнадцать букв - поганый, однозначно поганый.