Как из vba открыть блокнот
Перейти к содержимому

Как из vba открыть блокнот

  • автор:

Как из vba открыть блокнот

Наверно можно смело утверждать, что умение читать и записывать информацию в текстовый файл это основа импорта и экспорта 🙂 Практически любая серьезная программа хранящая информацию позволяет сохранить её в текстовом формате, какое бы он расширение не имел. Открываются файлы командой Open.

Sub Test() Open "c:\1.txt" For Input As #1 Close #1 End Sub

Команда Open может открывать для чтения Input и для записи Output. Цифра после as это идентификатор файла. На основании его производится чтение и запись файла.

Следующий пример демонстрирует запись и чтение файла

Sub Test() Open "c:\1.txt" For Output As #1 Print #1, "Hello File" Close #1 Open "c:\1.txt" For Input As #1 Dim s As String Input #1, s MsgBox s Close #1 End Sub

Как видите, для записи можно использовать Print, а для чтения Input воспользовавшись идентификатором открытого файла. Естественно здесь свои тонкости работы. Вот, если Вы запишите такую строку:

. Print #1, "Hello , File" .

То оператор Input #1 прочитает только Hello и все. Запятая воспринимается как разделитеть. И это правильно. Есть форматы текстовых файлов когда числа разделены запятой. В коде ниже:

. Input #1, s MsgBox s Input #1, s MsgBox s .

Последовательно выведутся надписи Hello и File, но с этим можно бороться оператором Line Input.

Sub Test() Open "c:\1.txt" For Output As #1 Print #1, "Hello , File" Close #1 Open "c:\1.txt" For Input As #1 Dim s As String Line Input #1, s MsgBox s Close #1 End Sub

Этот код прочитает строку целиком. Следом возникает важный вопрос, а как узнать конец файла ? Для этого есть функция EOF(идентификатор), которая позволяет вам определить конец файла.

Sub Test() Open "c:\1.txt" For Output As #1 Print #1, "Hello , File" Close #1 Open "c:\1.txt" For Input As #1 Dim s As String While Not EOF(1) Input #1, s MsgBox s Wend Close #1 End Sub

Открыть\закрыть текстовый файл

Author24 — интернет-сервис помощи студентам

Открыть файл, разделить ячейку на 1000, сохранить файл, закрыть файл
Макрос должен запускаться, спрашивать — какой файл ему взять. Открыть его, разделить определенную.

Открыть xls файл, найти значение, скопировать в другой файл, закрыть первую
Привет. Имеются file1.xls и file2.xls. Нужно написать макрос, которая сначала открывает.

Закрыть и затем открыть один и тот же файл
Доброго времени суток помогите пожалуйста в решении задачки следующего плана. Есть файл excel В.

Как открыть текстовый файл с пом функции CreateObject
Есть файл. Путь C:\Sample\Sample.txt. Хотелось бы открыть его с пом функции CreateObject в файле.

109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

1 2 3
rv = Shell("notepad.exe" & " " & Папка & File, vbMaximizedFocus) AppActivate rv SendKeys "%", True

а что значит Блокнот ++ ?
1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580
Блокнот ++ = notepad++
109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189
Ципихович Эндрю, а если вместо

"notepad.exe"

указать полный путь к приложению этому блокнот++?
1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580
я пробовал

