Файловый ввод-вывод в VBA

yolki

как сделать?
А то у меня на уме только атавизм от обычного бейсика:

open "filte.txt" for output as print "Hello there!"
close hr />

работает - знаю. Есть другие способы? или он хоть и вижуал, но бейсик в натуре?

anton7805

работает и ладно , а чем тебя не устравивает этот способ?

otets-mihail

Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, 
ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
Call ReadFile(hDevice, abBuff(0 UBound(abBuff) + 1, nRead, 0&)

ну и т д

anton7805

это 5 ,баллов! в VBA использовать winAPI - это конечно по -аццовски

nawok

А что делать если очень хочеца?....

FRider

Удобно пользоваться ActiveX для vbscripta Для этоно надо подключить Microsoft Scripting Runtime. Предоставляет объектную модель для работы с фс. в т.ч. и потоковый ввод-вывод.
См. мсдн FileSystemObject, например, это основной объект работы с файловой системой.

Flack_bfsp

VBScript связан с VBA примерно также, как Java с JavaScript.

Helga87

VBScript связан с VBA примерно также, как Java с JavaScript.
Вы совершенно правы, коллега. С лексической точки зрения.

FRider

Ты это написал чтобы вставить свои 5 копеек? Прежде чем писать, надо подумать, знаешь ли ты тему, о которой собрался высказаться.
Для тебя специально поясню: одна из областей применения VScript - это Windows Script Host.
Что это такое прочти сам. В данном случае интересно, что в нем можно использовать любой зарегистрированный в системе ActiveX dll. Для удобства работы с файлами в VBScript из WSH(или ASP) есть поставляемый с ОС ActiveX, естественно, его можно задействовать и из Visual Basic и из VBA, да хоть из С++(если тебе это поможет).

Flack_bfsp

Какие мы умные! Вот теперь объясни мне, почему в ответе на вопрос про VBA встретилось слово VBScript? Логично было предположить, что ты что-то путаешь, вот я тебя и поправил. А ты сразу огрызаться.

Helga87

Какие мы умные! Вот теперь объясни мне, почему в ответе на вопрос про VBA встретилось слово VBScript? Логично было предположить, что ты что-то путаешь, вот я тебя и поправил. А ты сразу огрызаться.
Он ничего не путает. Ответ корректен, поскольку с точки зрения использования ActiveX пофигу где ты находишься - внутри VBA в Office/Corel и пр. или VBScript-а в WSH. Кроме своей корректности, пост заключает в себе ответ на вопрос, заданный автором треда.
Твой же пост в резкой форме утверждал, что сообщение в корне неверно.

bobby

Погоди, он не утверждал, что не прав, он всего лишь заметил, что VBA и VBScript - разные вещи.
Хотя, конечно, оффтопик стоило поставить.

yolki

Поставим вопрос с другого бока.
Какие есть механизмы файлового ввода-вывода в VBA, который в офисе?

bobby

Насколько я понял (не зная ни VBA, ни VBScript'а можно подключить некоторый ActiveX

yolki

ага. и где описалово на эти функции? в МСДНе?

Helga87

Какие есть механизмы файлового ввода-вывода в VBA, который в офисе?
Какие-то может и есть, но они скорее всего сильно привязаны к офису. Что делать, если придется в Corel что-то писать? привел решение, которое работает везде.
На этом вопрос треда был исчерпан.

FRider

Да в мсдн. Вообще-то я написал:
См. мсдн FileSystemObject, например, это основной объект работы с файловой системой.

Это стандартный компонент, считай что это часть стандартной библиотеки для VB\VBA\VBScript

yolki

Мой способ работает на всех версиях офиса.
в кореле тоже есть VBA? хм. думаю и там заведётся.
переведи мой пример из первого поста на FileSystemObject-модель, пожалуйста.
Во всяком случае выглядит громоздее:

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Dim fso, f, ts
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile "test1.txt" ' Create a file.
Set f = fso.GetFile("test1.txt")
Set ts = f.OpenAsTextStream(ForWriting, TristateUseDefault)
ts.Write "Hello World"
ts.Close

Этож песдец.

FRider

1.
Const ForReading = 1, ForWriting = 2, ForAppending = 8 Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
- это лишнее, при подключении ActiveX в VBA\VB, константы у тебя будут определены автоматически.
2. Зачем там лишние действия с созданием файла, проще вот как:

Dim fso As New FileSystemObject
Dim fs As TextStream
Set fs = fso.OpenTextFile("t.t", ForWriting, True)
fs.WriteLine "Hello world"
fs.Close

А вообще-то ты спросил
Есть другие способы
. Я тебе сказал один из способов, что не так то?
С субъективной(ессно моей) точки зрения, такой код существенно красивей чем стандартный басиковский. Но это имхо, для всех по разному...

yolki

В общем это первый случай, когда я увидел, что для того, чтобы вывести строку в файл потребовалось аж две переменных.

Helga87

Месье никогда не видел Java и .NET?

bobby

Одна неявная переменная и у тебя есть, это

bobby

1-2 переменные - один порядок

yolki

Видел только мельком.
по до-диез даже курсором не ходил
to :
неявная - да. это логично, если религия хоть как-то позволяет с несколькими файлами работать..

kamputer

>В общем это первый случай, когда я увидел, что для того, чтобы вывести строку в файл потребовалось аж две переменных.
Вопрос на засыпку: сколько потебуется переменных, чтобы работать с двумя файлами? с N файлами?

FRider

У благородного дона комплекс страха введения переменых?
Сорри за резкость, но.. в данном случае такое кол-во переменных не принципиально, кроме как с какой-либо субъективной точки зрения.
А вот писать так: "open "filte.txt" for output as #2" - дурной тон, ибо 2 могло быть использованно раньше для какого - либо файла. (Отмазки типа: "Да я помню, что где юзал" не катят.)
Правильно вот как:

Dim fnum
fnum = FreeFile
open "filte.txt" for output as fnum
'Работа с файлом
Close fnum

Это рекомендуется в любой вменяемой книжке по VB, не я придумал.
Оставить комментарий
Имя или ник:
Комментарий: