Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Цель: Выполнить макрос на всех листах кроме первого - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цель: Выполнить макрос на всех листах кроме первого (Макросы Sub)
Цель: Выполнить макрос на всех листах кроме первого
lakmus_x Дата: Среда, 14.08.2013, 11:34 | Сообщение № 1
Группа: Гости
Всем привет, есть книга и 30 листов. Есть код, записанный в "ЭтаКнига", он срабатывает каждый раз при изменении определенного диапазона ячеек в листе. Но нужно, чтоб он срабатывал на всех листах кроме первого, причем имя первого все время может меняться. Это главное условие. Макрос изменяет заливку ячеек в листах в диапазоне A5:Z60 при вводе 1, 0 или 0,5. Нужно игнорировать первый лист. Как? If Sh.Name = "Лист 1" Then Exit Sub очень просто конечно, но нужно универсальное, потому что имя первого листа всегда разное в разных файлах.
Код:
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A5:Z60") 'задаем диапазон
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then 'если измененяется ячейка в диапазоне KeyCells, то красим в светло-желтый
Application.ScreenUpdating = False:
For Each Cell In KeyCells 'условие для каждой ячейки в диапазоне
If Cell.Value = "0" Then Cell.Interior.ColorIndex = 36 'если равно 0, то красим в светло-желтый
If Cell.Value = 0.5 Then Cell.Interior.ColorIndex = 36 'если равно 0,5, то красим в светло-желтый
If Cell.Value = 1 Then Cell.Interior.ColorIndex = 36 'если равно 1, то красим в светло-желтый
If Cell.Value = "" Then Cell.Interior.ColorIndex = 0 'если пустая, то красим в белый
Next
End If
End Sub
[/vba]
 
Ответить
СообщениеВсем привет, есть книга и 30 листов. Есть код, записанный в "ЭтаКнига", он срабатывает каждый раз при изменении определенного диапазона ячеек в листе. Но нужно, чтоб он срабатывал на всех листах кроме первого, причем имя первого все время может меняться. Это главное условие. Макрос изменяет заливку ячеек в листах в диапазоне A5:Z60 при вводе 1, 0 или 0,5. Нужно игнорировать первый лист. Как? If Sh.Name = "Лист 1" Then Exit Sub очень просто конечно, но нужно универсальное, потому что имя первого листа всегда разное в разных файлах.
Код:
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("A5:Z60") 'задаем диапазон
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then 'если измененяется ячейка в диапазоне KeyCells, то красим в светло-желтый
Application.ScreenUpdating = False:
For Each Cell In KeyCells 'условие для каждой ячейки в диапазоне
If Cell.Value = "0" Then Cell.Interior.ColorIndex = 36 'если равно 0, то красим в светло-желтый
If Cell.Value = 0.5 Then Cell.Interior.ColorIndex = 36 'если равно 0,5, то красим в светло-желтый
If Cell.Value = 1 Then Cell.Interior.ColorIndex = 36 'если равно 1, то красим в светло-желтый
If Cell.Value = "" Then Cell.Interior.ColorIndex = 0 'если пустая, то красим в белый
Next
End If
End Sub
[/vba]

Автор - lakmus_x
Дата добавления - 14.08.2013 в 11:34
SkyPro Дата: Среда, 14.08.2013, 12:24 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Так, кажется, работает.
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range, shRange As Range, rCell As Range
Application.EnableEvents = False
On Error Resume Next
        Set KeyCells = ActiveSheet.Range("A5:Z60")
        Set shRange = Sheets(1).UsedRange
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
If Application.Intersect(shRange, Range(Target.Address)) Is Nothing Then
            For Each rCell In KeyCells
            If rCell.Value = 0 Or rCell.Value = 0.5 Or rCell.Value = 1 _
            Then rCell.Interior.ColorIndex = 36
            If rCell.Value = "" Then rCell.Interior.ColorIndex = 0
            Next
End If
End If
Application.EnableEvents = True
End Sub
[/vba]

Только, думаю, это можно без циклов организовать. Нужно подумать.

