Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2009, 15:39   #1
KNatalia
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 66
По умолчанию Как заставить код работать во всех книгах указанной папки

Всем привет!
Подскажите, пожалуйста, что не так!
Мне нужно, чтобы один и тот же макрос выполнялся во всех книгах в одной папке одновременно.
Сам макрос расположен в файле МАКРОС. Макрос выполняет суммирование по облигациям рыночной стоимости и НКД.

Код:


Sub Auto_Whrite_In_Books()
Dim sFolder As String, sFiles As String, li As Long
With Application.FileDialog(msoFileDialo gFolderPicker)
If .Show = False Then Exit Sub
sFolder = .SelectedItems(1)
End With
Application.ScreenUpdating = False
sFiles = Dir(sFolder & Application.PathSeparator & "*.xlsx")
Do While sFiles <> ""
Workbooks.Open sFiles

Dim i As Double, n As Double
For i = ActiveWorkbook.Sheets(1).Cells.Find ("Облигации").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find ("Итого Облигации предприятий:").Row - 1
For n = ActiveWorkbook.Sheets(1).Cells.Find ("% по облигациям").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find ("Итого % по облигациям:").Row - 1
If Mid(Cells(n, 1), InStr(Cells(n, 1), "№")) & "; " = Mid(Cells(i, 1), InStr(Cells(i, 1), "№")) Then
Cells(i, 29) = Cells(i, 29) + Cells(n, 29)
Cells(i, 29).NoteText "= A" & i & "+ A" & n & ""
Exit For
End If: Next: Next:


ActiveWorkbook.Close True
sFiles = Dir
Loop
Application.ScreenUpdating = True
End Sub


ПОДСКАЖИТЕ, что не так?
ОШИБОК НЕТ, НО И НЕ РАБОТАЕТ!

Заранее большое спасибо
Вложения
Тип файла: rar Копия пример.rar (36.6 Кб, 17 просмотров)
KNatalia вне форума Ответить с цитированием
Старый 06.11.2009, 15:53   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Вот так будет работать:
Код:

Sub Auto_Write_In_Books()
    Dim sFolder As String, sFiles As String, li As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & Application.PathSeparator & "*.xls*")
    On Error Resume Next
    Do While sFiles <> ""
        Workbooks.Open sFiles

        Dim i As Double, n As Double
        For i = ActiveWorkbook.Sheets(1).Cells.Find("Облигации").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find("Итого Облигации предприятий:").Row - 1
            For n = ActiveWorkbook.Sheets(1).Cells.Find("% по облигациям").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find("Итого % по облигациям:").Row - 1
                If Mid(Cells(n, 1), InStr(Cells(n, 1), "№")) & "; " = Mid(Cells(i, 1), InStr(Cells(i, 1), "№")) Then
                    Cells(i, 29) = Cells(i, 29) + Cells(n, 29)
                    Cells(i, 29).NoteText "= A" & i & "+ A" & n & ""
                    Exit For
                End If: Next: Next:
        ActiveWorkbook.Close True
        sFiles = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
Раньше макрос искал только файлы Excel 2007:
sFiles = Dir(sFolder & Application.PathSeparator & "*.xlsx")
EducatedFool вне форума Ответить с цитированием
Старый 06.11.2009, 16:02   #3
KNatalia
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 66
По умолчанию

Спасибо большое!
Только теперь он ошибку пишет:
Invalide procedure call or argument в строчке

If Mid(Cells(n, 1), InStr(Cells(n, 1), "№")) & "; " = Mid(Cells(i, 1), InStr(Cells(i, 1), "№")) Then
KNatalia вне форума Ответить с цитированием
Старый 06.11.2009, 16:11   #4
KNatalia
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 66
По умолчанию

Правда ошибка выдается только для одного файла ПИ_TIP
Если его удалить из папки, то макрос работает!

В чем проблема с данным файлом?
KNatalia вне форума Ответить с цитированием
Старый 06.11.2009, 16:14   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
В чем проблема с данным файлом?
Вы не заметили, что я в код макроса добавил ещё одну строку: On Error Resume Next ?

Ошибку вызывает эта часть кода:
Код:
Mid(Cells(i, 1), InStr(Cells(i, 1), "№"))
В одной из ячеек нет символа
Соответственно, InStr(Cells(i, 1), "№") возвращает 0
А функция Mid не может считать текст, начиная с нулевой позиции...
EducatedFool вне форума Ответить с цитированием
Старый 06.11.2009, 17:48   #6
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Наталья.
Код вполне работоспособный
Код:
Sub Auto_Whrite_In_Books()
Const s1 = "Облигации", s2 = "Итого Облигации предприятий:"
Const s3 = "% по облигациям", s4 = "Итого % по облигациям:"
Dim sFolder$, sFiles$, li&, oWB As Workbook
With Application.FileDialog(msoFileDialogFolderPicker)
    If .Show = False Then Exit Sub
    sFolder = .SelectedItems(1)
End With
Application.ScreenUpdating = False
On Error Resume Next
sFiles = Dir(sFolder + "\*.xls") '+ "\*.xlsx" 'выложенные Вами файлы, формата Е 2003
Do While Len(sFiles) > 0
    If Not ThisWorkbook.Name = sFiles Then 
    'если не выполнять эту проверку в случае если обращаться к папке с файлом
    ' МАКРОС.xls, произойдет попытка повторного открытия файла - выполнение процедуры прервется
        Set oWB = Workbooks.Open(sFiles)
        Dim i#, n#, j#, q#, k#, f#
        With oWB
            With .Sheets(1).Cells
                j = .Find(s1).Row
                q = .Find(s2).Row
                k = .Find(s3).Row
                f = .Find(s4).Row
            End With
            If Not j * q * k * f = 0 Then ' стоит проверить всё ли найдено
                For i = j + 1 To q - 1
                    For n = k + 1 To f - 1
                        'здесь код которого я не понимаю
                        'Cells(i, 29) = Cells(i, 29) + Cells(n, 29)
                        'такой способ "накопления" не корректен
                        'т.к. зависит от кол-ва выполнений процедуры
                    ' End If
                    Next
                Next
            End If
        End With
        oWB.Close True
    End If
    sFiles = Dir()
Loop
Application.ScreenUpdating = True
End Sub
но позволю себе сделать пару рекомендаций:
Вынос текста в константы не только уменьшает нагрузку кода избавляя от необходимости неоднократной интерпретации, но и делает код более удобочитаемым.
Использование переменных для однократного присвоения значения объекта лучше чем многократное обращение к объекту - "For i = ActiveWorkbook.Sheets(1).Cells" в цикле.
Евгений.
P.S. код заключенный в тэги [соde] ... [/соde] будет тоже "более удобочитаемым".

Последний раз редактировалось Teslenko_EA; 06.11.2009 в 18:01.
Teslenko_EA вне форума Ответить с цитированием
Старый 06.11.2009, 23:13   #7
KNatalia
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 66
По умолчанию

Огромное Вам всем спасибо за помощь, за разъяснения и подсказки!
Очень многому меня научили!

С самыми наилучшими пожеланиями, Наталья
KNatalia вне форума Ответить с цитированием
Старый 07.07.2010, 14:17   #8
1134
Пользователь
 
Аватар для 1134
 
Регистрация: 20.01.2010
Сообщений: 53
По умолчанию

Классно, отличная тема!

Последний раз редактировалось 1134; 08.07.2010 в 13:21. Причина: Решил проблему сам :)
1134 вне форума Ответить с цитированием
Старый 24.12.2012, 17:36   #9
ertree
Новичок
Джуниор
 
Регистрация: 24.12.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Вот так будет работать:
Код:

Sub Auto_Write_In_Books()
    Dim sFolder As String, sFiles As String, li As Long
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = False Then Exit Sub
        sFolder = .SelectedItems(1)
    End With
    Application.ScreenUpdating = False
    sFiles = Dir(sFolder & Application.PathSeparator & "*.xls*")
    On Error Resume Next
    Do While sFiles <> ""
        Workbooks.Open sFiles

        Dim i As Double, n As Double
        For i = ActiveWorkbook.Sheets(1).Cells.Find("Облигации").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find("Итого Облигации предприятий:").Row - 1
            For n = ActiveWorkbook.Sheets(1).Cells.Find("% по облигациям").Row + 1 To ActiveWorkbook.Sheets(1).Cells.Find("Итого % по облигациям:").Row - 1
                If Mid(Cells(n, 1), InStr(Cells(n, 1), "№")) & "; " = Mid(Cells(i, 1), InStr(Cells(i, 1), "№")) Then
                    Cells(i, 29) = Cells(i, 29) + Cells(n, 29)
                    Cells(i, 29).NoteText "= A" & i & "+ A" & n & ""
                    Exit For
                End If: Next: Next:
        ActiveWorkbook.Close True
        sFiles = Dir
    Loop
    Application.ScreenUpdating = True
End Sub
Раньше макрос искал только файлы Excel 2007:
sFiles = Dir(sFolder & Application.PathSeparator & "*.xlsx")
Перестал работать код по применению кода к файлам папки в виндовс 7. Кто-нибудь сталкивался с такой проблемой? Как можно решить?
ertree вне форума Ответить с цитированием
Старый 24.12.2012, 18:59   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

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

В чем проявляется проблема?
Выскакивает ошибка? Если да, то на какой строке?
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в указанной директории узнать названия всех папок evgenrpo Общие вопросы C/C++ 5 08.06.2009 14:20
Как заставить работать CheckBox? ridmal Microsoft Office Word 1 21.05.2009 09:47
Как вывести название папок из указанной папки? zotox Помощь студентам 1 01.05.2009 14:37
Как заставить работать php? yourself Помощь студентам 9 20.05.2008 08:08
Как заставить работать dll ? Volkogriz Общие вопросы Delphi 10 13.12.2007 10:24