powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диалог- "Открыть файл"
50 сообщений из 50, показаны все 2 страниц
Диалог- "Открыть файл"
    #37191805
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте уважаемые гуру!
Есть программа на VBA в Excel-е, которая открывает другой xls-файл (2) с данными, обрабатывает их и создает третий xls-файл (3).
Файл (2) раньше всегда подавался со стандартным, одним и тем же, именем "Набор.xls". Теперь ситуация поменялась, необходимо приписывать к имени файла число, типа:
"Набор-1200.xls"
"Набор-1201.xls"
"Набор-1202.xls"
...
число в имени будет постоянно увеличиваться, а количество файлов, поступающих на обработку, будет разное. Возможно, не всегда цифры будут увеличиваться на единицу.
На выходе должны получаться файлы:
"Итог-1200.xls"
"Итог-1201.xls"
"Итог-1202.xls"
...
Цифры из имени файла (2) добавляются к имени файлу (3) - это сделать просто.
Подскажите, как лучше поступить в данной ситуации?
В голову ничего не приходит, кроме как сделать диалог для открытия файла (как это делается в стандартном меню: Файл - Открыть - появляется окно, в котором можно выбрать нужный файл и нажать кнопку "Открыть" или "Отмена").
Что-то типа:
Код: plaintext
1.
2.
fileToOpen = Application _
    .GetOpenFilename("Text Files (*.xls), *.xls")
Кстати, тут есть подводные камни? Может проверку какую-нибудь надо делать?
Office 2003 SP2 Rus
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37191936
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function GetNewFileName() As String

    Dim fso As New FileSystemObject
    Dim fName As String
    Dim num As String
    Dim fileToOpen As Variant
    Dim newName As String
    
    fileToOpen = Application.GetOpenFilename("Text Files (*.xls), *.xls")
    fName = fso.GetBaseName(fileToOpen)
    num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
    
    newName = "Набор-" & num

End Function

...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37191976
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,
Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime.

Это в настройках редактора VBA? Включил. Но и без него работало почему то...

YudzhinAlex37,

Неоходимо сделать ссылку на библиотеку Tools -> References -> Microsoft Scripting Runtime.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Function GetNewFileName() As String

    Dim fso As New FileSystemObject
    Dim fName As String
    Dim num As String
    Dim fileToOpen As Variant
    Dim newName As String
    
    fileToOpen = Application.GetOpenFilename("Text Files (*.xls), *.xls")
    fName = fso.GetBaseName(fileToOpen)
    num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
    
    newName = "Набор-" & num

End Function

...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37191985
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Function GetNewFileName() As String

    Dim fso As New FileSystemObject
    Dim fName As String
    Dim num As String
    Dim fileToOpen As Variant
    Dim newName As String
    
    fileToOpen = Application.GetOpenFilename("Text Files (*.xls), *.xls")
    fName = fso.GetBaseName(fileToOpen)
    num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
    
    newName = "Набор-" & num

End Function

Спасибо, сейчас попробую по вашей методике сделать...
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192011
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Поправочка. Функция ничего не возвращала и исправил "Набор" на "Итог" :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Function GetNewFileName() As String

    Dim fso As New FileSystemObject
    Dim fName As String
    Dim num As String
    Dim fileToOpen As Variant
    Dim newName As String
    
    fileToOpen = Application.GetOpenFilename("Text Files (*.xls), *.xls")
    fName = fso.GetBaseName(fileToOpen)
    num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
    
    newName = "Итог-" & num
    
    GetNewFileName = newName

End Function
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192012
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

я бы сделал список файлов в папке, заполняемый с помощью функции Dir и оттуда бы уже доставал файлы для обработки. Плюс хотя бы в том, что меньше действий для юзера и не нарушается логика интерфейса посторонними окнами.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192072
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

Поправочка. Функция ничего не возвращала и исправил "Набор" на "Итог" :)

Код: plaintext
1.
2.
3.
4.
5.
6.
...
    newName = "Итог-" & num
    
    GetNewFileName = newName

End Function

Да, путаницу с Набором и Итогом я заметил, спасибо.
А с кодом я поломал бы голову! ;) Не сразу бы понял, в чем дело. Ещё раз спасибо.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192098
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_worldAlex37,

я бы сделал список файлов в папке, заполняемый с помощью функции Dir и оттуда бы уже доставал файлы для обработки. Плюс хотя бы в том, что меньше действий для юзера и не нарушается логика интерфейса посторонними окнами.
Тоже интересная мысль. Да и для пользователей все свелось бы к нажатию один раз на кнопку.
А как это реализовать?
В цикле просмотреть указанную в коде папку на наличие файлов "Набор-*.xls" (не совсем понимаю, как это осуществить).
Номера - в массив.
Обработать данные - сохранив в массив.
Создать итоговые файлы, закачать в них данные из массива, добавить к имени номер - сохранить.

Или проще создать список файлов Набор-*.xls (не знаю, как это делается).
Потом поочередно их открывать и обрабатывать. Так лучше будет - меньше памяти используется.

Можно пример простой посмотреть как это сделать?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192104
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

1. Указываешь папку, где лежать "наборные" файлы
2. Прога ищет папку "NewFiles" в папку с твоими "наборными" файлами. Если есть, то удаляет её с потрохами.
3. Создаёт папку "NewFiles".
4. Ищет файлы с расширениями xls, xlsx, xlsm, xlsb.
5. Если находит, выдирает номер "набора" и создаёт полный путь к новому файлу в папке "NewFiles".
6. Копирует "наборный" файл в "итоговый" файл в папке "NewFiles".

Код: plaintext
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.
33.
34.
35.
36.
Option Explicit

Sub CreateNewFiles()

    Dim fd As FileDialog
    Dim fso As New FileSystemObject
    Dim aFile As File, sExtension As String
    Dim sFullPath As String
    Dim rootFolder As String
    Dim subFolder As String
    Dim num As String
    Dim newName As String
    
    ' Select target folder.
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    If fd.Show = False Then Exit Sub
    rootFolder = fd.SelectedItems( 1 )
    
    ' Create new sub-folder.
    subFolder = rootFolder & "\NewFiles"
    If fso.FolderExists(subFolder) Then fso.DeleteFolder subFolder, True
    fso.CreateFolder subFolder
    
    For Each aFile In fso.GetFolder(rootFolder).Files
        sExtension = fso.GetExtensionName(aFile.Name)
        If sExtension Like "xls*" Then
            ' Copy this file to sub-folder.
            fName = fso.GetBaseName(aFile.Name)
            num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
            newName = "Итог-" & num
            sFullPath = subFolder & "\" & newName & "." & sExtension
            aFile.Copy sFullPath
        End If
    Next
    
End Sub
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192123
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Пропустил объявление переменной fName:
Код: plaintext
1.
Dim fName As String
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192143
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Скриншот.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192152
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

1. Указываешь папку, где лежать "наборные" файлы
2. Прога ищет папку "NewFiles" в папку с твоими "наборными" файлами. Если есть, то удаляет её с потрохами.
3. Создаёт папку "NewFiles".
4. Ищет файлы с расширениями xls, xlsx, xlsm, xlsb.
5. Если находит, выдирает номер "набора" и создаёт полный путь к новому файлу в папке "NewFiles".
6. Копирует "наборный" файл в "итоговый" файл в папке "NewFiles".

Код: plaintext
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.
33.
34.
35.
36.
Option Explicit

Sub CreateNewFiles()

    Dim fd As FileDialog
    Dim fso As New FileSystemObject
    Dim aFile As File, sExtension As String
    Dim sFullPath As String
    Dim rootFolder As String
    Dim subFolder As String
    Dim num As String
    Dim newName As String
    
    ' Select target folder.
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    If fd.Show = False Then Exit Sub
    rootFolder = fd.SelectedItems( 1 )
    
    ' Create new sub-folder.
    subFolder = rootFolder & "\NewFiles"
    If fso.FolderExists(subFolder) Then fso.DeleteFolder subFolder, True
    fso.CreateFolder subFolder
    
    For Each aFile In fso.GetFolder(rootFolder).Files
        sExtension = fso.GetExtensionName(aFile.Name)
        If sExtension Like "xls*" Then
            ' Copy this file to sub-folder.
            fName = fso.GetBaseName(aFile.Name)
            num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
            newName = "Итог-" & num
            sFullPath = subFolder & "\" & newName & "." & sExtension
            aFile.Copy sFullPath
        End If
    Next
    
End Sub

В целом понятно. А маску к имени можно применить? Дело в том, что я задачу упростил, а реально в папке с программой ещё несколько xls-файлов лежат, которые являются "общими" для всех "наборных" файлов - часть инфы берется и из них и прописывается в "итоговые" файлы. Маска бы помогла отсеять ненужное. Или действительно, прийдется создавать вложенную папку.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192178
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

Пропустил объявление переменной fName:
Код: plaintext
1.
Dim fName As String

Да, выдало ошибку - прописал, все ОК!
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192191
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,
.......
For Each aFile In fso.GetFolder(rootFolder).Files
sExtension = fso.GetExtensionName(aFile.Name)
If sExtension Like "xls*" Then
........
End Sub

Срабатывание If sExtension Like "xls* оказывается зависит от регистра! Кто бы подумал! :)
Случайно один из файлов был с расширением XLS (прописными буквами). Его-то и пропустил цикл.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192208
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

"прийдется создавать вложенную папку."
Вложенная папка создаётся для того, чтобы там собирались "итоговые файлы". Ты можешь создать любую папку (переменная subFolder ).

Сначала прога находит чисто экселевские файлы. После того, как она нашла экселевский файл, мы вытягиваем из него название без расширения (переменная fName ). Вот тут ты и можешь применить маску - оператор Like . Посмотри по документации поподробней.
Вот пример (переменная sMask ):

Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Option Explicit

Sub CreateNewFiles()

    Dim fd As FileDialog
    Dim fso As New FileSystemObject
    Dim aFile As File, sExtension As String
    Dim sFullPath As String, fName As String
    Dim sMask As String
    Dim rootFolder As String
    Dim subFolder As String
    Dim num As String
    Dim newName As String
    
    ' Select target folder.
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    If fd.Show = False Then Exit Sub
    rootFolder = fd.SelectedItems( 1 )
    
    ' Define mask.
    sMask = "Набор-*"
    
    ' Create new sub-folder.
    subFolder = rootFolder & "\NewFiles"
    If fso.FolderExists(subFolder) Then fso.DeleteFolder subFolder, True
    fso.CreateFolder subFolder
    
    For Each aFile In fso.GetFolder(rootFolder).Files
        sExtension = fso.GetExtensionName(aFile.Name)
        If sExtension Like "xls*" Then
            ' Copy this file to sub-folder.
            fName = fso.GetBaseName(aFile.Name)
            If fName Like sMask Then
                num = Right(fName, Len(fName) - InStr( 1 , fName, "-", VbCompareMethod.vbTextCompare))
                newName = "Итог-" & num
                sFullPath = subFolder & "\" & newName & "." & sExtension
                aFile.Copy sFullPath
            End If
        End If
    Next
    
End Sub
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192214
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yudzhin,

Чтобы не пропускались "XLS", в самом верху модуля под Option Explicit напиши Option Compare Text
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192274
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinYudzhin,

Чтобы не пропускались "XLS", в самом верху модуля под Option Explicit напиши Option Compare Text
Понял! Помогло.

Огромное спасибо всем за неоценимую помощь!!! Узнал для себя много интересного и нового.
Сегодня же начну переделывать программу. А то меня уже на работе запинали... ;)
Но не прощаюсь! :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192324
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Пиши! На всякий случай вот тебе ссылка на справку формате chm о FileSystemObject. С тех пора, как я узнал про Windows Scripting, больше никогда не пользовался стандартными средствами VBA. :)

Windows Script 5.6 Documentation
http://www.microsoft.com/downloads/en/details.aspx?familyid=01592c48-207d-4be1-8a76-1c4099d7bbb9&displaylang=en

Windows Script 5.7 for Windows XP
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=47809025-d896-482e-a0d6-524e7e844d81&displaylang=en
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192394
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Спасибо. А я по старинке, на Турбо Паскале компилирую ЕХЕ-ник с нужной начинкой. Но возможностей и знаний все равно не хватает!
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192479
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

С FileSystemObject приятно работать. Тем более что если в VBE сделать ссылку на библиотке Microsoft Scripting Runtime, то заработает AutoComplete - будут выпадать все свойства и методы. Удобно! Но можно и late binding с помощью CreateObject, но тогда AutoComplete'a не будет.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192557
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Кстати, небольшое уточнение. Если у тебя есть ещё символ "-" в названии файла, то лучше воспользовацо функцией InStrRev. Она ищет не слева направо, а справа налево. Учитывая, что номера стоят в конце названия файла, и перед этим номер стоит символ "-", то безопаснее будет использовать InStrRev. Итак, итоговая процедура.

Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
Option Explicit
Option Compare Text

Sub CreateNewFiles()

    Dim fd          As FileDialog
    Dim fso         As New FileSystemObject
    Dim aFile       As File
    Dim sMask       As String
    Dim sNumber     As String
    Dim sNewName    As String
    Dim sFileName   As String
    Dim sFullPath   As String
    Dim sExtension  As String
    Dim sSubFolder  As String
    Dim sRootFolder As String
    
    
    
    ' Select target folder.
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    
    ' If user selected nothing, exit sub.
    If fd.Show = False Then Exit Sub
    
    ' Get root folder path.
    sRootFolder = fd.SelectedItems( 1 )
    
    ' Define mask.
    sMask = "Набор-*"
    
    ' Create new sub-folder. It will be located in the root folder.
    ' Create path to sub-folder.
    sSubFolder = sRootFolder & "\NewFiles"
    
    ' If sub-folder already exists, delete it.
    If fso.FolderExists(sSubFolder) Then fso.DeleteFolder sSubFolder, True
    
    ' Create sub-folder.
    fso.CreateFolder sSubFolder
    
    
    ' Process each and every file.
    For Each aFile In fso.GetFolder(sRootFolder).Files
        
        ' Get file extension.
        sExtension = fso.GetExtensionName(aFile.Name)
        
        ' If it's an Excel file, process it further.
        If sExtension Like "xls*" Then
            
            ' Get file name without extension.
            sFileName = fso.GetBaseName(aFile.Name)
            
            ' Check whether file name matches mask.
            If sFileName Like sMask Then
                
                ' Get number.
                ' InStrRev searches for "-" from right to left.
                sNumber = Right$(sFileName, Len(sFileName) - InStrRev(sFileName, "-"))
                
                ' Create new Excel file name.
                sNewName = "Итог-" & sNumber
                                
                ' Create full path to new Excel file.
                sFullPath = sSubFolder & "\" & sNewName & "." & sExtension
                
                ' Copy original file to sub-folder.
                aFile.Copy sFullPath
                
            End If
            
        End If
        
    Next
    
End Sub
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192628
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Работать с FileSystemObject интересно. Посмотрел справочник - свойств много! Надо будет взять на вооружение.
Жалко, что не поддерживает доступ к двоичным файлам. Иногда бывает надо.
А как легко текст набивать, типа:
Код: plaintext
1.
2.
3.
4.
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("This is a test.")
a.Close
А с функцией InStrRev я знаком, использовал. Но таких тонкостей не знал... И код короче с ней.

Ещё раз огромное спасибо!
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37192799
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

А зачем ты используешь CreateObject? Нет, ну если ты будешь писать на VBScript, то я согласен. В VBScript - это единственный способ, а вот в VBA ты потеряешь AutoComplete! Лучше сделай в VBE ссылку на библиотеку - и увидишь все свойства и методы. Так проще, чем рыться в справке, да и можешь ошибицо при наборе. :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37193938
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

А как применять fso.OpenTextFile?
Пытался открыть файл так:
Код: plaintext
fso.OpenTextFile(aFile.Name)
или
Код: plaintext
fso.OpenTextFile(aFile)
ничего не получилось - ни ошибки, ни сообщения...
Использование
Код: plaintext
Workbooks.Open aFile
сработало как всегда.
Хотелось бы понять , что что же все-таки делает fso.OpenTextFile, как и когда его применять?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37194050
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Читаем текстовый файл и выводим содержимое на экран.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Sub ReadTextFile()

    Dim msg As String
    Dim sFile As String
    Dim txtStream As TextStream
    Dim fso As New FileSystemObject
    
    sFile = "c:\shut down.txt"
    
    Set txtStream = fso.OpenTextFile(sFile, ForReading)
    
    msg = txtStream.ReadAll
    
    MsgBox msg

End Sub
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37194103
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Попробовал. Интересный результат. Очень короткий код получается!
Обычно через цикл последовательно читаешь строки текстового файла... А тут в одну строку кода! Красота!
А вот использовать fso.OpenTextFile через Set я бы не догадался. :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37194169
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Если хочешь читать построчно, тогда вот код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Sub ReadTextFileLineByLine()

    Dim i As Integer
    Dim msg As String
    Dim sFile As String
    Dim sLine As Variant
    Dim arr As Variant
    Dim txtStream As TextStream
    Dim fso As New FileSystemObject
        
    sFile = "c:\shut down.txt"
    Set txtStream = fso.OpenTextFile(sFile, ForReading)
    arr = Split(txtStream.ReadAll, vbNewLine)

    For i = LBound(arr) To UBound(arr)
        msg = msg & arr(i) & vbNewLine
    Next
    
    MsgBox msg

End Sub

Alex37"А вот использовать fso.OpenTextFile через Set я бы не догадался."
И почему же? OpenTextFile возвращает TextStream, объект. А что присвоить объект переменной, нужно использование Set. :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197437
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

Кстати, небольшое уточнение. Если у тебя есть ещё символ "-" в названии файла, то лучше воспользовацо функцией InStrRev. Она ищет не слева направо, а справа налево. Учитывая, что номера стоят в конце названия файла, и перед этим номер стоит символ "-", то безопаснее будет использовать InStrRev. Итак, итоговая процедура.

Код: plaintext
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
Option Explicit
Option Compare Text

Sub CreateNewFiles()

    Dim fd          As FileDialog
    Dim fso         As New FileSystemObject
    Dim aFile       As File
    Dim sMask       As String
    Dim sNumber     As String
    Dim sNewName    As String
    Dim sFileName   As String
    Dim sFullPath   As String
    Dim sExtension  As String
    Dim sSubFolder  As String
    Dim sRootFolder As String
    
    ' Select target folder.
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    
    ' If user selected nothing, exit sub.
    If fd.Show = False Then Exit Sub
    
    ' Get root folder path.
    sRootFolder = fd.SelectedItems( 1 )
    
    ' Define mask.
    sMask = "Набор-*"
    
    ' Create new sub-folder. It will be located in the root folder.
    ' Create path to sub-folder.
    sSubFolder = sRootFolder & "\NewFiles"
    
    ' If sub-folder already exists, delete it.
    If fso.FolderExists(sSubFolder) Then fso.DeleteFolder sSubFolder, True
    
    ' Create sub-folder.
    fso.CreateFolder sSubFolder
    
    
    ' Process each and every file.
    For Each aFile In fso.GetFolder(sRootFolder).Files
        
        ' Get file extension.
        sExtension = fso.GetExtensionName(aFile.Name)
        
        ' If it's an Excel file, process it further.
        If sExtension Like "xls*" Then
            
            ' Get file name without extension.
            sFileName = fso.GetBaseName(aFile.Name)
            
            ' Check whether file name matches mask.
            If sFileName Like sMask Then
                
                ' Get number.
                ' InStrRev searches for "-" from right to left.
                sNumber = Right$(sFileName, Len(sFileName) - InStrRev(sFileName, "-"))
                
                ' Create new Excel file name.
                sNewName = "Итог-" & sNumber
                                
                ' Create full path to new Excel file.
                sFullPath = sSubFolder & "\" & sNewName & "." & sExtension
                
                ' Copy original file to sub-folder.
                aFile.Copy sFullPath
                
            End If
            
        End If
        
    Next
    
End Sub

Подскажите, как правильно присвоить переменной SET ссылку на рабочую страницу для aFile ?
Делал так:
.....
Dim parName As String
Dim parFullName As String
Dim PagePar As Object
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
parFullName = aFile
parName = Dir(parFullName)
Set PagePar = Workbooks(parName).Sheets("Page1")

на последней строке выдает ошибку:
Run-time error 9
Subscript out of range
Не пойму, что не так?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197479
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточню вопрос:
Как правильно присвоить переменной PagePar ссылку на рабочую страницу для aFile?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197486
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37Подскажите, как правильно присвоить переменной SET ссылку на рабочую страницу для aFile ?
Делал так:
.....
Dim parName As String
Dim parFullName As String
Dim PagePar As Object
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
parFullName = aFile
parName = Dir(parFullName)
Set PagePar = Workbooks(parName).Sheets("Page1")

на последней строке выдает ошибку:
Run-time error 9
Subscript out of range
Не пойму, что не так?

1. Ты присваиваешь перемменной типа String переменную типа File:
Код: plaintext
1.
2.
Dim parFullName As String
parFullName = aFile

В цикле
Код: plaintext
1.
For Each aFile In fso.GetFolder(sRootFolder).Files
aFile - переменная типа File, а ты её фугуешь в String. Поэтому после parFullName = aFile у тебя всё поехало не туда. Надо тогда вот так:
Код: plaintext
1.
parFullName = aFile.Name

2. Объяви переменную PagePar как Worksheet. Зачем Object???
Код: plaintext
1.
Dim PagePar As Worksheet
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197525
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

С пунктом 1 ответа - в челом теперь понятно.

А вот с п.2 - вообще запутался!
Как же тогда будет выглядеть строка
Set PagePar = ?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197583
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Зачем тебе функция Dir? Ты же в цикле уже забрал все файлы. Свойство Name возвращает только имя файла с расширением, а функция Path - полный путь. Я так понял, ты хочешь сослаться на лист в экселевском файле. Тогда тебе его надо будет открыть сначала, а потом делать ссылку. Где-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim wkb As Workbook
Dim parFullName As String
Dim PagePar As Worksheet
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    parFullName = aFile.Path
    Set wkb = Workbooks.Open(parFullName)
    Set PagePar = wkb.Sheets("Page1")
...
   ' После всех обработок:
   ' Всегда указывай параметр SaveChanges.
   ' Если ты не будешь ничего там сохранять - ставь False, иначе - True.
   wkb.Close SaveChanges:=False
   Set wkb = Nothing

...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197621
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Ты как в мой монитор смотришь! ;) Правильно догадался о моей задаче... Что значит опыт.
Огромное спасибо - сработало!!!
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197625
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

И открывает файлы, закрывает. Это для меня новый метод - раньше несколько по другому всё это делал. Чесно говоря, болше по размеру получалось. Ещё раз огромное спасибо!!!
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197674
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Да не за что! :) Пиши, если что! :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197741
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Кстати, можно сделать код на строчку короче, если учесть, что метод Workbooks.Open возвращает объект Workbook. Тогда вместо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim wkb As Workbook
Dim parFullName As String
Dim PagePar As Worksheet
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    parFullName = aFile.Path
    Set wkb = Workbooks.Open(parFullName)
    Set PagePar = wkb.Sheets("Page1")

можно написать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim parFullName As String
Dim PagePar As Worksheet
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    parFullName = aFile.Path
    Set PagePar = Workbooks.Open(parFullName).Sheets("Page1")

На одну строчку короче! :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197821
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Тогда уж на 2 строки короче - в описании (1- в шапке) и в теле цикла ещё -1.
Спасибо за подсказку! ;)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37197902
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

А вот ещё короче. :)
Код: plaintext
1.
2.
3.
4.
5.
Dim PagePar As Worksheet
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    Set PagePar = Workbooks.Open(aFile.Path).Sheets("Page1")
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198014
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

А вот ещё короче. :)
Код: plaintext
1.
2.
3.
4.
5.
Dim PagePar As Worksheet
....
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    Set PagePar = Workbooks.Open(aFile.Path).Sheets("Page1")

Да, здорово - короче уже некуда. :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198117
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Можно ещё короче!

Код: plaintext
1.
2.
3.
4.
5.
6.
For Each aFile In fso.GetFolder(sRootFolder).Files
...
    With Workbooks.Open(aFile.Path).Sheets("Page1")
    ...
    End With
...

:D
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198309
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Да, нет границ в вариантности. ;)
Но с записями слабо знаком, небыло необходимоти как-то...

А как проще проверить, есть ли данные в текущей строке листа Excel?

Смотрю на имеющиеся XLS-файлы с данными (из которых я отбираю нужные мне данные чтобы запихать их в итоговые файлы) и балдею - после одной строки с данными может быть 3-8 пустых строк, далее строка с данными и опять несколько пустых и т.д.
Думаю в цикле проверять нужные ячейки, оператором If и если равно ""
пропускаю строку
нет - обрабатываю
Опять же, неизвестно заранее, сколько строк всего в документе.
Считать сколько пустых строк подряд идут? Типа, больше 100, то документ точно кончился!
Должна быть какая-то хитрость! :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198397
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Ты скажи конкретно, какой критерий "пустоты". Можно искать пустые ячейки в цикле по конкретному столбцу (например, "B" - в этом случае за один цикл проверятеся одна ячейка) или же ты хочешь проверить несколько ячеек в данной строке?
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198420
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Данные расположены в столбцах 3 5 8 11 15
Проверять достаточно по одному, любому столбцу - если есть в этом столбце, то и в других столбцах данной стоки данные точно будут.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198432
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Посмотрел как люди делают, используя For Each...
Правда найденный пример - не мой случай, но идея есть этот оператор приспособить, если получится.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198595
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Для твоего случая нужно использовать For...Next, и насколько я понимаю, нижнюю границу цикла ты определить динамически не сможешь. Тогда задавай вручную - приблизительно прикидываешь, какой максимально может быть граница, и прибавляешь ещё пару десяток строк для пущей уверенности. :) Например, так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub ForNextLoop()

    Dim i As Long
    
    For i =  1  To  100 
       ' Мы нашли, что ячейка непуста => содержит данные.
       ' Вместо Cells(i, "C") можно написать Cells(i, 3).
        If Not IsEmpty(Cells(i, "C")) Then
            ' Обработка.
        End If
    Next

End Sub
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198697
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37Думаю в цикле проверять нужные ячейки, оператором If и если равно ""

Это типичная ошибка на проверку пустых ячеек. Поясняю на примере.

Вот, у тебя в ячейке C1 стоит формула =ЕСЛИ(A1>10;5;"") . Тогда, согласно формуле, если в ячейку A1 поставить 4, то в ячейке C1 ничего не будет показано, так как мы задали "" - пустоту. НО! Это НЕ ПУСТАЯ ячейка, потому что в ней текст (формула), и, следовательно, твоя проверка в VBA:
Код: plaintext
1.
If Range("C1")=""...
вернёт FALSE! Но ты будешь усиленно доказывать, что должно быть TRUE! :)

Вывод: для проверки пустых ячеек ВСЕГДА используй VBA функцию IsEmpty.
Небольшой секрет: если ты в модуле наберёшь VBA и нажмёшь точку, то выпадут все функции, которые есть в VBA. Только никому не говори! :)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198790
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37,

Для твоего случая нужно использовать For...Next, и насколько я понимаю, нижнюю границу цикла ты определить динамически не сможешь. Тогда задавай вручную - приблизительно прикидываешь, какой максимально может быть граница, и прибавляешь ещё пару десяток строк для пущей уверенности. :) Например, так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub ForNextLoop()

    Dim i As Long
    
    For i =  1  To  100 
       ' Мы нашли, что ячейка непуста => содержит данные.
       ' Вместо Cells(i, "C") можно написать Cells(i, 3).
        If Not IsEmpty(Cells(i, "C")) Then
            ' Обработка.
        End If
    Next

End Sub

Спасибо. Я примерно так и делал, но как уже писал выше проверку делал так:
Код: plaintext
1.
2.
        If (Cells(i, "C"))<>"" Then
            ' Обработка.
        End If
Но возьму на вооружение твой совет.
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37198806
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YudzhinAlex37Думаю в цикле проверять нужные ячейки, оператором If и если равно ""

Это типичная ошибка на проверку пустых ячеек. Поясняю на примере.

Вот, у тебя в ячейке C1 стоит формула =ЕСЛИ(A1>10;5;"") . Тогда, согласно формуле, если в ячейку A1 поставить 4, то в ячейке C1 ничего не будет показано, так как мы задали "" - пустоту. НО! Это НЕ ПУСТАЯ ячейка, потому что в ней текст (формула), и, следовательно, твоя проверка в VBA:
Код: plaintext
1.
If Range("C1")=""...
вернёт FALSE! Но ты будешь усиленно доказывать, что должно быть TRUE! :)

Вывод: для проверки пустых ячеек ВСЕГДА используй VBA функцию IsEmpty.
Небольшой секрет: если ты в модуле наберёшь VBA и нажмёшь точку, то выпадут все функции, которые есть в VBA. Только никому не говори! :)
В обрабатываемых документах только данные содержатся, никаких формул, поэтому и решил делать проверку, как указал выше. Да и не знал про функцию IsEmpty. Теперь - знаю, спасибо! ;)
VBA c точкой, про такое не знал. :) Если без бумажных справочников - то незаменимо. Все же ХЕЛР мне в 2003 офисе не очень нравится. В 97-м был неплох...
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37201587
Alex37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yudzhin,

Хотел персонально поблагодарить тебя за оказанную помощь! А так же спасибо всем, принимавших участие в этой беседе.
Узнал много нового для себя, взял на вооружение.

Программа готова, сдана на тестирование в производственный отдел. Все работает отлично! Ура, товарищи!!! Или господа?!
Нужное подчеркнуть. ;)
...
Рейтинг: 0 / 0
Диалог- "Открыть файл"
    #37201600
Yudzhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex37,

Вернее, товарищъ! :) Очень рад! :) Если производственный отдел будет говорить, что программа плохо работает, то скажи, что на sql.ru отвечают только профессионалы! :D
...
Рейтинг: 0 / 0
50 сообщений из 50, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диалог- "Открыть файл"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]