powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диалог- "Открыть файл"
25 сообщений из 50, страница 2 из 2
Диалог- "Открыть файл"
    #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
25 сообщений из 50, страница 2 из 2
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Диалог- "Открыть файл"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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