Подумал :)
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range, shRange As Range
On Error Resume Next
      Set KeyCells = ActiveSheet.Range("A5:Z60")
      Set shRange = Sheets(1).UsedRange
          If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
          If Application.Intersect(shRange, Range(Target.Address)) Is Nothing Then
              If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
              Then Target.Interior.ColorIndex = 36
              If Target.Value = "" Then Target.Interior.ColorIndex = 0
          End If
          End If
End Sub
[/vba]

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


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Среда, 14.08.2013, 12:38
 
Ответить
СообщениеТак, кажется, работает.
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range, shRange As Range, rCell As Range
Application.EnableEvents = False
On Error Resume Next
        Set KeyCells = ActiveSheet.Range("A5:Z60")
        Set shRange = Sheets(1).UsedRange
If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
If Application.Intersect(shRange, Range(Target.Address)) Is Nothing Then
            For Each rCell In KeyCells
            If rCell.Value = 0 Or rCell.Value = 0.5 Or rCell.Value = 1 _
            Then rCell.Interior.ColorIndex = 36
            If rCell.Value = "" Then rCell.Interior.ColorIndex = 0
            Next
End If
End If
Application.EnableEvents = True
End Sub
[/vba]

Только, думаю, это можно без циклов организовать. Нужно подумать.

Подумал :)
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range, shRange As Range
On Error Resume Next
      Set KeyCells = ActiveSheet.Range("A5:Z60")
      Set shRange = Sheets(1).UsedRange
          If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
          If Application.Intersect(shRange, Range(Target.Address)) Is Nothing Then
              If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
              Then Target.Interior.ColorIndex = 36
              If Target.Value = "" Then Target.Interior.ColorIndex = 0
          End If
          End If
End Sub
[/vba]

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

Автор - SkyPro
Дата добавления - 14.08.2013 в 12:24
Формуляр Дата: Среда, 14.08.2013, 13:46 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
lakmus_x,
есть свойство Sh.codename
Оно не меняется при обычном переименовании листа.


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Среда, 14.08.2013, 13:46
 
Ответить
Сообщениеlakmus_x,
есть свойство Sh.codename
Оно не меняется при обычном переименовании листа.

Автор - Формуляр
Дата добавления - 14.08.2013 в 13:46
Формуляр Дата: Среда, 14.08.2013, 14:03 | Сообщение № 4
Группа: Друзья
Ранг: Ветеран
Сообщений: 832
Репутация: 255 ±
Замечаний: 0% ±

Excel 2003, 2013
нужно, чтоб он срабатывал на всех листах кроме первого, причем имя первого все время может меняться.
Поскольку непонятно, что вы называете первым листом, возможны варианты:
[vba]
Код
if Sh.Index = 1 then exit sub
[/vba]или
[vba]
Код
if Sh.Name = Лист1.Name then exit sub
[/vba]Эксель, я так понимаю, русифицированный.


Excel 2003 EN, 2013 EN

Сообщение отредактировал Формуляр - Среда, 14.08.2013, 14:13
 
Ответить
Сообщение
нужно, чтоб он срабатывал на всех листах кроме первого, причем имя первого все время может меняться.
Поскольку непонятно, что вы называете первым листом, возможны варианты:
[vba]
Код
if Sh.Index = 1 then exit sub
[/vba]или
[vba]
Код
if Sh.Name = Лист1.Name then exit sub
[/vba]Эксель, я так понимаю, русифицированный.

Автор - Формуляр
Дата добавления - 14.08.2013 в 14:03
lakmus_x Дата: Среда, 14.08.2013, 14:57 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
всем спасибо, взял это решение :) добавил второй строчкой и все
[vba]
Код
if Sh.Name = Sheets(1).Name then exit sub
[/vba]
первый лист я имел ввиду по количеству первый, самый первый) слева)
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
If Sh.Name = Sheets(1).Name Then Exit Sub
     Dim KeyCells As Range
     Set KeyCells = Range("A5:Z60")
         If Not Application.Intersect(KeyCells, Range(Target.Address)) _
            Is Nothing Then
             Application.ScreenUpdating = False:
             For Each Cell In KeyCells  
                 If Cell.Value = "0" Then Cell.Interior.ColorIndex = 36
                 If Cell.Value = 0.5 Then Cell.Interior.ColorIndex = 36  
                 If Cell.Value = 1 Then Cell.Interior.ColorIndex = 36
                 If Cell.Value = "" Then Cell.Interior.ColorIndex = 0  
             Next
         End If