Shell("C:\Program Files\Notepad++\notepad++.exe\" & Папка & File, vbMaximizedFocus)
Shell("C:\Program Files\Notepad++\notepad++.exe" & Папка & File, vbMaximizedFocus)

сообщает, что нет такого файла.
109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

Ципихович Эндрю, скачал этот блокнот ++, это в нём самом проблема, он не видит файлы если в пути к нему или имени есть пробелы, разместил текстовый файл без пробелов и он открыл.

1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580

ЦитатаСообщение от Aleksan7 Посмотреть сообщение

он не видит файлы если в пути к нему или имени есть пробелы

убрал, не открывает
кириллица не помеха?

Добавлено через 4 минуты

ЦитатаСообщение от Ципихович Эндрю Посмотреть сообщение

я имел ввиду в имени файла, а в пути к файлу: C:\Program Files конечно есть пробел, но я ведь указываю Shell(«notepad.exe»
странно почему не указываю с плюсами
Shell(«notepad++.exe» ведь они есть в наличии

109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189
Ципихович Эндрю,

1 2 3 4 5 6 7 8
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub sgsdfsdf() rv = Shell("C:\Users\Al\Desktop\Малая_автоматизация\блокнот\notepad++.exe" & " " & "C:\Users\Al\Desktop\Малая_автоматизация\Новый_текстовый_документ.txt", vbMaximizedFocus) Sleep 1000 AppActivate rv Sleep 1000 SendKeys "%", True End Sub

вот так у меня выглядит сейчас код, видимо кириллица нормально ему заходит,
открывает, ждёт, закрывает

Добавлено через 8 минут

rv = Shell("C:\Users\Al\Desktop\тест пробела блокнот\блокнот\notepad++.exe" & " " & "C:\Users\Al\Desktop\Новый_текстовый_документ.txt", vbMaximizedFocus)

вот так тоже работает, значит дело только в пробелах в пути к текстовому файлу.

Debug.Print Папка & File

Добавлено через 5 минут
Ципихович Эндрю, ошбика File not found или в самом болокноте ошибка текстовый файл не найден?

1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580

1 2 3 4 5
Dim ProcID As Long Debug.Print Папка & File 'C:\РазметкаУКРФ.txt ProcID = Shell("notepad.exe" & " " & Папка & File, vbMaximizedFocus) AppActivate ProcID SendKeys "%", True

всё также открывает в обычном блокноте
109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

Ципихович Эндрю, я его победил, надо кавычек напихать, у меня теперь все файлы открывает, даже с пробелами

1 2 3 4 5
Dim ProcID As Long Debug.Print Папка & File 'C:\РазметкаУКРФ.txt ProcID = Shell("C:\Program Files\Notepad++\notepad++.exe" & " " & """" & Папка & File & """" , vbMaximizedFocus) AppActivate ProcID SendKeys "%", True

попробуйте так, и напишите текст ошибки если будет
1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580
на строке AppActivate ProcID
Invalid procedure call or argument
109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189
Ципихович Эндрю, файл успешно открылся в блокноте++?
что в окне Locals ? у меня вот так:
1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580
оказывается ошибкой было, то что я пробовал с открытым нужным документом, тогда актуально

ЦитатаСообщение от Ципихович Эндрю Посмотреть сообщение

как закрыть текстовый файл, как будто я это сделал физически
то есть в открытом Блокнотом++ нажал кнопку Закрыть?

109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189
Ципихович Эндрю, так вот же мы

SendKeys "%", True

ему отправляем, и он закрывается
1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580

ЦитатаСообщение от Aleksan7 Посмотреть сообщение

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

Open (Папка & File) For Input As #1

изменяю
записываю

Open (Папка & File) For Output As 2

просто неохота получать сообщение
This file has been modifiend by anuther programm. Do you want to reload it?
Этот файл был изменен другой программой. Вы хотите перезагрузить его?

109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

Ципихович Эндрю, так может вы приложите весь код макроса?
а то изначально условия задания были другие, и для них решение найдено. у меня файл открывается в нужной программе и закрывается.
Вроде опытный пользователь форума.

Добавлено через 15 минут
перед закрытием файла тогда нужно сохранить его

SendKeys "^S" 'сохранение в блокнот++

1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580

ЦитатаСообщение от Aleksan7 Посмотреть сообщение

перед закрытием файла тогда нужно сохранить его

правильно добавил, не работает, код:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Const Папка As String = "C:\" Const File As String = "Разметка УК РФ.txt" Function Переставить() Dim ProcID As Long Debug.Print Папка & File 'C:\Разметка УК РФ.txt ProcID = Shell("notepad.exe" & " " & Папка & File, vbMaximizedFocus) AppActivate ProcID SendKeys "%", True Set Коллекция = New Collection 'Debug.Print Папка & File Open (Папка & File) For Input As #1 Do Until EOF(1) Line Input #1, Текст_строки_файла Коллекция.Add Item:=LCase(Текст_строки_файла) Loop Close #1 Open (Папка & File) For Output As 2 For q = 1 To Коллекция.Count 'Debug.Print q & " - " & Коллекция.Item(q) Print #2, Коллекция.Item(q) Next q 'сохранение в notepad++ SendKeys "^S" Close #2 MsgBox$ "П" End Function

109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

Ципихович Эндрю, а что он должен делать?

в строках с 8 по 10 вы открываете файл в блокноте и ту же его закрываете, зачем?

в строке 28 посылаете комбинацию Ctrl+S только не понятно кому. судя по всему экселю, так как он будет активным приложением в этот момент(мне так кажется)

в строках с 12 по 26 вы открываете файл, читаете его, и это же самое записываете в него. в чём суть?

как ни странно у меня ваш макрос работает нормально, только не понятно для чего он нужен, открываем, не изменяя закрываем, читаем и записываем одно и тоже. какой нужен результат.

макрос работает но приходит к тому с чего начал, так как это и написано в коде

1551 / 513 / 65
Регистрация: 10.04.2009
Сообщений: 8,580

ЦитатаСообщение от Aleksan7 Посмотреть сообщение

а что он должен делать?
в текстовом файле перевести всё к нижнему регистру

LCase(Текст_строки_файла)

просто он у меня всегда открыт.
109 / 60 / 27
Регистрация: 22.02.2018
Сообщений: 189

Лучший ответ

Сообщение было отмечено Ципихович Эндрю как решение

Решение

Ципихович Эндрю, сори, Lcase не увидел.
файл должен быть открыт в блокноте++, проверял на версии 7.8.2
если окно блокнота имеет другое название, подгоните его в строке 17, для активации нужного окна
если файлы большие то возможно потребуется задержка между сендкеями, включите библиотеку как в посте номер 8 и добавляете Sleep с милисикундами

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Function Переставить() Debug.Print Папка & File 'C:\Разметка УК РФ.txt Set Коллекция = New Collection 'Debug.Print Папка & File Open (Папка & File) For Input As #1 Do Until EOF(1) Line Input #1, Текст_строки_файла Коллекция.Add Item:=LCase(Текст_строки_файла) Loop Close #1 Open (Папка & File) For Output As 2 For q = 1 To Коллекция.Count 'Debug.Print q & " - " & Коллекция.Item(q) Print #2, Коллекция.Item(q) Next q Close #2 AppActivate "" & Папка & File & " - Notepad++" 'активируем блокнот в котором открыт наш файл(блокнот++) SendKeys "^R" 'отправляем запрос на обновление файла, так как были изменения в сторонней программе SendKeys "~" 'отправляем согласие на обновление 'MsgBox$ "П" End Function

Как прочитать текстовый файл в VBA

В нынешнее время использование текстовых файлов для обмена данными или хранения данных становится редкостью, но тем не менее, все еще встречается. Приведу два варианта чтения текстового файла из VBA. Каждый способ может быть полезен в своей ситуации.

Способ 1. Открытие (чтение) текстового файла целиком

Можно открыть текстовый файл без учета каких-либо разделителей, сплошным текстом:

Set objExcel = New Excel.Application Set wb = objExcel.Workbooks.Open("имя_файла")

либо, если используются разделители колонок, можно их задействовать:

Открытие текстового файла с разделителем Tab:

Set objExcel = New Excel.Application Set wb = objExcel.Workbooks wb.OpenText Filename:="имя_файла", DataType:=xlDelimited, Tab:=True

Открытие текстового файла с разделителем ; (точка с запятой):

Set objExcel = New Excel.Application Set wb = objExcel.Workbooks wb.OpenText Filename:="имя_файла", DataType:=xlDelimited, Other:=True, OtherChar:=";"

В параметрах можно так же добавить Origin:=xlMSDOS , если текстовый файл в DOS-кодировке.

После открытия файла, его можно пройти как обычные ячейки Excel-кого листа.

Способ 2. Чтение текстового файла построчно

Здесь используется классический вариант чтения как в большинстве языков программирования: открытие файла, цикл чтения построчно, закрытие файла.

f = FreeFile Open "имя_файла" For Input As #f Do While Not EOF(f) Line Input #f, s ' что-нибудь делаем с полученной строкой s Loop Close f

В первой строке определяем число, представляющее следующий номер файла, доступный для использования оператором Open. Затем открываем файл, после чего делаем цикл в котором происходит построчное чтение.

Как из vba открыть блокнот

Извините, но Ваш поиск не дал результатов, если есть такая тема прошу перенаправить меня!
Вот в чем дело.
Мне нужно открыть 1.txt написать там по координатам (2, 7) (2-ая строка, 7 символ ) символ «С», сохранить, закрыть 1.txt. Затем открыть 1.txt, присвоить переменной simbol значение символа по координатам (2,7) в 1.txt!
Да, скажу что 1.txt находится в папке folder.Здесь же и лежит файл 1.xlsm с исполняющим макросом.
Как же это реализовать с помощью VBA? .
Пожалуйста, помогите.

Изменено: usersuperpupsik — 05.11.2013 11:53:09
Пользователь
Сообщений: 14778 Регистрация: 15.09.2012
Профессиональная разработка приложений для MS Office
05.11.2013 13:18:11

А что уже сделали? На чем застряли?
Здесь есть небольшой пример работы с текстовыми файлами: Файловые функции VBA
в этом направлении копайте.
Самое простое считать файл и в нужном месте добавить символ, а затем пересохранить файл.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы.

Пользователь
Сообщений: 23779 Регистрация: 22.12.2012
05.11.2013 13:31:52

Вообще-то конечно в задании не раскрыта вся информация — есть ли уже этот файл, есть ли там минимум 2 строки, есть ли во второй строке минимум 7 символов.
Может его такой нужно с нуля сгенерить — пустой с одним символом?
Поэтому примера кода думаю не будет — писать подстраховываясь от всего и всюду всем лениво

А так да, принцип такой — открыть существующий файл, читать его, писать в другой, затем первый убить, второй переименовать.
Или прочитать сразу весь в массив, в массив внести изменения, перезаписать весь файл изменённой информацией из массива.

Пользователь
Сообщений: 83 Регистрация: 18.03.2013
05.11.2013 14:39:51

The_Prist, спасибо за ссылку.
Не могу понять как сделать это. Например в файле 1.txt написано:

Как теперь сделать так типа есть функция MyFunc(): берёт позицию символа, возвращает сам символ.
Таким образом если я скажу s=MyFunc(5), то s:3 (s будет равен 3)

Цитата
Или прочитать сразу весь в массив, в массив внести изменения, перезаписать весь файл изменённой информацией из массива.

Если я правильно понял, то после выполнения вот этого

Public Sub Sub1() Dim textik Open "E:\Text1.txt" For Input As #1 Do While Not EOF(1) textik = textik + Input(1, #1) Loop Close #1 [a1] = textik End Sub

Надо сделать split:

Dim textik As String ReDim MyArray(1 To len(textik)) MyArray = Split(textik, "")

Затем изменить массив и записать его в 1.txt. Но как же это сделать(как записать массив в 1.txt)?

Пользователь
Сообщений: 23779 Регистрация: 22.12.2012
05.11.2013 14:46:57

Не, тогда проще так:

Set ts1 = CreateObject("Scripting.FileSystemObject").OpenTextFile(myPath1, 1) arr1str = Split(ts1.ReadAll, vbCrLf) 'массив строк текста целиком ts1.Close

Далее лезем в массив, меняем символ, затем ищем код как этот массив записать назад в файл

Пользователь
Сообщений: 83 Регистрация: 18.03.2013
08.11.2013 19:08:42

Чтобы изменить 1.txt с помощью языка vba и файла 1.xlsm нужно:

'0. создать 1.txt в адресе D:\ и создать файл 1.xlsm в адресе D:\ '1. копировать все строки из файла 1.txt в массив: Public Array1 Public Sub Sub1 Set Adress1 = CreateObject("Scripting.FileSystemObject" ;) .OpenTextFile("D:\1.txt", 1) Array1 = Split(Adress1.ReadAll, vbCrLf) 'массив строк Adress1.Close End Sub '2. изменить нужную строку,например 2-ую (изменить 2-ой элемент массива): Public Sub Sub2 Array1(1)="222200000222222" End Sub '3. Скопировать массив в файл 1.txt: Public Sub Sub3() ' удалить всё в файле 1.txt и копировать массив в файл 1.txt ni = 0 Open "D:\1.txt" For Output As #1 U = (UBound(Array1) + 1) For ci = 1 To U Print #1, Array1(ni) ni = ni + 1 Next ci Close #1 End Sub

Изменено: usersuperpupsik — 08.11.2013 21:57:30
Пользователь
Сообщений: 23779 Регистрация: 22.12.2012
08.11.2013 19:31:14

Примерно так, возможны правда модификации, и писал бы на выход я средствами FSO, но есть одно важное замечание —
«создать файл 1.xlsm» совершенно не нужно.
Код может быть где угодно — в Экселе, Ворде, Поверпойнте вероятно тоже — и такой файл может вообще быть нигде не сохранён.
Вот если в vbs — тогда его точно где-то нужно сперва сохранить

Пользователь
Сообщений: 83 Регистрация: 18.03.2013
08.11.2013 19:39:44

Ура.
Спасибо The_Prist за помощь.
Спасибо Hugo за необычную идею типа:
1. прочитать сразу файл .txt в массив
2. изменить массив
3. копировать измененный массив в файл .txt

Пользователь
Сообщений: 83 Регистрация: 18.03.2013
08.11.2013 20:07:28
Ребят, а как сказать, открывай файл .txt в той же папке что и 1.xlsm (где и прописан код).
Изменено: usersuperpupsik — 08.11.2013 20:11:56
Сообщений: 60996 Регистрация: 14.09.2012
Контакты см. в профиле
08.11.2013 21:36:00
ThisWorkbook.Path — путь к той папке, где живёт книга, из которой запущен макрос.
Пользователь
Сообщений: 83 Регистрация: 18.03.2013
08.11.2013 22:08:16
Извините, Юрий М, я правильно понял?

Open "ThisWorkbook.Path\1.txt" For Output As #1
Set Adress1 = CreateObject("Scripting.FileSystemObject").OpenTextFile("ThisWorkbook.Path\1.txt", 1)

Видимо, неправильно, т.к. получил ошибку (Path not found). А как же правильно использовать команду ThisWorkbook.Path?

Сообщений: 60996 Регистрация: 14.09.2012
Контакты см. в профиле
08.11.2013 22:17:37
Попробуйте так:

Open ThisWorkbook.Path & "\" & "1.txt"

Пользователь
Сообщений: 83 Регистрация: 18.03.2013
08.11.2013 22:42:05

Спасибо, Юрий М, Вы здорово помогли.
Теперь код более красивый.Вот проверенная версия.

Public Table1 Public Function ReadFile() 'копировать 1.txt в массив Set Adress1 = CreateObject("Scripting.FileSystemObject" ).OpenTextFile(ThisWorkbook.Path & "\" & "1.txt", 1) '. Table1 = Split(Adress1.ReadAll, vbCrLf) Adress1.Close 'ReadFile = Table1 End Function Public Function ReadString(yo) As String 'копировать конкретную строку Open ThisWorkbook.Path & "\" & "1.txt" For Input As #1 '. While EOF(1) <> True yi = yi + 1 Line Input #1, A If yi = yo Then yo = A GoTo exit1 End If Wend exit1: Close #1 ReadString = yo End Function Public Function WriteFile() ' удалить всё в 1.txt и копировать в 1.txt массив ni = 0 Open ThisWorkbook.Path & "\" & "1.txt" For Output As #1 U = (UBound(Table1) + 1) For ci = 1 To U Print #1, Table1(ni) ni = ni + 1 Next ci Close #1 End Function Public Sub Experiment() ReadFile [a1] = Table1(3) Table1(3) = "44400004444444" [b1] = Table1(3) WriteFile [c1] = ReadString(4) End Sub

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *