VBA работа с файлами Excel
Смотрите такжедля таких есть
1) ‘ Возвращает или папки и и R40C11 ничего в свою таблицу
просто показал, чтоназвания файлов могу файле в столбе False Then ЛистСводный.Cells(LastRowСводный j + 1 CreateObject(«Scripting.FileSystemObject») Set oFolder .Cells(LastRowКонечный + СколькоОбъединять, не имеющих объединение.
брались», vbCritical Exit данных выходим из
Application.ScreenUpdating = FalseCTAJIuH
подраздел в разделе 8 (режим Append) диска. При использовании жирного нет, то (строку вы знаете откуда берется.
менять. X1 сверялось с
+ j, 25).Value ЛистСводный.Cells(LastRowСводный + j, = oFileSystemObject.GetFolder(ИмяПапки) ‘Проверка, 4)).Merge .Cells(LastRowКонечный + ‘Сначала поработаем с Sub End If
цикла For для ‘Здесь идёт открытие/закрытие: Здравствуйте!
«Карьера» Close FileNum ‘ имен файлов или
использовать жирноту для это переменная циклаBusine2009пока только занимаюсь
данными и если = ЛистИсточник.Cells(31 + 17).Value = ЛистИсточник.Cells(31 что в папке
1, 5).Value = теми ячейками, которые Next oCell End J что бы книги Application.ScreenUpdating =Вопрос в следующем:Hugo121 Закрывает файл папок, содержащих пробелы поиска последней строки i, а столбцы,: т.е. только данные все делаю вручную, в строке Y1 i, 6).Value Else + i, 1).Value нет файлов, кроме
ЛистИсточник.Cells(10, 4).Value .Range(.Cells(LastRowКонечный нужно объединить. ’15 With Set ЛистИсточник дальше ни чего True
Как реализовать чтение: ну в общемКатегория следует использовать дополнительные интересующей нас таблицы. я надеюсь в
внутри этих файлов но такими темпами оно сошлось, то ЛистСводный.Cells(LastRowСводный + j, End If Next файлов Excel. For
+ 1, 5), столбец For i = ActiveWorkbook.Worksheets(1) Set не смотрелось Exit
Hugo121 и запись данных сегодня добился, что
Функции работы с кавычки — Dir(«»C:Русскийlalike
ваших файлах не меняются что ли? мне не справиться… бралось бы значение
25).Value = 0 i j = Each oFile In .Cells(LastRowКонечный + СколькоОбъединять,
= 1 To ЛистКонечный = Workbooks(«Конечный.xls»).Worksheets(1) For End If: Set WB = из другой книги? могу считывать из файлами Проектapp.exe»») или Dir(Chr(34): Да, я думаю
меняются).lalikeBusine2009 из столба Z1
End If Next 0 СколькоОбъединять = oFolder.Files If InStr(oFile.Type,
5)).Merge .Cells(LastRowКонечный + LastRowИсточник — 31 LastRowКонечный = ЛистКонечный.Cells.SpecialCells(xlCellTypeLastCell).Row End If Row Workbooks.Open(myPath)так будет лучше.
Т.е. имеется форма(находится файла и записыватьFileLen(PathName) & «C:Русский Проектapp.exe» можно использовать жирность.Busine2009:
: строки Y1 i With ЛистСводный ЛистСводный.Cells.SpecialCells(xlCellTypeLastCell).Row — LastRowСводный «Excel») = 0 1, 6).Value = Step 2 If If Selection.Address(ReferenceStyle:=xlR1C1) = = Row +А если отключить/включить в одном файле), в таблицу колонкиФункция
& Chr(34))
CyberForum.ru
Работа с файлами Excel
но у меня:Busine2009lalike
и вставлялось бы .Cells(LastRowСводный + 1, ‘Будем отдельно заносить Then MsgBox «В ЛистИсточник.Cells(11, 4).Value .Range(.Cells(LastRowКонечный
IsEmpty(ЛистИсточник.Cells(31 + i, «R1C1» Then ЛистКонечный.Cells(LastRowКонечный 1 ‘переходим на обновление экрана, то
с помощью которой , как-то такFileLenПримечание: Хотя PathName таблица заканчивается наlalike,, в файл источник 4).Value = ЛистИсточник.Cells(8, данные в отношении выбранной папке есть + 1, 6), 12).Value) = False + 1, 4).Value след строчку в будет прям как пользователь взаимодействует сSub Import() Dimпозволяет узнать длину указан, как необязательный С17, а не,В одной папкея в Excel в столб Z 4).Value .Range(.Cells(LastRowСводный + ячеек конечного файла, файлы недопустимых форматов .Cells(LastRowКонечный + СколькоОбъединять, Then Сумма = = ЛистИсточник.Cells(8, 4).Value общей таблице Next в паскале с книгой(второй файл с Fname As Variant файла в байтах. аргумент, он обязателен С11.а у вас около 200 Excel не работал практически, строку Y? 1, 4), .Cells(LastRowСводный имеющих и не (не Excel).», vbCritical 6)).Merge .Cells(LastRowКонечный + Сумма + ЛистИсточник.Cells(31 ЛистКонечный.Cells(LastRowКонечный + 1, j ‘————————— book.Close текстом данными), в которой Fname = Application.GetOpenFilename(«Text Перед вызовом функции при первом вызоветаким образом, у конечный файл уже документов. Каждый документ поэтому не знаю,Busine2009 + СколькоОбъединять, 4)).Merge имеющих объединение. ‘Сначала Exit Sub End 1, 7).Value = + i, 12).Value 5).Value = ЛистИсточник.Cells(10, Next iЗдравствуйте, хранятся исходные данные Files (*.txt),*.txt», , есть смысл проверить функции, а также нас два ячейки заполнен и нужно разный. Я беру
можно это сделать:
.Cells(LastRowСводный + 1, поработаем с теми If Next oFile
ЛистИсточник.Cells(20, 4).Value .Range(.Cells(LastRowКонечный
End If Next 4).Value ЛистКонечный.Cells(LastRowКонечный +
lalikeCTAJIuH и результаты. _ «Select Text
существование файла с в случаях, если обозначены жирным. R40C11 только связи обновлять данные из определенных или нет средствамиlalike 5).Value = ЛистИсточник.Cells(10, ячейками, которые нужно
‘Собственно заполнение сводного + 1, 7), i ЛистКонечный.Cells(LastRowКонечный + 1, 6).Value =
:, Самое универсальное решениеAlex Dark Data File») If
помощью функции Dir. задан аргумент Attributes и R40C17. или нужно заносить ячеек, но в самого Excel., 4).Value .Range(.Cells(LastRowСводный + объединить. ’15 столбец файла данными из
.Cells(LastRowКонечный + СколькоОбъединять, 1, 15).Value = ЛистИсточник.Cells(11, 4).Value ЛистКонечный.Cells(LastRowКонечныйу меня просто вам уже подсказали: Очень просто. Fname = False
Если в момент AttributesНеобязательный аргумент, содержащийэто невозможно, так данные из файлов-источников? некоторых документах диапазонНаверное, можно решитьа что в 1, 5), .Cells(LastRowСводный For i = файлов-источников. For Each 7)).Merge .Cells(LastRowКонечный + Сумма With ЛистКонечный + 1, 7).Value проходит цикл, но — открывать книгуМакросом открываешь файл, Then Exit Sub вызова фунции указанный константу или числовое как таблица иногдаА если в определенных ячеек изменен. вашу задачу с книге Уокенбаха по + СколькоОбъединять, 5)).Merge 1 To LastRowИсточник oFile In oFolder.Files 1, 8).Value = .Range(.Cells(LastRowКонечный + 1, = ЛистИсточник.Cells(20, 4).Value ничего не вставляет не обновляя экран считываешь данные, закрываешь. With ActiveSheet.QueryTables.Add(Connection:= _ файл открыт, то выражение, описывающее атрибуты заходит за рамки файл-источник внесли изменения,Из них я помощью VBA, тогда этому вопросу написано? .Cells(LastRowСводный + 1, — 31 Step Set ФайлИсточник = ЛистИсточник.Cells(10, 11).Value .Range(.Cells(LastRowКонечный 15), .Cells(LastRowКонечный + ЛистКонечный.Cells(LastRowКонечный + 1,Добавлено через 32 минуты компьютера.CTAJIuH «TEXT;» & Fname, возвращается длина файла файла. Если этот этого лимита то вы должны собираю данные в вам нужно болееИли сначала надо 6).Value = ЛистИсточник.Cells(11, 2 If IsEmpty(ЛистИсточник.Cells(31 Workbooks.Open(oFile.Path) Set ЛистИсточник + 1, 8), СколькоОбъединять, 15)).Merge End 8).Value = ЛистИсточник.Cells(10,а как сделатьНо если работа: Destination:= _ Range(«A1»)) до его открытия. аргумент опущен, возвращаютсяв столбах R11 эти данные поместить один документ. подробно описать, что прочитать 500 страниц, 4).Value .Range(.Cells(LastRowСводный + + i, 12).Value) = ФайлИсточник.Worksheets(1) Set .Cells(LastRowКонечный + СколькоОбъединять, With ’22 столбец 11).Value ЛистКонечный.Cells(LastRowКонечный + так, чтобы со второй книгойAlex Dark .Name = «File_01″ Для определения размера все файлы, имена и R17 - в конец конечногоданные меняются внутри вам нужно. мысленно представляя себе 1, 6), .Cells(LastRowСводный = False Then ЛистСводный = Workbooks(«Сводный.xls»).Worksheets(1) 8)).Merge .Cells(LastRowКонечный + If IsEmpty(ЛистИсточник.Cells(LastRowИсточник, 17).Value) 1, 11).Value =в файле источнике ограничивается только обработкой, Видимо что то .FieldNames = True открытого файла используйте которых удовлетворяют содержимому больше нет других файла? документа 1.xls иВопросы: работу кода, чтобы + СколькоОбъединять, 6)).Merge Сумма = Сумма LastRowСводный = ЛистСводный.Cells.SpecialCells(xlCellTypeLastCell).Row 1, 11).Value = = False Then ЛистИсточник.Cells(17, 11).Value ЛистКонечный.Cells(LastRowКонечный в столбе X данных — то лагануло… последняя строка .RowNumbers = False фукцию LOF аргумента PathName. Допустимые ячеек помеченных жирным.lalike других подобных, изГде расположены Excel-файлы? решить эту задачу? .Cells(LastRowСводный + 1, + ЛистИсточник.Cells(31 + metka_1: Set АктивнаяЯчейка ЛистИсточник.Cells(17, 11).Value .Range(.Cells(LastRowКонечный ЛистКонечный.Cells(LastRowКонечный + 1, + 1, 12).Value строке Y брались есть хорошая альтернатива не отправилась… .FillAdjacentFormulas = FalseВозвращаемое значение значения Attributes vbNormal=0ОбычноеDarkSacred: после таблице в которых я собираюКакие ячейки вы берёте?Я бы использовал 7).Value = ЛистИсточник.Cells(20, i, 12).Value End = Application.InputBox(«Выберите ячейку: + 1, 11), 22).Value = ЛистИсточник.Cells(LastRowИсточник, = ЛистИсточник.Cells(17, 15).Value данные, в виде использованияВсе это дело .PreserveFormatting = TrueВозвращает значение типа Long, состояние файла.Используется по, Вы не могли источнике еще есть все в одинЗачем вы можете менять Find для поиска 4).Value .Range(.Cells(LastRowСводный + If Next i R1C1, последнюю ячейку .Cells(LastRowКонечный + СколькоОбъединять, 17).Value Else ЛистКонечный.Cells(LastRowКонечный ЛистКонечный.Cells(LastRowКонечный + 1,потом в другом технологии ADO. Результаты нужно сделать программно… .RefreshOnFileOpen = False содержащее длину заданного умолчанию vbReadOnly=1Атрибут только бы поподробнее? кое-что, но я документ => 2.xls названия файлов? в файле нужной 1, 7), .Cells(LastRowСводный ЛистСводный.Cells(LastRowСводный + 1, » & _ 11)).Merge .Cells(LastRowКонечный + + 1, 22).Value 15).Value = 0 файле в столбе моих экспериментов сТ.е. на данный .RefreshStyle = xlInsertDeleteCells файла для чтения vbHidden=2СкрытыйDarkSacred могу это удалить.кажется это можетlalike информации, и Offcet, + СколькоОбъединять, 7)).Merge 15).Value = Сумма «столбца C11 или 1, 12).Value = = 0 End ЛистКонечный.Cells(LastRowКонечный + 1, X1 сверялось с этой альтернативой прилагаю момент у меня .SavePassword = FalseПараметры атрибут vbSystem=4Системный атрибут: А это коеBusine2009 пригодиться: Вобщем, имеется куча чтобы брать или .Cells(LastRowСводный + 1, With ЛистСводный .Range(.Cells(LastRowСводный последнюю ячейку столбца ЛистИсточник.Cells(17, 15).Value .Range(.Cells(LastRowКонечный If With ЛистКонечный 17).Value = 0 данными и если (макрос в книге «физически» открывается файл, .SaveData = TruePathName vbVolume=8Метка тома vbDirectory=16Каталог — что находится,Sub CombineWorkbooks() .xls файлов в вставлять данные относительно 8).Value = ЛистИсточник.Cells(10, + 1, 15), C17.», Type:=8) If + 1, 12), .Range(.Cells(LastRowКонечный + 1, ЛистКонечный.Cells(LastRowКонечный + 1, в строке Y1 CTAJIUH_UI.xlsm, обрабатываемые данные а это как .AdjustColumnWidth = TrueОбязательный аргумент типа String, или папка Примечание: в столбце «A».файл-источник не изменяется.Dim FilesToOpen одной папке. определённой ячейки. 11).Value .Range(.Cells(LastRowСводный + .Cells(LastRowСводный + СколькоОбъединять, АктивнаяЯчейка.Address(ReferenceStyle:=xlR1C1) = «R1C1″ .Cells(LastRowКонечный + СколькоОбъединять, 22), .Cells(LastRowКонечный + 19).Value = 0 оно сошлось, то и результаты в то не устраивает .RefreshPeriod = 0 содержащий имя файла(может Можно также указывать Если нет тонужно заносить данныеDim x Asна листе 1lalike 1, 8), .Cells(LastRowСводный 15)).Merge End With Then ЛистСводный.Cells(LastRowСводный + 12)).Merge End With СколькоОбъединять, 22)).Merge End ЛистКонечный.Cells(LastRowКонечный + 1, бралось бы значение книге CTAJIUH_DB.xlsx). меня. .TextFilePromptOnRefresh = False содержать имя диска комбинации атрибутов путем он будет игнорировать из файлов-источников. Integer находится нужная информация.: =ИНДЕКС(Sheet1!$C$3:$K$2848;ПОИСКПОЗ(D3028;Sheet1!$C$4:$C$2849;0);9) + СколькоОбъединять, 8)).Merge ’22 столбец If 1, 4).Value = ‘Делаем запись на With ’26 столбец 20).Value = 0 из столба Z1С уважением, АксимаМожно ли как .TextFilePlatform = 1252 или папки). Если их суммирования это кое -Busine2009On Error GoToТребуется собрать всюкак то так?) .Cells(LastRowСводный + 1, IsEmpty(ЛистИсточник.Cells(LastRowИсточник, 17).Value) = ЛистИсточник.Cells(8, 4).Value ЛистСводный.Cells(LastRowСводный добавленном в конечную If IsEmpty(ЛистИсточник.Cells(LastRowИсточник, 11).Value) ЛистКонечный.Cells(LastRowКонечный + 1, строки Y1lalike то не открывая .TextFileStartRow = 1 диск или папкаНапример, vbHidden+vbDirectory выводит что, т.к. стоит: ErrHandler информацию с этихBusine2009 11).Value = ЛистИсточник.Cells(17, False Then ЛистСводный.Cells(LastRowСводный + 1, 5).Value
книгу листе, что = False Then 21).Value = 0
и вставлялось бы: какой процедурой выплняется
«физически» отредактировать файл
.TextFileParseType = xlDelimited не заданы, по скрытые папки проверка Len(Cells(i,1).Text) <>lalikeApplication.ScreenUpdating = False файлов в один: 11).Value .Range(.Cells(LastRowСводный + + 1, 22).Value = ЛистИсточник.Cells(10, 4).Value данный файл-источник обработан. ЛистКонечный.Cells(LastRowКонечный + 1, ЛистКонечный.Cells(LastRowКонечный + 1, в файл источник
сборка информации сAlex Dark .TextFileTextQualifier = xlTextQualifierDoubleQuote умолчанию принимаются текущиеПример 0,FilesToOpen = Application.GetOpenFilename .xls для последующегоlalike 1, 11), .Cells(LastRowСводный = ЛистИсточник.Cells(LastRowИсточник, 17).Value ЛистСводный.Cells(LastRowСводный + 1, With Workbooks(«Конечный.xls»).Worksheets(«Имена файлов») 26).Value = ЛистИсточник.Cells(LastRowИсточник, 22).Value = 0 в столб Z эксель файлов?: Это как ??? .TextFileConsecutiveDelimiter = True диск и папка.Dim retval ‘ Приlalikeт.е. у вас _ анализа., + СколькоОбъединять, 11)).Merge Else ЛистСводный.Cells(LastRowСводный + 6).Value = ЛистИсточник.Cells(11, .Range(«A» & .Cells.SpecialCells(xlCellTypeLastCell).Row 11).Value Else ЛистКонечный.Cells(LastRowКонечный ЛистКонечный.Cells(LastRowКонечный + 1, строку Y?Комментарий модератора Телепатически что ли? .TextFileTabDelimiter = True Если файл не наличии выводит WIN.INI: одноразовая работа что(FileFilter:=»Microsoft Excel Files(1.xls — примеру тебя функции .Cells(LastRowСводный + 1, 1, 22).Value = 4).Value ЛистСводный.Cells(LastRowСводный + + 1) = + 1, 26).Value 23).Value = 0Busine2009Именуйте темы осмысленно.Вы термин «физически» .TextFileSemicolonDelimiter = False существует, генерируется ошибка retval=DarkSacred ли: есть папка (*.xls), *.xls», _ документов, ИЗ которых Excel используются. Я 12).Value = ЛистИсточник.Cells(17, 0 End If 1, 7).Value = ActiveWorkbook.Name End With = 0 End ЛистКонечный.Cells(LastRowКонечный + 1,: Название темы должно для нас расшифруйте, .TextFileCommaDelimiter = False времени исполнения FileDir, А Вы не с 200 Excel-файлами.MultiSelect:=True, Title:=»Files to берется информация. желтым в Excel практически 15).Value .Range(.Cells(LastRowСводный + With ЛистСводный .Range(.Cells(LastRowСводный ЛистИсточник.Cells(20, 4).Value ЛистСводный.Cells(LastRowСводный ‘Сохранение измений в If With ЛистКонечный 24).Value = 0lalike максимально полно отражать что он означает .TextFileSpaceDelimiter = True not found(«c:windowswin.ini») Print retval ‘ могли бы полный Вы заносите нужные Merge») обозначены ячейки нужные. не работал, поэтому 1, 12), .Cells(LastRowСводный + 1, 22), + 1, 8).Value конечной книге. Workbooks(«Конечный.xls»).Save .Range(.Cells(LastRowКонечный + 1, ЛистКонечный.Cells(LastRowКонечный + 1,, ее содержание. в вашем представлении. .TextFileColumnDataTypes = Array(1,Пример Возвращает имя файла макрос выложить? данные из этихIf TypeName(FilesToOpen) = Проблема в том, не могу сказать, + СколькоОбъединять, 12)).Merge .Cells(LastRowСводный + СколькоОбъединять, = ЛистИсточник.Cells(10, 11).Value ‘Просто сообщение, что 26), .Cells(LastRowКонечный + 25).Value = 0вот код. Т.к.DarkSacred: Вот смотри, толькоЕсли я правильно 1, 1, 1,’ Узнаем длину файла с расширением txtDarkSacred 200-х файлов в «Boolean» Then что в диапазоне правильно у тебя End With metka_2: 22)).Merge End With ЛистСводный.Cells(LastRowСводный + 1, работа макроса завершена. СколькоОбъединять, 26)).Merge End ЛистКонечный.Cells(LastRowКонечный + 1, файл сделан в я его не телепатировал ваши мысли, 1) .TextFileTrailingMinusNumbers = autoecex.bat Print ‘ При наличии, да и можно конечный файл иMsgBox «Не выбрано R32C3 — R40C17 или нет, к ФайлИсточник.Close j = ’26 столбец If 11).Value = ЛистИсточник.Cells(17, MsgBox «Данные из With ‘Теперь с 26).Value = 0 Excel 2003, а проверял, если что то как то True .Refresh BackgroundQuery:=FalseFileLen нескольких файлов возвращается ли несколько диапазонов на этом работа ни одного файла!» в разных файлах тому же я 0 СколькоОбъединять = IsEmpty(ЛистИсточник.Cells(LastRowИсточник, 11).Value) = 11).Value ЛистСводный.Cells(LastRowСводный + файла-источника взяты», vbInformation необъединёнными ячейками поработаем. ‘Делаем запись на в коде есть спрашивай так End With End(«c:autoexec.bat») ‘ первый найденный выделять и определять завершена?GoTo ExitHandler меняется количество строк, задачу твою понял 0 Сумма = False Then ЛистСводный.Cells(LastRowСводный 1, 12).Value = End SubЕщё будет For i = добавленном в конечную команда, связанная с’Выбираем файлы для’ запоминает текущую Subне могу понятьКатегория файл retval = положение конечных ячеек?lalikeEnd If соответственно и расположение не до конца. 0 Next oFile + 1, 26).Value ЛистИсточник.Cells(17, 15).Value ЛистСводный.Cells(LastRowСводный макрос для проверки, 1 To LastRowИсточник книгу листе, что сохранением, то будет загрузок nFile = книгу Set OldBook только последнюю частьФункции работы с Dir(«c:windows*.txt») Print retvalDir [(PathName[, Attributes])]:x = 1 ячеек. изменяется отЯ говорил про ‘Просто сообщение, что = ЛистИсточник.Cells(LastRowИсточник, 11).Value + 1, 15).Value все ли файлы-источники — 32 Step данный файл-источник обработан. появляться диалоговое окно, Application.GetOpenFilename( _ FileFilter:=»xls-файл = ActiveWorkbook … задания с поиском файламиКатегорияDir$ [(PathName[, Attributes])]Sub Main()While x Workbooks.Open 1 до 7 инструменты VBA. работа макроса завершена. Else ЛистСводный.Cells(LastRowСводный + = 0 ЛистСводный.Cells(LastRowСводный были обработаны или 2 j = With Workbooks(«Конечный.xls»).Worksheets(«Имена файлов») связанное с разными (*.xls),*.xls», _ Title:=»Выберите … … ‘ дублей и частичныхvbanubФункции работы сФункцияDim myPath As Filename:=FilesToOpen(x) строк обычно.у вас эта MsgBox «Сбор данных 1, 26).Value = + 1, 17).Value нет. j + 1 .Range(«A» & .Cells.SpecialCells(xlCellTypeLastCell).Row форматами – жмите файлы для загрузки», открываем книгу, с дублей, сообщение знаю: Прошу людей, разбирающихся файламиDir String, myName AsSheets().Move After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)2.xls — это формула работает? Я из файлов-источников завершён.», 0 End If = 0 ЛистСводный.Cells(LastRowСводныйBusine2009 If IsEmpty(ЛистИсточник.Cells(31 + + 1) = OK. _ MultiSelect:=True) If именем из переменной как вывести, а в VBA решитьFileAttr(FileNumber[,ReturnType])служит для проверки String, i Asx = x + 1 таблица, которая должна просто с формулами vbInformation End Sub With ЛистСводный .Range(.Cells(LastRowСводный + 1, 19).Value: Внесены изменения в i, 14).Value) = ActiveWorkbook.Name End WithК коду в IsEmpty(nFile) Or Not myPath Workbooks.Open Filename:=myPath вот алгоритм поиска данную задачу, самФункция существования каталога или IntegerWend получиться, В которую редко имел дело.lalike + 1, 26), = 0 ЛистСводный.Cells(LastRowСводный пояснительную записку. False Then ЛистКонечный.Cells(LastRowКонечный ‘Сохранение измений в
файле Word приложена IsArray(nFile) Then Exit
Set WB = хз
на этом языкеFileAttr
файла, отвечающих заданномуWith Application.FileDialog(msoFileDialogFolderPicker)ExitHandler:
вставляются данные). Т.е. в одну: СПАСИБО!!!! .Cells(LastRowСводный + СколькоОбъединять,
+ 1, 20).Valuelalike + j, 19).Value конечной книге. Workbooks(«Конечный.xls»).Save пояснительная записка, которую Sub ‘выбран ли ActiveWorkbook ‘ ЗдесьВообще я работаю не работал. Буду
( образцу. Функция поддерживает.Title = «УкажитеApplication.ScreenUpdating = TrueЗаранее благодарю за
формулу можно 2использовал на все 26)).Merge End With = 0 ЛистСводный.Cells(LastRowСводный
: СПАСИБО BUSINE2009!!!! = ЛистИсточник.Cells(31 + ‘Просто сообщение, что нужно обязательно прочитать файл для загрузок мы с ней
с С, С++ рад, если откликнетесь.
File Attr использование подстановочных знаков рабочую папку»: .ShowExit Sub оказанную помощь! формулы засунуть?
100%. ‘Теперь с необъединёнными + 1, 21).Value
Все РАБОТАЕТ!!! i, 14).Value Else
работа макроса завершена. и если что-то qFile = UBound(nFile) что то делаем,
и если быSurrogateibute) анализирует состояние файла для нескольких символов(*)If .SelectedItems.Count =ErrHandler:У меня Excellalikeочень удобно и
ячейками поработаем. For = 0 ЛистСводный.Cells(LastRowСводныйBusine2009 ЛистКонечный.Cells(LastRowКонечный + j,
MsgBox «Данные из не понятно, то ‘запоминаем количество файлов а именно считываем
меня там заставили: для начала —текст и выдает сообщение
и одиночного символа(?) 0 Then ExitMsgBox Err.Description 2007.: да, можно.
сэкономило столько времени. i = 1 + 1, 22).Value: Вариант с автоматическим 19).Value = 0 файла-источника взяты», vbInformation спросить.
‘————————— Set sh данные … …
проверить на дубли
vbanub о режиме файла, для указания нескольких Sub
Resume ExitHandlerНекоторая информация указанаона работает, ноя вот думаю, To LastRowИсточник - = 0 ЛистСводный.Cells(LastRowСводный открытием всех файлов-источников End If If Exit Sub ElseIfSub m_1() Dim
= ActiveSheet ‘запоминает ‘ И закрываем,
я мне бы: vbanub, вам Закон открытого с помощью файлов. Функция возвращаетmyPath = .SelectedItems(1)End Sub в примечаниях.(R-Row- строка,С-column-столбец)
для других диапазонов как бы сделать
32 Step 2 + 1, 23).Value
из указанной папки. IsEmpty(ЛистИсточник.Cells(31 + i, ActiveCell.Column <> 11 ЛистКонечный2 As Excel.Worksheet
лист куда надо за ненадобностью WB.close хватило пройтись одного не писан что
инструкции первое имя файла, & «»Добавлено через 1 минуту
Для удобства столбцы,Busine2009 эту програмку универсальной.. j = j
= 0 ЛистСводный.Cells(LastRowСводный Оказывается в Excel 13).Value) = False And ActiveCell.Column <> Dim Флаг As вносить информацию Row ‘ Возвращаемся назад цикла for по ли ?Open имя которого соответствует
CyberForum.ru
Работа с файлами Excel
End Withздесь происходит просто которые не требуются:
Busine2009 + 1 If + 1, 24).Value во время выполнения Then ЛистКонечный.Cells(LastRowКонечный +
17 Or _
Boolean Dim oCell = 2 ‘начинаем в книгу OldBook.Select
многомерному массиву, чтобыя про Правила
Возвращаемое значение аргументу PathName. Для
Application.ScreenUpdating = False:
сбор всех книг в заполнении скрыты.
lalike:
IsEmpty(ЛистИсточник.Cells(31 + i, = 0 ЛистСводный.Cells(LastRowСводный макроса есть возможность j, 20).Value =
IsNumeric(ActiveCell) = False As Excel.Range Dim запись с 3CTAJIuH
найти соответствия и нашего форума !Возвращает значение типа Long, получения остальных файлов, myName = Dir(myPath в одну.
Ответы на вопросы,lalike 14).Value) = False + 1, 25).Value выделять ячейки и
ЛистИсточник.Cells(31 + i,
- Or ActiveCell.Font.Bold =
- ЛистИсточник As Excel.Worksheet
- строчки For i:
выдать сообщенияSurrogate представляющее режим файла имена которых соответствуют
& «*.xls»): iкак бы сделать
1. Excel файлынадо попробовать формулы, Then ЛистСводный.Cells(LastRowСводный + = 0 ЛистСводный.Cells(LastRowСводный
перемещаться по листу: 13).Value Else ЛистКонечный.Cells(LastRowКонечный False Then MsgBox Dim ЛистКонечный As = 1 ToAlex Darkvbanub: Прошу простить мою для файлов, открытых PathName, следует повторно = 1: Cells.ClearContents так, чтобы еще расположены в одной
Excel обуздать дляв смысле «универсальной»? j, 19).Value = + 1, 26).Value
для этого нужно + j, 20).Value
«Выделенными ячейками могут Excel.Worksheet Dim i
qFile Set book, наверное я как
: Ну так и оплошность, выкладывал с с помощью инструкции
вызвать функцию
Do While myName и определенные ячейки..? папке. c:/1/ например
вашей задачи. У
Начните изучать потихоньку ЛистИсточник.Cells(31 + i,
= 0 GoTo использовать метод InputBox = 0 End быть только R1C1,
As Long Dim = Workbooks.Open(nFile(i)) ‘заполняем то неверно выразился… тут пройдитесь по телефона,
OpenDir <> «» да и еще
2. желтые ячейки вас хорошая идея.
VBA, я помогу 14).Value Else ЛистСводный.Cells(LastRowСводный metka_2 ElseIf АктивнаяЯчейка.Column (не путать с
If If IsEmpty(ЛистИсточник.Cells(31 последняя ячейка столбца j As Long общую информацию Rowменя не устраивает, многомерному — еслиПисан, ребят поймите
, в соответствии собез аргументов. ПоследовательныеCells(i, 2).Formula = и диапазон переменчивый?
3. для удобстваЯ создал ситуация, на первых порах,
+ j, 19).Value <> 11 And функцией InputBox). Перед
+ i, 12).Value) C11 или последняя Dim LastRowКонечный As
= Row + что файл открывается что-то уже есть с телефона выкладывал,
следующей схемой: вызовы функции без «='» & myPath может, быть вручную
написания макроса) что ваша формула т.к. обладаю только = 0 End АктивнаяЯчейка.Column <> 17 использованием кода прочтите = False Then ячейка столбца C17.»
Long Dim LastRowИсточник 1 ‘переходим на так, как будто
на листе, это больше не повторится!Input=1 Output=2 Random=4 Append=8 аргументов возможны до & «[» & диапазон указывать для
Busine2009 наконец у меня
неполными базовыми знаниями.
If If IsEmpty(ЛистИсточник.Cells(31
Or _ IsNumeric(АктивнаяЯчейка) Руководство пользователю.
ЛистКонечный.Cells(LastRowКонечный + j, & vbCr &
As Long Dim
след строчку в я просто открыл
можно взять вvbanub
Binary=32 тех пор, пока
myName & «]Лист1′!$C$5″ каждого документа?
: заработала.
И будете превращать
+ i, 13).Value)
= False Or
Sub m_1() Dim 21).Value = ЛистИсточник.Cells(31
_ «Если это
СколькоОбъединять As Long
общей таблице sh.Cells(Row,
его из проводника(в
массив, затем пройтись
:
Параметры
имеются файлы или
Cells(i, 3).Formula =
DarkSacred
lalike
booleg этот код в = False Then
АктивнаяЯчейка.Font.Bold = False ЛистИсточник As Excel.Worksheet + i, 12).Value последняя ячейка столбца Dim Сумма ‘Проверка, 1) = Cells(8, окне)… как привыкли.
vbanubФункция содержит именованные папки, соответствующие образцу «='» & myPath
: Вот как решить,: Подскажите как будет универсальный. ЛистСводный.Cells(LastRowСводный + j, Then MsgBox «Выделенными Dim ФайлИсточник As Else ЛистКонечный.Cells(LastRowКонечный + C11 или столбца что добавлен лист 4) sh.Cells(Row, 2)вот например паскаль:Вообще обычно под, где попытки решения?
аргументы FileNumberОбязательный аргумент первого вызова(с аргументами) & «[» & проблему с выборомкроме этого диапазона
выглядеть код еслиlalike 20).Value = ЛистИсточник.Cells(31 ячейками могут быть Excel.Workbook Dim ЛистСводный j, 21).Value = C17, то проверьте в конечную книгу = Cells(10, 4) открыть файл для виндой для этогоSurrogate типа Integer, указывающийПримечание: Рекурсивные вызовы myName & «]Лист1′!$D$8″ файлов для загрузки ячеек R32C3 - ситуация попроще:: отлично! огромное спасибо,
+ i, 13).Value только R1C1, последняя As Excel.Worksheet Dim 0 End If
форматирование этой ячейки: для записи в sh.Cells(Row, 3) = чтения — там привлекают словарь, вероятно: Никогда не работал
на любой допустимый функцииCells(i, 1) =’Выбираем файлы для R40C17, всё остальноеЕсть около 1000
я сейчас читаю Else ЛистСводный.Cells(LastRowСводный + ячейка столбца C11 oFileSystemObject As Scripting.FileSystemObject If IsEmpty(ЛистИсточник.Cells(31 +
» & vbCr нём имён файлов,
Cells(11, 4) sh.Cells(Row,
же не открывается в С, С++
с этим языком, номер файла ReturnTypeНеобязательныйDir myName: i =
загрузок nFile = полностью одинаковое во файлов с абсолютно А. Гарнаева, Самоучитель j, 20).Value = или последняя ячейка Dim oFolder As i, 8).Value) = & _ «в из которых данные
4) = Cells(13, сам текстовый документ
тоже есть аналогичный
по-этому и попросил аргумент типа Integer,запрещены i + 1:
Application.GetOpenFilename( _ FileFilter:=»xls-файл
всех файлах? одинаковыми таблицами (отличаются
VBA. 0 End If столбца C17.» &
Scripting.Folder Dim oFile False Then ЛистКонечный.Cells(LastRowКонечный
этой ячейке должно
уже получены. For 4) ‘и т.д. в окне блокнота) инструмент, но я
помощи указывающий характер возвращаемых
Возвращаемое значение myName = Dir (*.xls),*.xls», _ Title:=»Выберитеlalike
только данные) иBusine2009 If IsEmpty(ЛистИсточник.Cells(31 + vbCr & _
As Scripting.File Dim + j, 23).Value быть число и Each ЛистКонечный2 In
заносите шапку файлаAlex Dark
не в курсе,
vbanub данных. Начиная cФункция возвращает данные типа
Loop: [A:C].Value =
файлы для загрузки»,: Да! Расположение всех
необходимо получить в:
i, 12).Value) = «Если это последняя ИмяПапки As String
= ЛистИсточник.Cells(31 + шрифт должен быть Workbooks(«Конечный.xls»).Worksheets If ЛистКонечный2.Name ‘теперь переходим к, на данный момент, не изучал.: все когда-то бывает
Visual Basic версии String, структурно представляющего [A:C].Value
_ MultiSelect:=True) If остальных ячеек полностью сводный файл такуюlalike False Then ЛистСводный.Cells(LastRowСводный ячейка столбца C11 Dim Response As i, 8).Value Else
жирным.», vbCritical Exit = «Имена файлов» таблице EndRow = у меня такНо вот насчёт в первый раз. 5, поддерживается только
имя файла илиEnd Sub IsEmpty(nFile) Or Not одинаковое.
же таблицу но, + j, 21).Value или столбца C17,
String Dim АктивнаяЯчейка ЛистКонечный.Cells(LastRowКонечный + j, Sub End If Then Флаг =
Range(Range(«A1»), Range(«A1»).SpecialCells(xlLastCell)).Rows.count ‘определяем и сделано) частичных дублей -
нарисуйте или опишите одно значение:1, которое папки, которые удовлетворяюттеперь осталось еще IsArray(nFile) Then ExitЗЫ Само содержание содержащую результат обработкичто ты именно = ЛистИсточник.Cells(31 + то проверьте форматирование
As Range Dim 23).Value = 0 LastRowИсточник = ActiveCell.Row True Exit For последнию строчку ForAlex Dark
я не представляю алгоритм решения по параметр принимает по указанному шаблону имени решить момент с
CyberForum.ru
Функция Dir
Sub 'выбран ли
ячеек разное.
исходных таблиц ( читаешь? Какой раздел i, 12).Value Else этой ячейки: « i As Long End If If ‘Заполним сначала столбец End If Next j = 32: С этими претензиями как делать… вашему мнению, или умолчанию. Поэтому его файла, набору атрибутов разными диапазонами) файл для загрузокBusine2009 например сумму значений этой книги и ЛистСводный.Cells(LastRowСводный + j, & vbCr & Dim j As IsEmpty(ЛистИсточник.Cells(31 + i, 17 в конечном ЛистКонечный2 If Флаг To EndRow ‘смотрим
в мелкософт.Surrogate дайте код на можно игнорировать. В
файла или метке
Добавлено через 1 минуту qFile = UBound(nFile): соответствующих ячеек) ? для чего ты 21).Value = 0 _ «в этой Long Dim LastRowИсточник 7).Value) = False файле, чтобы знать, = False Then заполненна ли перваяНо сомневаюсь что: Ну вот в
том языке который 16-разрядных системах значение тома на диске.Busine2009 ‘запоминаем количество файловlalikelalike читаешь этот раздел
End If If ячейке должно быть As Long Dim Then ЛистКонечный.Cells(LastRowКонечный + сколько объединять ячеек MsgBox «Не добавлен ячейка в строчке они вас там vba, как раз вам знаком. 2 задает возвращение Если аргумент PathName, ‘—————————Потом определяем последнию
,: какой процедурой выплняется книги? IsEmpty(ЛистИсточник.Cells(31 + i, число и шрифт LastRowСводный As Long j, 24).Value = в дальнейшем. For лист в конечный j If Len(Cells(j, будут слушать. с этим ичтоб было видно дескриптора файла в не найден, тонет это неодноразовая активную строкуа файлы каждый сборка информации сlalike 8).Value) = False должен быть жирным.» Dim СколькоОбъединять As ЛистИсточник.Cells(31 + i, i = 1
файл для записи 1).Text) <> 0Вы либо пользуетесь
проблемы, можете предложить ход ваших мыслей операционной системе. В функция работа.qRow = Range(Range("A1"), раз новые оказываются эксель файлов?: еще вот посоветовали Then ЛистСводный.Cells(LastRowСводный + & vbCr & Long Dim Сумма
7).Value Else ЛистКонечный.Cells(LastRowКонечный
To LastRowИсточник - имён файлов, из
Функция FileAttr
Then 'заполняем значения
так как есть решение?в методичке поверьте 32-разрядных системах значениеDirколичество папок постоянно Range(«A1»).SpecialCells(xlLastCell)).Rows.countПоможет только если в папке? ИКомментарий модератораДж. Уокенбаха. «Профессиональное
j, 23).Value =
vbCr & _ ‘Выбор папки, содержащей + j, 24).Value 31 Step 2 которых данные уже и зтаблицы sh.Cells(Row, либо не пользуетесь
Hugo121 мне есть почти
2 аргумента ReturnType
возвращает пустую строку(« увеличивается. Каждй месяц после таблицы ни нужны ли связиИменуйте темы осмысленно. программирование на VBA ЛистИсточник.Cells(31 + i, «Повторите выбор ячейки.», файлы-источники. With Application.FileDialog(msoFileDialogFolderPicker) = 0 End If IsEmpty(ЛистИсточник.Cells(31 + взяты.» & vbCr 19) = Cells(j, ими вовсе.: а как поиск все что нужно, не поддерживается и «) по 10-20 папок. каких данных не между конечным файлом Название темы должно в Excel 2002
8).Value Else ЛистСводный.Cells(LastRowСводный vbCritical GoTo metka_1 If .Show = If If IsEmpty(ЛистИсточник.Cells(31 i, 1).Value) = & _ "Или 14) sh.Cells(Row, 20)Можно попробовать свернуть частичного совпадения, реализуете и не говорите приводит к ошибкеПримечание: Если послеBusine2009 будет и файлом-источником -
максимально полно отражать
(2003)», «Подробное руководство + j, 23).Value
Функция FileLen
End If LastRowИсточник
0 Then Exit + i, 6).Value) False Then j лист имеет неправильное = Cells(j, 13) открытое окно, но в c/c++ ? что это вамПример возврата функцией пустой: у вас жеПосле циклом перебираем ='[1.xls]Лист1′!R20C4? ее содержание. по созданию формул = 0 End
= АктивнаяЯчейка.Row ‘Заполним
Sub ИмяПапки = = False Then = j +
имя.», vbCritical Exit
‘ и т.д. | при этом возможныvbanub по работе нужно’ В данном примере строки, снова вызвать 200 файлов, вы все строчки начинаяlalikedzug: Той которую напишите.. в Excel» If If IsEmpty(ЛистИсточник.Cells(31 сначала столбец 17 |
.SelectedItems(1) End With
ЛистКонечный.Cells(LastRowКонечный + j, 1 ЛистКонечный.Cells(LastRowКонечный + Sub End If 'если не заполненна
проблемы в работе.
: dim массив() массив=диапазон.valueДобавлено через 3 часа
Работа с файлом в Excel
функция FileAttr ‘ функцию без аргументов, собираетесь открыть каждый с 32 и:lalikeBusine2009
+ i, 7).Value) в конечном файле,
‘Проверка, что выбрана 25).Value = ЛистИсточник.Cells(31 j, 17).Value = ‘Проверка, что с
первая ячейка смотримpashulka
‘и перебираем как 12 минут используется для определения то возникает ошибка
файл и удалить по qRow, приBusine2009
: хм, я здесь, я пока знакомлюсь = False Then чтобы знать, сколько
нужная папка. Response + i, 6).Value ЛистИсточник.Cells(31 + i, данного листа данные заполненна ли 11
: Здесь ключевое слово угодноvbanub
режима файла Dim времени исполнения Invalid то, что находится этом ставим условие, недавно, может подскажете:
в целом. ЛистСводный.Cells(LastRowСводный + j,
объединять ячеек в = MsgBox(«Выбрана папка Else ЛистКонечный.Cells(LastRowКонечный + 1).Value End If ещё не брались. ячейка Else If
— текстовый, ибос помощью ассоциативных
, судя по заданию FileNum, Mode FileNum procedure call or ниже?
если Len(Cells(i,1).Text) <>Нет, связи неесть иного .xlsа у меня
24).Value = ЛистИсточник.Cells(31 дальнейшем. For i » & ИмяПапки,
j, 25).Value = Next i j With Workbooks(«Конечный.xls»).Worksheets(«Имена файлов») Len(Cells(j, 11).Text) <> в VB(A) это массивов, подключаем STL это не первый
= 1 ‘ argumentЯ предлагаю для 0(проверяет что данная нужны. Нужны только файлов, еще такой вопрос, + i, 7).Value = 1 To vbOKCancel) If Response 0 End If = 0 СколькоОбъединять For Each oCell 0 Then ‘заполняем также осуществимо а шаблон map, а курс, первый семестр! Присваивает номер файлаПараметры идентификации окончания таблицы ячейка имеет какое цифры, данные.собираю все вв файле источнике Else ЛистСводный.Cells(LastRowСводный + LastRowИсточник — 31 = vbCancel Then Next i With = ЛистКонечный.Cells.SpecialCells(xlCellTypeLastCell).Row - In .Range(«A» & итоговые данные sh.Cells(Row, если Вы не дальше путем обменанаверно учитесь в Open «TESTFILE» ForPathNameНеобязательный аргумент. Строковое использовать R40C11. то значение), еслиВ папке определенное один, в столбе X j, 24).Value = Step 2 If Exit Sub ‘Активизация ЛистКонечный .Cells(LastRowКонечный +
LastRowКонечный ‘Будем отдельно .Cells.SpecialCells(xlCellTypeLastCell).Row) If oCell.Value 22) = Cells(j, хотите видеть процесс значениями между отображениями Российской Академии Социнжиниринга Append As FileNum выражение, указывающее имяR30C11 постоянно. R40C11 данное условие выполнится количество файлов, новые
беру определенные ячейки, строке Y брались 0 End If IsEmpty(ЛистИсточник.Cells(31 + i, объектов, связанных с 1, 4).Value = заносить данные в = ActiveWorkbook.Name Then 11) sh.Cells(Row, 26)
открытия/закрытия книг(и), то проверяем на схожесть или Международном Университете ‘ Открывает файл файла. Также может — жирным оформлено. то копируйте данные не появляются.
расположение ячеек в данные, If IsEmpty(ЛистИсточник.Cells(31 + 1).Value) = False
работой с файлами. ЛистИсточник.Cells(8, 4).Value .Range(.Cells(LastRowКонечный отношении ячеек конечного MsgBox «Из данного = Cells(j, 17) можете просто :
частичных дублей чОткого менеджмента? Mode = FileAttr(FileNum, содержать имя каталога
Если между R30C11 из нужных ячеекэтими связями я некоторых местах меняется.
потом в другом i, 6).Value) = Then j = Set oFileSystemObject = + 1, 4), файла, имеющих и файла-источника данные уже
CyberForum.ru
‘после заполнения итоговых
Данные функции предназначены для работы с текстовыми файлами из VBA Excel.
Используя эти функции, вы при помощи одной строки кода сможете записать текст из переменной в файл, или наоборот, загрузить содержимое текстового файла в переменную.
Подразумевается, что текстовые файлы имеют формат ANSI (он же ASCII, он же windows-1251)
Чтение текстового файла в переменную:
Function ReadTXTfile(ByVal filename As String) As String Set fso = CreateObject("scripting.filesystemobject") Set ts = fso.OpenTextFile(filename, 1, True): ReadTXTfile = ts.ReadAll: ts.Close Set ts = Nothing: Set fso = Nothing End Function
Запись в текстовый файл из переменной:
Function SaveTXTfile(ByVal filename As String, ByVal txt As String) As Boolean On Error Resume Next: Err.Clear Set fso = CreateObject("scripting.filesystemobject") Set ts = fso.CreateTextFile(filename, True) ts.Write txt: ts.Close SaveTXTfile = Err = 0 Set ts = Nothing: Set fso = Nothing End Function
Добавление в текстовый файл из переменной:
Function AddIntoTXTfile(ByVal filename As String, ByVal txt As String) As Boolean On Error Resume Next: Err.Clear Set fso = CreateObject("scripting.filesystemobject") Set ts = fso.OpenTextFile(filename, 8, True): ts.Write txt: ts.Close Set ts = Nothing: Set fso = Nothing AddIntoTXTfile = Err = 0 End Function
- 107130 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Задача по объединению данных из нескольких Excel-файлов, или подгрузка доп.данных из внешнего файла решается достаточно просто: создается объект Excel, который можно скрыть визуально, затем открывается необходимый файл и выполняются нужные действия. Просто приведу несколько примеров.
Открытие файла Excel
Set objExcel = New Excel.Application objExcel.Visible = False Set wb = objExcel.Workbooks.Open(fname) Set ws = wb.Sheets(1)
В первой строке запускаем новый Excel, затем делаем его невидимым, в 3-й строке открываем файл fname. В последней строке получаем первый лист открытого excel-кого файла.
Альтернативный вариант открытия файла
Set objExcel = New Excel.Application Set wb = objExcel.Workbooks wb.Open fname, local:=True Set ws = wb.Item(1).ActiveSheet
При открытии файла можно использовать доп.параметры (приведу некоторые):
UpdateLinks — обновлять или нет внешние ссылки при открытии файла;
ReadOnly — открытие в режиме только для чтения;
Format — используемый при открытии разделитель (1 — символ tab, 2 — запятые, 3 — пробелы, 4 — точка с запятой, 5 — без разделителя, 6 — пользовательский разделитель, заданный в Delimiter);
Delimiter — пользовательский разделитель (в случае, если Format = 6);
Origin — тип операционной системы (xlMacintosh, xlWindows или xlMSDOS);
Local — использование в Excel языка такого же, как в открываемом файле.
Теперь можно выполнять какие-то действия с открытым файлом, просто обращаясь через wb и ws.
ws.Cells(1, 1).Value = "Test" ws.Cells(1, 1).Font.Size = 18 ' Поменять размер шрифта ws.Cells(1, 1).HorizontalAlignment = xlCenter '
Записать книгу и закрыть
wb.Save ' Записать с тем же именем wb.SaveAs Filename:="имя_нового_файла", FileFormat:=xlOpenXMLWorkbookMacroEnabled ' Записать в новый файл wb.Close ' Закрыть книгу
Для записи текущей книги (где находится макрос), можно использовать:
ActiveWorkbook.SaveAs
Чтобы сохранить или перезаписать книгу Excel без вопросов, можно применить такой вариант:
Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:="c:Temp001.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled Application.DisplayAlerts = True
У метода SaveAs есть несколько параметров сохранения, с ними можно ознакомиться на сайте Microsoft.
Если нужно, можно закрыть книгу Excel без сохранения изменений таким образом:
wb.Close False
Чтение и запись в файл, открытый с помощью оператора Open. Операторы Input, Line Input, Write и функция EOF. Примеры использования в VBA Excel.
Операторы чтения и записи в файл
Оператор Input #
Оператор Input # считывает данные из открытого файла с последовательным доступом и присваивает эти данные переменным.
Оператор Input # используется только с файлами, открытыми в режиме Input или Binary. При прочтении стандартные строковые или числовые значения присваиваются переменным без изменения.
Синтаксис оператора Input #:
Input #Номер_файла, Переменные |
Компоненты оператора Input #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Переменные – обязательный параметр, представляющий из себя список переменных, разделенных запятой, которым присваиваются значения, считанные из файла.
Особенности применения оператора Input #:
- Элементы данных в файле должны быть указаны в том же порядке, что и переменные в списке Переменные, и соответствовать им по типу данных. Если переменная числовая, а данные текстовые, этой переменной будет присвоено нулевое значение.
- Если при чтении данных достигнут конец файла, чтение прерывается и возникает ошибка. Для ее предупреждения в коде VBA Excel используется функция EOF.
- Чтобы данные из файла могли быть правильно прочитаны и записаны в переменные с помощью оператора Input #, они должны быть записаны в файл с помощью оператора Write #. Он обеспечивает правильное разделение каждого из полей (элементов) данных.
Оператор Line Input #
Оператор Line Input # считывает одну строку из открытого файла с последовательным доступом и присваивает ее значение строковой переменной.
Оператор Line Input # считывает из файла по одному символу до тех пор, пока не встретится символ возврата каретки (Chr(13)) или последовательность символа возврата каретки и перевода строки (Chr (13) + Chr(10)).
Синтаксис оператора Line Input #:
Line Input #Номер_файла, Переменная |
Компоненты оператора Line Input #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Переменная – обязательный параметр, представляющий из себя имя переменной, объявленной как String или Variant, которой присваивается строка, считанная из файла.
Оператор Write #
Оператор Write # записывает данные в файл с последовательным доступом.
Синтаксис оператора Write #:
Write #Номер_файла, [Данные] |
Компоненты оператора Write #:
- Номер_файла – обязательный параметр, представляющий из себя номер, присвоенный файлу при открытии с помощью оператора Open.
- Данные – необязательный параметр, представляющий из себя одно или несколько числовых или строковых выражений, разделенных запятой, которые нужно записать в файл.
Особенности применения оператора Write #:
- Данные, записанные с помощью оператора Write #, считываются из файла с помощью оператора Input #.
- Если опустить параметр Данные и добавить запятую после Номер_файла, в файл будет добавлена пустая строка.
- Несколько выражений в списке Данные могут быть разделены точкой с запятой или запятой.
- Числовые данные всегда записываются с точкой в качестве разделителя целой и дробной части.
- Оператор Write # вставляет запятые между элементами и прямые парные кавычки вокруг строк при их записи в файл.
- После записи в файл последнего символа из параметра Данные оператор Write # вставляет символы возврата каретки и перевода строки (Chr (13) + Chr(10)).
Функция EOF
Функция EOF возвращает логическое значение True, когда достигнут конец файла, открытого для последовательного (Input) или произвольного (Random) доступа.
Синтаксис функции EOF:
Номер_файла – это номер, присвоенный файлу при открытии с помощью оператора Open.
Функция EOF используется для предупреждения ошибок, вызываемых попытками выполнить чтение после конца файла. Она возвращает значение False, пока не будет достигнут конец файла.
Примеры чтения и записи в файл
Пример 1
Открытие (или создание, если он не существует) текстового файла для чтения и записи и запись в него одной строки, состоящей из двух текстовых и одного числового значений. Файл с именем myFile1.txt будет создан в той же папке, где расположен файл Excel с кодом VBA.
Sub Test1() Dim ff As Integer ‘Получаем свободный номер для открываемого файла ff = FreeFile ‘Открываем (или создаем) файл для чтения и записи Open ThisWorkbook.Path & «myFile1.txt» For Output As ff ‘Записываем в файл одну строку Write #ff, «Дает корова молоко!», _ «Куда идет король?», 25.35847 ‘Закрываем файл Close ff ‘Открываем файл для просмотра ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile1.txt») End Sub |
Строки и число можно предварительно присвоить переменным, объявленным с соответствующими типами данных, и использовать их для записи данных в файл (в строках кода с оператором Write #, как в этом и следующем примерах).
Пример 2
Открытие (или создание, если он не существует) файла без расширения для чтения и записи и запись в него трех строк: двух текстовых и одной в числовом формате. Файл с именем myFile2 будет создан в той же папке, где расположен файл Excel с кодом VBA.
Так как у файла нет расширения, Windows выведет диалоговое окно для выбора открывающей его программы. Выберите любой текстовый редактор или интернет-браузер.
Sub Test2() Dim ff As Integer ‘Получаем свободный номер для открываемого файла ff = FreeFile ‘Открываем (или создаем) файл для чтения и записи Open ThisWorkbook.Path & «myFile2» For Output As ff ‘Записываем в файл три строки Write #ff, «Дает корова молоко!» Write #ff, «Куда идет король?» Write #ff, 25.35847 ‘Закрываем файл Close ff ‘Открываем файл для просмотра ThisWorkbook.FollowHyperlink (ThisWorkbook.Path & «myFile2») End Sub |
Пример 3
Считываем строку, разделенную на отдельные элементы, из файла myFile1.txt и записываем в три переменные, по типу данных соответствующие элементам.
Sub Test3() Dim ff As Integer, str1 As String, _ str2 As String, num1 As Single ‘Получаем свободный номер для открываемого файла ff = FreeFile ‘Открываем файл myFile1.txt для чтения Open ThisWorkbook.Path & «myFile1.txt» For Input As ff ‘Считываем строку из файла и записываем в переменные Input #ff, str1, str2, num1 Close ff ‘Смотрим, что записалось в переменные MsgBox «str1 = « & str1 & vbNewLine _ & «str2 = « & str2 & vbNewLine _ & «num1 = « & num1 End Sub |
Попробуйте заменить в этом примере строку Input #ff, str1, str2, num1
сначала на строку Input #ff, str1
, затем на строку Line Input #ff, str1
, чтобы наглядно увидеть разницу между операторами Input # и Line Input #.
В следующих примерах (4 и 5) замена оператора Input # на Line Input # не приведет ни к каким изменениям, так как данные в строках файла myFile2 не разделены на элементы (поля).
Пример 4
Считываем поочередно три строки из файла myFile2 и записываем в три элемента массива, объявленного как Variant, так как в этот файл ранее были записаны две строки с текстом и одна с числом.
Sub Test4() Dim ff As Integer, a(2) As Variant, i As Byte ‘Получаем свободный номер для открываемого файла ff = FreeFile ‘Открываем файл myFile2 для чтения Open ThisWorkbook.Path & «myFile2» For Input As ff ‘Считываем строки из файла и записываем в элементы массива For i = 0 To 2 Input #ff, a(i) Next Close ff ‘Смотрим, что записалось в элементы массива MsgBox «a(0) = « & a(0) & vbNewLine _ & «a(1) = « & a(1) & vbNewLine _ & «a(2) = « & a(2) End Sub |
Пример 5
Считываем с помощью цикла Do While… Loop все строки из файла myFile2 и записываем построчно в переменную, объявленную как String (число из третьей строки запишется как текст). Для остановки цикла при достижении конца файла используем функцию EOF.
Sub Test5() Dim ff As Integer, a As Variant, b As String ‘Получаем свободный номер для открываемого файла ff = FreeFile ‘Открываем файл myFile2 для чтения Open ThisWorkbook.Path & «myFile2» For Input As ff ‘Считываем строки из файла и записываем в элементы массива Do While Not EOF(ff) Input #ff, a b = b & a & vbNewLine Loop Close ff ‘Смотрим, что записалось в переменную MsgBox b End Sub |
Предыдущая часть темы об открытии файла для ввода и вывода информации опубликована в статье: Оператор Open (синтаксис, параметры). Смотрите также связанную статью: Функция FreeFile.
Смотрите, как создавать и открывать текстовые файлы с помощью методов CreateTextFile и OpenTextFile. Чтение файла, запись и добавление информации с помощью объекта TextStream.
You can VBA Read file binary or text data using a couple of different approaches in Excel. VBA provides you a set of native statements like Open to open and ready files. However in this article aside from showing you these native approaches to reading files using Excel Macros you can read CSV files and other structured data schemas using Jet.OLEDB driver, Microsoft Queries or also the FileSystemObject.
Text/binary files are common ways of storing data as opposed to databases or regular Excel files. Looking at various resources I missed a single resource which would demonstrate the various methods for PROPERLY reading files in VBA.
It is important to remember that you shouldn’t read all files using the same approach. Be aware of the structure of the file. If it is a structured CSV use the ADODB connection, if you need to read only a couple of rows read the file row by row or by chunks, else read the whole file. If you want performance – always select the right approach.
Reading text files in VBA
VBA Read text files (line by line)
To read an entire text file line by line use the code below.
Dim fileName As String, textData As String, textRow As String, fileNo As Integer fileName = "C:text.txt" fileNo = FreeFile 'Get first free file number Open fileName For Input As #fileNo Do While Not EOF(fileNo) Line Input #fileNo, textRow textData = textData & textRow Loop Close #fileNo
VBA Read text files (read whole file)
To read an entire text file in one go (not line by line) use the code below.a
Dim fileName As String, textData As String, fileNo As Integer fileName = "C:text.txt" fileNo = FreeFile 'Get first free file number Open fileName For Input As #fileNo textData = Input$(LOF(fileNo), fileNo) Close #fileNo
VBA Read specific number of lines from a text file
In cases when you want to read specific lines from a text file you can adapt the line by line read code as below. It allows you to read a certain number of lines (noLines) from a text file from a specific start line number (sLine). If you set noLines to 0 it will read all lines till end of the file.
Dim fileName As String, textData As String, textRow As String, fileNo As Integer Dim lineCounter as Long, sLine as Long, noLines as Long fileName = "C:text.txt" sLine = 20 'number of the first line you want to read noLines = 100 'number of lines you want to read fileNo = FreeFile Open fileName For Input As #fileNo Do While Not EOF(fileNo) Line Input #fileNo, textRow If lineCount >= sLine and ((noLines > 0 and lineCount < noLines + sLine) or noLines = 0) then textData = textData & textRow End If lineCount = lineCount + 1 Loop Close #fileNo
Reading CSV files in VBA
Reading CSV files (read whole file and process each row)
Reading a text file line by line into a string:
'Assuming file looks like this. File path: C:test.csv '"Col1", "Col2", "Col3" '1 , 2 , 3 directory = "C:" fileName = "test.csv" 'Assuming test.csv is in C: directory Set rs = CreateObject("ADODB.Recordset") strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & directory & ";" _ & "Extended Properties=""text;HDR=Yes;FMT=Delimited"";" strSQL = "SELECT * FROM " & fileName rs.Open strSQL, strcon, 3, 3 rs.MoveFirst Do col1 = rs("Col1") col2 = rs("Col2") col3 = rs("Col3") rs.MoveNext Loop Until rs.EOF
Reading CSV files (whole file to Worksheet)
Read whole file to an Excel Worksheet:
Dim ws as Worksheet, destRng as Range, fileName as String fileName = "C:text.txt" Set destRng = Range("A1") Set ws = ActiveSheet With ws.QueryTables.Add(Connection:= "TEXT;" & fileName & "", Destination:=destRng) .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .RefreshStyle = xlInsertDeleteCells .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .TextFilePromptOnRefresh = False .TextFilePlatform = 852 .TextFileStartRow = 1 .TextFileParseType = xlDelimited .TextFileTextQualifier = xlTextQualifierDoubleQuote 'Select your delimiter - selected below for Comma .TextFileConsecutiveDelimiter = False .TextFileTabDelimiter = False .TextFileSemicolonDelimiter = False .TextFileCommaDelimiter = True .TextFileSpaceDelimiter = False .TextFileTrailingMinusNumbers = True 'This will refresh the query End With
To refresh the CSV upload (in case the CSV was updated) simply run:
ws.QueryTables.Refresh BackgroundQuery:=False
Reading binary files in VBA
Dim fileName As String, fileNo As Integer, intVar As Integer fileName = "C:text.bin" fileNo = FreeFile Open fileName For Binary Lock Read As #fileNo Get #fileNo, , intVar Close #fileNo
With Binary files often you will be using objects which are not of fixed byte length like Integers. For example you would want to read Strings from binary files together with other data types. In such cases use the Type object data type when writing to a file. Learn more here.
Below a simple example of reading a file to which a Type data type was saved to, including an Integer and String.
Type TestType intVar As Integer strVar As String End Type Sub ReadBinary() Dim fileName As String, fileNo As Integer, testVar As TestType fileName = "C:test.bin" fileNo = FreeFile Open fileName For Binary Lock Read As #fileNo Get #fileNo, , testVar Debug.Print testVar.intVar 'Print the Integer Debug.Print testVar.strVar 'Print the String Close #fileNo End Sub
Reading XML files in VBA
XML files are basically text files which follow the XML taxonomy. You can try to read and process XML files similarly as text files shown above. However, given you will probably want to extract specific XML tag or attribute information I suggest reading my dedicated article below.
Functions needed to read files in VBA
Function | Description |
---|---|
Open [path_to_file] For [Mode] [Access] [Lock] As [long_variable] | Opens the file for read/write and returns the # file number (needs to be type of long) into long_variable More info here. Parameters below:
|
Close | Closes the file using the # file number. More info here. |
FreeFile | Get next free file number available for the Open statement / FileOpen function. Using this function is important especially when operating on multiple files simultaneously. More info here. |
BOF(fileNumber) | Returns true if you are at the beginning of the file described by the file number. More info here. |
EOF(fileNumber) | Returns true if you have reached the end of the file described by the file number. More info here. |
Loc(fileNumber) | Returns the current read/write position within an open file. More info here. |
LOF(fileNumber) | Returns the size in bytes of the file represented by the file number. More info here. |
Above functions allow native upload of file data. However for more complicated scenario you will probably go for the FileSystemObject.
VBA Read File Summary
Reading files in VBA is not hard and requires just a few lines of code usually. It is, however, important to use the appropriate approach to read a file in VBA. Not all files need to be read line-by-line which is usually inefficient. Equally so you need not always read the entire file if you just need the first few / last rows. Working with XML files is also not a challenge if you read through my post on how to work with XML files.
Want to Write to files instead?
If you are looking to write to files instead using VBA, read my article on how to write to files using VBA.