End Sub
[/vba]

и еще, пожалуйста, помогите доработать код, голова уже не варит. Как присвоить всем ячейкам листов (кроме первого конечно же, он у нас особенный :) )формат ячеек общий?
и как сделать, чтоб при вводе числа "5" в ячейку в указанном диапазоне A5:Z60 она заменялась на "0,5" и естественно окрашивалась, как уже сейчас работает ?
заранее спасибо
 
Ответить
Сообщениевсем спасибо, взял это решение :) добавил второй строчкой и все
[vba]
Код
if Sh.Name = Sheets(1).Name then exit sub
[/vba]
первый лист я имел ввиду по количеству первый, самый первый) слева)
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
If Sh.Name = Sheets(1).Name Then Exit Sub
     Dim KeyCells As Range
     Set KeyCells = Range("A5:Z60")
         If Not Application.Intersect(KeyCells, Range(Target.Address)) _
            Is Nothing Then
             Application.ScreenUpdating = False:
             For Each Cell In KeyCells  
                 If Cell.Value = "0" Then Cell.Interior.ColorIndex = 36
                 If Cell.Value = 0.5 Then Cell.Interior.ColorIndex = 36  
                 If Cell.Value = 1 Then Cell.Interior.ColorIndex = 36
                 If Cell.Value = "" Then Cell.Interior.ColorIndex = 0  
             Next
         End If
End Sub
[/vba]

и еще, пожалуйста, помогите доработать код, голова уже не варит. Как присвоить всем ячейкам листов (кроме первого конечно же, он у нас особенный :) )формат ячеек общий?
и как сделать, чтоб при вводе числа "5" в ячейку в указанном диапазоне A5:Z60 она заменялась на "0,5" и естественно окрашивалась, как уже сейчас работает ?
заранее спасибо

Автор - lakmus_x
Дата добавления - 14.08.2013 в 14:57
SkyPro Дата: Среда, 14.08.2013, 15:14 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
Попробуйте вот такой макрос (без цикла - не меняет значения, которые были введены до запуска макроса):
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range
If ActiveSheet.Index = 1 Then Exit Sub
           Set KeyCells = ActiveSheet.Range("A5:Z60")
               If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
                  If Target.Value = 5 Then Target.Value = 0.5
                  If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
                   Then Target.Interior.ColorIndex = 36
                   If Target.Value = "" Then Target.Interior.ColorIndex = 0
               End If
End Sub
[/vba]

И еще вот такой(с циклом перебора всех листов кроме первого), на открытие книги (перебирает все листы начиная с второго и меняет значения и форматирование):
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim KeyCells As Range, rCell As Range, i&
For i = 2 To Sheets.Count
              For Each rCell In Sheets(i).Range("A5:Z60")
                  If rCell.Value = 5 Then rCell.Value = 0.5 ' эта часть заменит все 5 на 0.5
                  If rCell.Value = 0 Or rCell.Value = 0.5 Or rCell.Value = 1 _
                  Then rCell.Interior.ColorIndex = 36
                  If rCell.Value = "" Then rCell.Interior.ColorIndex = 0
              Next
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
[/vba]

Изменить формат ячеек всех листов кроме первого на "общий":
[vba]
Код
Sub generalF()
Dim i&
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
End Sub
[/vba]


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Среда, 14.08.2013, 15:36
 
Ответить
СообщениеПопробуйте вот такой макрос (без цикла - не меняет значения, которые были введены до запуска макроса):
[vba]
Код
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
Dim KeyCells As Range
If ActiveSheet.Index = 1 Then Exit Sub
           Set KeyCells = ActiveSheet.Range("A5:Z60")
               If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
                  If Target.Value = 5 Then Target.Value = 0.5
                  If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
                   Then Target.Interior.ColorIndex = 36
                   If Target.Value = "" Then Target.Interior.ColorIndex = 0
               End If
End Sub
[/vba]

