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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.11.2008, 15:08   #1
Bu$ter
Пользователь
 
Аватар для Bu$ter
 
Регистрация: 16.05.2008
Сообщений: 73
По умолчанию Выполнение макроса во всех листах

Народ, приветствую!
Подскажите как организовать выполнение макроса во всех листах книги

Пытался через

Код:
For Each iList In Worksheets
i = i + 1

Макрос

Next
Не выходит...
Bu$ter вне форума
Старый 12.11.2008, 15:21   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    Dim sh As Worksheet
    For Each sh In Worksheets
        'работаем с объектом sh типа "Рабочий лист"
        sh.Cells(1) = sh.Name
    Next
End Sub
EducatedFool вне форума
Старый 12.11.2008, 15:28   #3
StasSv
Пользователь
 
Регистрация: 29.12.2007
Сообщений: 71
По умолчанию

Sub Макрос2()
Dim i As Variant
For i = 1 To 3
Worksheets(i).Select
Макрос3
Next i
End Sub
StasSv вне форума
Старый 12.11.2008, 16:33   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию 2 StasSv

а если в книге 2 листа?
при i = 3, макрос вывалится с ошибкой Run Time Error9 на строке Worksheets(i).Select

а если в книге 4 листа? (4-й лист окажется за циклом) код переписывать?

увы, это не решение задачи...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 12.11.2008, 16:52   #5
Bu$ter
Пользователь
 
Аватар для Bu$ter
 
Регистрация: 16.05.2008
Сообщений: 73
По умолчанию

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

Подскажите как решить...
Вложения
Тип файла: rar ЦЕНЫ.rar (246.6 Кб, 41 просмотров)
Bu$ter вне форума
Старый 12.11.2008, 18:38   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Такие есть предлжения:

1) или в теле цикла по листам (For Each sh In Worksheets...) следующей строчкой написать sh.Activate
2) или везде, в теле цикла перед всякий упоминанием ячеек (Range, Cells и пр.) писать "sh."
например,
было: Range("A3").Select
надо: sh.Range("A3").Select

было:Cells(ActiveCell.Row, ActiveCell.Column).Offset(1, 0).Select
надо:sh.Cells(sh.ActiveCell.Row, sh.ActiveCell.Column).Offset(1, 0).Select

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

удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 13.11.2008, 04:06   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Кусок кода из файла:
Код:
    With Application.FileDialog(msoFileDialogOpen)   'только для MS Excel XP и старше
        .InitialFileName = "\\Servak\common\почта\Брайко\Конкуренты"
        .FilterIndex = 3: .AllowMultiSelect = False
        If .Show = -1 Then Fi = .SelectedItems(1) Else Exit Sub
    End With

    Workbooks.Open (Fi), UpdateLinks:=0
    namess = ActiveWorkbook.Name
    A = GetDateFromFileName(ActiveWorkbook.Name)    'вставить дату из имени скидочной таблицы (полной)

    For Each sh In Worksheets

        ThisWorkbook.Activate
' и т.д.
Зачем нужно открывать файл строкой Workbooks.Open (Fi), UpdateLinks:=0, если Вам нужно только его имя?

Сразу пишите A = GetDateFromFileName(Fi)
А команду Workbooks.Open Fi поставьте в код в том месте, где нужны будут данные из листов этого файла.

Кроме того, код
Код:
ThisWorkbook.Activate
        Worksheets(1).Select

        Range("A3").Select
        Selection.End(xlDown).Select
        Cells(ActiveCell.Row, ActiveCell.Column).Offset(1, 0).Select
        Rows(ActiveCell.EntireRow.Address).Select
        Selection.Insert Shift:=xlDown
        Range("A3").Select
        Selection.End(xlDown).Select
        Range(Cells(ActiveCell.Row, ActiveCell.Column), Cells(ActiveCell.Row, ActiveCell.Column).Offset(0, 1)).Select
        Selection.Copy

        Cells(ActiveCell.Row, ActiveCell.Column).Offset(1, 0).Select
        ActiveSheet.Paste
        Application.CutCopyMode = False

        Cells(ActiveCell.Row, ActiveCell.Column).Offset(0, 2).Select    ' вставка месяца из скидочной
        ActiveCell.Value = IIf(IsDate(A), LCase(Format(CDate(A), "mmmm")), "")

        Cells(ActiveCell.Row, ActiveCell.Column).Offset(0, 1).Select  ' вставка даты из скидочной
        ActiveCell.Value = IIf(IsDate(A), Format(CDate(A), "dd"), "")
можно заменить на

Код:
Range("a3").End(xlDown).Offset(1).EntireRow.Insert xlShiftUp, xlFormatFromLeftOrAbove    ' вставляем строку

    With Range("a3").End(xlDown).Offset(1)    ' ссылается на 1 ячейку созданной строки
        .Offset(0, 0) = .Offset(-1, 0)    ' копируем значения в первом столбце
        .Offset(0, 1) = .Offset(-1, 1)    ' копируем значения во втором столбце
        If IsDate(A) Then
            .Offset(0, 2) = LCase(Format(CDate(A), "mmmm"))
            .Offset(0, 3) = Format(CDate(A), "d")
        End If
    End With
так будет работать побыстрее...


Далее следует код
For j = 1 To 14 'заполнение дат составления скидочной таблицы
......................
Next j

логика работы которого мне не совсем понятна...

Особенно часть For i = 1 To 2: Selection.End(xlDown).Select: Next i

Если объясните, что должен делать код, тогда и станет возможным его корректировать.

Пока же, я толком и не понял, следует перебирать листы этого файла (thisworkbook), или только что открытого (activeworkbook)...

В итоге будет что-то вроде такого:

Код:
Sub заполнение_2()
    Dim sh As Worksheet
    Application.DisplayAlerts = False: Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogOpen)   'только для MS Excel XP и старше
        .InitialFileName = "\\Servak\common\почта\Брайко\Конкуренты"
        .FilterIndex = 3: .AllowMultiSelect = False
        If .Show = -1 Then Fi = .SelectedItems(1) Else Exit Sub
    End With

    '    Workbooks.Open (Fi), UpdateLinks:=0
    '    namess = ActiveWorkbook.Name
    '    A = GetDateFromFileName(ActiveWorkbook.Name)    'вставить дату из имени скидочной таблицы (полной)

    A = GetDateFromFileName(Fi)

    For Each sh In ThisWorkbook.Worksheets
        sh.Range("a3").End(xlDown).Offset(1).EntireRow.Insert xlShiftUp, xlFormatFromLeftOrAbove     ' вставляем строку

        With sh.Range("a3").End(xlDown).Offset(1)     ' ссылается на 1 ячейку созданной строки
            .Offset(0, 0) = .Offset(-1, 0)    ' копируем значения в первом столбце
            .Offset(0, 1) = .Offset(-1, 1)    ' копируем значения во втором столбце
            If IsDate(A) Then
                .Offset(0, 2) = LCase(Format(CDate(A), "mmmm"))
                .Offset(0, 3) = Format(CDate(A), "d")
            End If
        End With

        For j = 1 To 14    'заполнение дат составления скидочной таблицы
            ' что тут делать, я не понял
        Next j
    Next sh
End Sub
EducatedFool вне форума
Старый 13.11.2008, 11:30   #8
valerij
Старожил
 
Аватар для valerij
 
Регистрация: 12.05.2007
Сообщений: 2,339
По умолчанию

Цитата:
Сообщение от Bu$ter Посмотреть сообщение
Подскажите как организовать выполнение макроса во всех листах книги
У меня это организовано, так:
Код:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
   Select Case Sh.Index
        Case 1 To 13 ' Количество Листов
 With Application
         .EnableEvents = False
'******************* Мой код *************
        .EnableEvents = True
    End With
   End Select
End Sub

Последний раз редактировалось valerij; 13.11.2008 в 11:35.
valerij вне форума
Старый 13.11.2008, 11:37   #9
Bu$ter
Пользователь
 
Аватар для Bu$ter
 
Регистрация: 16.05.2008
Сообщений: 73
По умолчанию

Sub test()

Dim sh As Worksheet


For Each sh In ThisWorkbook.Worksheets

Range("d3").Value = "ТЕСТ"


Next sh

End Sub


Пытаюсь протеститровать этот код... но он НЕ выполняется НА ВСЕХ СТРАНИЦАХ, а только на первой, и на этом цикл прекращается...
Bu$ter вне форума
Старый 13.11.2008, 11:37   #10
Bu$ter
Пользователь
 
Аватар для Bu$ter
 
Регистрация: 16.05.2008
Сообщений: 73
По умолчанию

Код:
Sub test()

Dim sh As Worksheet


For Each sh In ThisWorkbook.Worksheets

Range("d3").Value = "ТЕСТ"


Next sh

End Sub

Пытаюсь протеститровать этот код... но он НЕ выполняется НА ВСЕХ СТРАНИЦАХ, а только на первой, и на этом цикл прекращается...
Bu$ter вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Help! Как проверить наличие "рисунков" в листах книги? Bezdar Microsoft Office Excel 4 15.08.2008 15:09
Выполнение функции nikleb JavaScript, Ajax 7 10.08.2008 01:49
image. печать большого изображения на нескольких листах OLEG'arh Общие вопросы Delphi 1 20.06.2008 13:06
Суммесли и диапазоны на листах _ДЭН_78 Microsoft Office Excel 1 18.09.2007 15:38
Одна "шапка" на всех листах Noor Microsoft Office Excel 2 30.07.2007 15:39