И еще вот такой(с циклом перебора всех листов кроме первого), на открытие книги (перебирает все листы начиная с второго и меняет значения и форматирование):
[vba]
Код
Private Sub Workbook_Open()
Application.ScreenUpdating = False
Application.EnableEvents = False
Dim KeyCells As Range, rCell As Range, i&
For i = 2 To Sheets.Count
              For Each rCell In Sheets(i).Range("A5:Z60")
                  If rCell.Value = 5 Then rCell.Value = 0.5 ' эта часть заменит все 5 на 0.5
                  If rCell.Value = 0 Or rCell.Value = 0.5 Or rCell.Value = 1 _
                  Then rCell.Interior.ColorIndex = 36
                  If rCell.Value = "" Then rCell.Interior.ColorIndex = 0
              Next
Next
Application.ScreenUpdating = True
Application.EnableEvents = True
End Sub
[/vba]

Изменить формат ячеек всех листов кроме первого на "общий":
[vba]
Код
Sub generalF()
Dim i&
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
End Sub
[/vba]

Автор - SkyPro
Дата добавления - 14.08.2013 в 15:14
lakmus_x Дата: Четверг, 15.08.2013, 09:01 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
В первом все хорошо, нет перебора ячеек, что дает небольшую задержку при вводе, но при выделении ячеек и удалении значений (например надо выделить несколько значений и удалить значения и естественно чтоб очищалась заливка) то вылетает ошибка "Type mismatch" на строчку
[vba]
Код
If Target.Value = 5 Then Target.Value = 0.5
[/vba]
а этот макрос
[vba]
Код
Sub generalF()
Dim i&
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
End Sub
[/vba]
срабатывает на все листы, и на первый тоже. Но это не беда, вставил его сюда
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
'делаем всем ячейкам на листе формат "общий"
Dim i&
If Sh.Name = Sheets(1).Name Then Exit Sub
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
     Dim KeyCells As Range
If ActiveSheet.Index = 1 Then Exit Sub
         Set KeyCells = ActiveSheet.Range("A5:Z60")
             If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
                 If Target.Value = 5 Then Target.Value = 0.5
                 If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
                 Then Target.Interior.ColorIndex = 36
                 If Target.Value = "" Then Target.Interior.ColorIndex = 0
             End If
End Sub
[/vba]

и отрабатывает свое дело хорошо)
пока последний код меня полностью устраивает, кроме лишь той ошибки, которая вылетает при выделении нескольких значений и удалении значений
 
Ответить
СообщениеВ первом все хорошо, нет перебора ячеек, что дает небольшую задержку при вводе, но при выделении ячеек и удалении значений (например надо выделить несколько значений и удалить значения и естественно чтоб очищалась заливка) то вылетает ошибка "Type mismatch" на строчку
[vba]
Код
If Target.Value = 5 Then Target.Value = 0.5
[/vba]
а этот макрос
[vba]
Код
Sub generalF()
Dim i&
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
End Sub
[/vba]
срабатывает на все листы, и на первый тоже. Но это не беда, вставил его сюда
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ws As Worksheet
'делаем всем ячейкам на листе формат "общий"
Dim i&
If Sh.Name = Sheets(1).Name Then Exit Sub
     For i = 2 To Sheets.Count
         Cells.NumberFormat = "General"
     Next
     Dim KeyCells As Range
If ActiveSheet.Index = 1 Then Exit Sub
         Set KeyCells = ActiveSheet.Range("A5:Z60")
             If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
                 If Target.Value = 5 Then Target.Value = 0.5
                 If Target.Value = 0 Or Target.Value = 0.5 Or Target.Value = 1 _
                 Then Target.Interior.ColorIndex = 36
                 If Target.Value = "" Then Target.Interior.ColorIndex = 0
             End If
End Sub
[/vba]

и отрабатывает свое дело хорошо)
пока последний код меня полностью устраивает, кроме лишь той ошибки, которая вылетает при выделении нескольких значений и удалении значений

Автор - lakmus_x
Дата добавления - 15.08.2013 в 09:01
KuklP Дата: Четверг, 15.08.2013, 09:14 | Сообщение № 8
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
    For i = 2 To Sheets.Count
Cells.NumberFormat = "General"
Next

SkyPro, этот код столько раз отформатирует ячейки на АКТИВНОМ листе, сколько листов в книге -1. Лучше:
[vba]
Код
Sheets(i).Cells.NumberFormat = "General"
[/vba] yes
А еще лучше:
[vba]
Код
Sheets(i).usedrange.NumberFormat = "General"
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Четверг, 15.08.2013, 09:15
 
Ответить
Сообщение
    For i = 2 To Sheets.Count
Cells.NumberFormat = "General"
Next

SkyPro, этот код столько раз отформатирует ячейки на АКТИВНОМ листе, сколько листов в книге -1. Лучше:
[vba]
Код
Sheets(i).Cells.NumberFormat = "General"
[/vba] yes
А еще лучше:
[vba]
Код
Sheets(i).usedrange.NumberFormat = "General"
[/vba]

Автор - KuklP
Дата добавления - 15.08.2013 в 09:14
KuklP Дата: Четверг, 15.08.2013, 09:30 | Сообщение № 9
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
lakmus_x, а Вы белиберды понаписали. Попробуйте:
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      Dim c As Range
      If Sh.Index = 1 Then Exit Sub
      Sh.UsedRange.NumberFormat = "General"
      If Not Application.Intersect(Sh.[A5:Z60], Target) Is Nothing Then
          For Each c In Sh.[A5:Z60].Cells
              Select Case c
              Case 5: c = 0.5
              Case "": c.Interior.ColorIndex = xlNone
              Case 0, 0.5, 1: c.Interior.ColorIndex = 36
              End Select
          Next
      End If
End Sub
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Четверг, 15.08.2013, 09:57
 
Ответить
Сообщениеlakmus_x, а Вы белиберды понаписали. Попробуйте:
[vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
      Dim c As Range
      If Sh.Index = 1 Then Exit Sub
      Sh.UsedRange.NumberFormat = "General"
      If Not Application.Intersect(Sh.[A5:Z60], Target) Is Nothing Then
          For Each c In Sh.[A5:Z60].Cells
              Select Case c
              Case 5: c = 0.5
              Case "": c.Interior.ColorIndex = xlNone
              Case 0, 0.5, 1: c.Interior.ColorIndex = 36
              End Select
          Next
      End If
End Sub
[/vba]

Автор - KuklP
Дата добавления - 15.08.2013 в 09:30
SkyPro Дата: Четверг, 15.08.2013, 09:47 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
SkyPro, этот код столько раз отформатирует ячейки на АКТИВНОМ листе, сколько листов в книге -1. Лучше:
Sheets(i).Cells.NumberFormat = "General"


:D
Завтыкал добавить лист.

Цитата
usedrange
Так условия стояли
Цитата
Как присвоить всем ячейкам листов
Вот я и сделал как просили :)


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Четверг, 15.08.2013, 09:49
 
Ответить
Сообщение
SkyPro, этот код столько раз отформатирует ячейки на АКТИВНОМ листе, сколько листов в книге -1. Лучше:
Sheets(i).Cells.NumberFormat = "General"


:D
Завтыкал добавить лист.

Цитата
usedrange
Так условия стояли
Цитата
Как присвоить всем ячейкам листов
Вот я и сделал как просили :)

Автор - SkyPro
Дата добавления - 15.08.2013 в 09:47
lakmus_x Дата: Четверг, 15.08.2013, 10:16 | Сообщение № 11
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
спасибо, действительно, "когда условий становится слишком много, if else.... if теряет свою привлекательность, для этого есть select case" :)
сейчас остается лишь одна недоработка, это при выделении нескольких ячеек и удалении нужно чтоб и очищалась заливка


Сообщение отредактировал lakmus_x - Четверг, 15.08.2013, 10:27
 
Ответить
Сообщениеспасибо, действительно, "когда условий становится слишком много, if else.... if теряет свою привлекательность, для этого есть select case" :)
сейчас остается лишь одна недоработка, это при выделении нескольких ячеек и удалении нужно чтоб и очищалась заливка

Автор - lakmus_x
Дата добавления - 15.08.2013 в 10:16
SkyPro Дата: Четверг, 15.08.2013, 10:19 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
сейчас остается лишь одна недоработка, это при выделении нескольких ячеек и удалении нужно чтоб и очищалась заливка

Выше вам предоставили макрос ,который работает как надо.
А если дорабатывать мой, то первое, что приходит в голову это на событие открытия книги повесить макрос с циклом.
Да и [vba]
Код
    Sh.UsedRange.NumberFormat = "General"
[/vba] Я бы запускал единоразово при открытии или закрытии (а то каждый раз менять форматы не комильфо).


skypro1111@gmail.com

Сообщение отредактировал SkyPro - Четверг, 15.08.2013, 10:24
 
Ответить
Сообщение
сейчас остается лишь одна недоработка, это при выделении нескольких ячеек и удалении нужно чтоб и очищалась заливка

Выше вам предоставили макрос ,который работает как надо.
А если дорабатывать мой, то первое, что приходит в голову это на событие открытия книги повесить макрос с циклом.
Да и [vba]
Код
    Sh.UsedRange.NumberFormat = "General"
[/vba] Я бы запускал единоразово при открытии или закрытии (а то каждый раз менять форматы не комильфо).

Автор - SkyPro
Дата добавления - 15.08.2013 в 10:19
lakmus_x Дата: Четверг, 15.08.2013, 10:41 | Сообщение № 13
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
да, мне тоже это не понравилось, поэтому убрал это отдельно при выделении и чтоб менял лишь у выделенной ячейки
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Index = 1 Then Exit Sub
Selection.NumberFormat = "General"
End Sub
[/vba]

сейчас код KuklP-а уже другой ,сначала там не было
[vba]
Код
For Each c In Sh.[A5:Z60].Cells
[/vba]
:)


Сообщение отредактировал lakmus_x - Четверг, 15.08.2013, 10:47
 
Ответить
Сообщениеда, мне тоже это не понравилось, поэтому убрал это отдельно при выделении и чтоб менял лишь у выделенной ячейки
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Index = 1 Then Exit Sub
Selection.NumberFormat = "General"
End Sub
[/vba]

сейчас код KuklP-а уже другой ,сначала там не было
[vba]
Код
For Each c In Sh.[A5:Z60].Cells
[/vba]
:)

Автор - lakmus_x
Дата добавления - 15.08.2013 в 10:41
SkyPro Дата: Четверг, 15.08.2013, 10:46 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1206
Репутация: 255 ±
Замечаний: 0% ±

2010
да, мне тоже это не понравилось, поэтому убрал это отдельно при выделении и чтоб менял лишь у выделенной ячейки

Теперь он у вас еще чаще запускается :)

Лучше уже добавить в предыдущий макрос [vba]
Код
Target.NumberFormat = "General"
[/vba]


skypro1111@gmail.com
 
Ответить
Сообщение
да, мне тоже это не понравилось, поэтому убрал это отдельно при выделении и чтоб менял лишь у выделенной ячейки

Теперь он у вас еще чаще запускается :)

Лучше уже добавить в предыдущий макрос [vba]
Код
Target.NumberFormat = "General"
[/vba]

Автор - SkyPro
Дата добавления - 15.08.2013 в 10:46
lakmus_x Дата: Четверг, 15.08.2013, 10:53 | Сообщение № 15
Группа: Пользователи
Ранг: Прохожий
Сообщений: 5
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
добавил исключение первого листа
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Index = 1 Then Exit Sub
Selection.NumberFormat = "General"
End Sub
[/vba]
почему же он чаще запускается, чем "Target.NumberFormat = "General""
в вашем случае он каждый раз всем будет вставлять формат общий при изменении ячеек, а при Workbook_SheetSelectionChange лишь одной выделенной ячейке (или у нескольких, если выделить), мне лишь важно чтоб у 1, 0 и 0,5 был правильный формат


Сообщение отредактировал lakmus_x - Четверг, 15.08.2013, 10:54
 
Ответить
Сообщениедобавил исключение первого листа
[vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Index = 1 Then Exit Sub
Selection.NumberFormat = "General"
End Sub
[/vba]
почему же он чаще запускается, чем "Target.NumberFormat = "General""
в вашем случае он каждый раз всем будет вставлять формат общий при изменении ячеек, а при Workbook_SheetSelectionChange лишь одной выделенной ячейке (или у нескольких, если выделить), мне лишь важно чтоб у 1, 0 и 0,5 был правильный формат

Автор - lakmus_x
Дата добавления - 15.08.2013 в 10:53
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Цель: Выполнить макрос на всех листах кроме первого (Макросы Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!