Здравствуйте. Для одной моей работы я пытаюсь сделать возможным включение из формы закрашивания листа через выделение нужных ячеек. Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа. Что бы в ручную каждый раз незаписывать макрос в лист, я нашел в инете, как через один макрос создовать другой. И когда проверял код отдельно, с виду он работал. Но запустив его через форму, увидел что не всё идет гладко. Во первых, при отключонной Showmodal (которая обычно блокирует лист пока открыта форма), после запуска макроса, форма вылетает. Во вторых (что скорее всего и является причиной первой), при пошаговом проигрывании макроса в форме вылазит ошибка Ссылка удалена администрацией. Причина: Нарушение правил форума п.3 Подскажите в чём ошибка и как исправить (файл прилагается) [vba]
Код
Private Sub Knopka_Click() Dim Kod As String Const Enter As String = vbNewLine '----- Kod = Kod & "Option Explicit" & Enter Kod = Kod & "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & Enter Kod = Kod & " Dim r As Range" & Enter Kod = Kod & " For Each r In Target" & Enter Kod = Kod & " If r.Column > 30 _" & Enter Kod = Kod & " Or r.Row > 30 _" & Enter Kod = Kod & " Then Exit Sub" & Enter Kod = Kod & " Next r" & Enter Kod = Kod & " For Each r In Target" & Enter Kod = Kod & " With r.Interior" & Enter Kod = Kod & " If .Color = 0 _" & Enter Kod = Kod & " Then .Color = RGB(255, 255, 255) _" & Enter Kod = Kod & " Else .Color = 0" & Enter Kod = Kod & " End With" & Enter Kod = Kod & " Next r" & Enter Kod = Kod & "End Sub" & Enter '----- With ThisWorkbook.VBProject.VBComponents.Item(ActiveSheet.CodeName).codemodule .DeleteLines 1, .CountOfLines If Knopka.Value _ Then .InsertLines 1, Kod End With End Sub
[/vba]
P.S. Вот тема, откуда я узнал как добовлять макрос другим макросом Ссылка удалена администрацией. Причина: Нарушение правил форума п.3
Здравствуйте. Для одной моей работы я пытаюсь сделать возможным включение из формы закрашивания листа через выделение нужных ячеек. Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа. Что бы в ручную каждый раз незаписывать макрос в лист, я нашел в инете, как через один макрос создовать другой. И когда проверял код отдельно, с виду он работал. Но запустив его через форму, увидел что не всё идет гладко. Во первых, при отключонной Showmodal (которая обычно блокирует лист пока открыта форма), после запуска макроса, форма вылетает. Во вторых (что скорее всего и является причиной первой), при пошаговом проигрывании макроса в форме вылазит ошибка Ссылка удалена администрацией. Причина: Нарушение правил форума п.3 Подскажите в чём ошибка и как исправить (файл прилагается) [vba]
Код
Private Sub Knopka_Click() Dim Kod As String Const Enter As String = vbNewLine '----- Kod = Kod & "Option Explicit" & Enter Kod = Kod & "Private Sub Worksheet_SelectionChange(ByVal Target As Range)" & Enter Kod = Kod & " Dim r As Range" & Enter Kod = Kod & " For Each r In Target" & Enter Kod = Kod & " If r.Column > 30 _" & Enter Kod = Kod & " Or r.Row > 30 _" & Enter Kod = Kod & " Then Exit Sub" & Enter Kod = Kod & " Next r" & Enter Kod = Kod & " For Each r In Target" & Enter Kod = Kod & " With r.Interior" & Enter Kod = Kod & " If .Color = 0 _" & Enter Kod = Kod & " Then .Color = RGB(255, 255, 255) _" & Enter Kod = Kod & " Else .Color = 0" & Enter Kod = Kod & " End With" & Enter Kod = Kod & " Next r" & Enter Kod = Kod & "End Sub" & Enter '----- With ThisWorkbook.VBProject.VBComponents.Item(ActiveSheet.CodeName).codemodule .DeleteLines 1, .CountOfLines If Knopka.Value _ Then .InsertLines 1, Kod End With End Sub
[/vba]
P.S. Вот тема, откуда я узнал как добовлять макрос другим макросом Ссылка удалена администрацией. Причина: Нарушение правил форума п.3ZetMenChavo
Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа.
это не так, можно в модуль книги [vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range For Each r In Target If r.Column > 30 _ Or r.Row > 30 _ Then Exit Sub Next r For Each r In Target With r.Interior If .Color = 0 _ Then .Color = RGB(255, 255, 255) _ Else .Color = 0 End With Next r End Sub
Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа.
это не так, можно в модуль книги [vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim r As Range For Each r In Target If r.Column > 30 _ Or r.Row > 30 _ Then Exit Sub Next r For Each r In Target With r.Interior If .Color = 0 _ Then .Color = RGB(255, 255, 255) _ Else .Color = 0 End With Next r End Sub
Nic70y, Интересная деталь, но не в этом проблема моего вопроса. Мне нужно чтобы пользовательская форма, по нажатию кнопки, вставляла макрос для закраски ячеек в модуль того листа который активен, а при втором нажатии очищала модуль (Вкл/Выкл). И проблема в том, что, при включонном параметре формы ShowModal, лист блокируется для ручного изменения, что не даёт воспользоваться вставляемым макросом. А при выключенном ShowModal, форма вылетает после выполнения кода по вставке макроса.
Я попробовал даже переключатель, через код, для Show сделать. Но не помогло. Включаю Show, активирую вставку кода, форма остаётся, выключаю Show чтоб был доступ к листу, но форма проста вылетает. [vba]
Код
Dim cc As Long Private Sub CommandButton1_Click() cc = Abs(cc - 1) Me.BackColor = Choose(1 + cc, RGB(0, 255, 0), RGB(255, 255, 0)) Me.Hide Me.Show Choose(1 + cc, vbModeless, vbModal) End Sub
[/vba]
Так что мой вопрос в том, как сделать что бы форма не вылетала.
Nic70y, Интересная деталь, но не в этом проблема моего вопроса. Мне нужно чтобы пользовательская форма, по нажатию кнопки, вставляла макрос для закраски ячеек в модуль того листа который активен, а при втором нажатии очищала модуль (Вкл/Выкл). И проблема в том, что, при включонном параметре формы ShowModal, лист блокируется для ручного изменения, что не даёт воспользоваться вставляемым макросом. А при выключенном ShowModal, форма вылетает после выполнения кода по вставке макроса.
Я попробовал даже переключатель, через код, для Show сделать. Но не помогло. Включаю Show, активирую вставку кода, форма остаётся, выключаю Show чтоб был доступ к листу, но форма проста вылетает. [vba]
Код
Dim cc As Long Private Sub CommandButton1_Click() cc = Abs(cc - 1) Me.BackColor = Choose(1 + cc, RGB(0, 255, 0), RGB(255, 255, 0)) Me.Hide Me.Show Choose(1 + cc, vbModeless, vbModal) End Sub
[/vba]
Так что мой вопрос в том, как сделать что бы форма не вылетала.ZetMenChavo
RAN, если можно, то более понятным языком. Я ученик интернета в плане эксель и вба, так что хорошо впитываю лишь наглядные примеры без сложных и мало знакомых терминов на передовой. Если возможно как то избавиться от вылета формы, то покажите пример в коде, а там я уже и в принципе работы разберусь и в сопутствующих процессу терминах
RAN, если можно, то более понятным языком. Я ученик интернета в плане эксель и вба, так что хорошо впитываю лишь наглядные примеры без сложных и мало знакомых терминов на передовой. Если возможно как то избавиться от вылета формы, то покажите пример в коде, а там я уже и в принципе работы разберусь и в сопутствующих процессу терминахZetMenChavo
Учитывая уровень, то вопрос странный... Открытая форма блокирует доступ к коду. При открытой форме код возможно редактировать, только если установить точку останова, и запустить код. И это все не в VBA, а внутри Excel. Я бы пошел таким путем 1. Не писать код макросом 2. Workbook_SheetSelectionChange 3. Public flag (flags) для управления 4. Show vbModeless 5. Нюансы
Учитывая уровень, то вопрос странный... Открытая форма блокирует доступ к коду. При открытой форме код возможно редактировать, только если установить точку останова, и запустить код. И это все не в VBA, а внутри Excel. Я бы пошел таким путем 1. Не писать код макросом 2. Workbook_SheetSelectionChange 3. Public flag (flags) для управления 4. Show vbModeless 5. НюансыRAN
Дельное предложение. Реализовал то что вы описали, и в целом даёт тот результат который хотел. Жаль конечно что пришлось код по разным модулям раскидать чтоб всё работала. Запись макроса другим макросом, в идеале должна была позволить ограничиться лишь одним, привязанным к форме, но хотя бы работает.
Забавно, столько возможностей в эксель и вба, а по итогу то, чего сильнее всего хочешь сделать как раз таки и невозможно, прихоидиться искать обходные пути
Спасиб за подсказку. Файл с рабочей формой прилагается, если интересно.
Модуль ЭтаКнига [vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) ' If Not Mid(Sh.CodeName, 5, 5) > 7 Then Exit Sub If Not Zakraska Then Exit Sub '========================= Dim rn As Range For Each rn In Target If rn.Column > 30 _ Or rn.Row > 30 _ Then Exit Sub Next rn For Each rn In Target With rn.Interior If .Color = 0 _ Then .Color = RGB(255, 255, 255) _ Else .Color = 0 End With DoEvents Next rn End Sub
[/vba] Модуль UserForm1 [vba]
Код
Const Лайм As Long = 65280 'RGB(0, 255, 0) Const Зеленый As Long = 32768 'RGB(0, 128, 0) Private Sub UserForm_Initialize() CommandButton1.BackColor = Зеленый End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Zakraska = False End Sub Private Sub CommandButton1_Click() Zakraska = Not Zakraska If Zakraska _ Then CommandButton1.BackColor = Лайм _ Else CommandButton1.BackColor = Зеленый End Sub
[/vba] Модуль Module1 [vba]
Код
Public Zakraska As Boolean Sub ddd() UserForm1.Show End Sub
[/vba]
RAN,
Цитата
Я бы пошел таким путем
Дельное предложение. Реализовал то что вы описали, и в целом даёт тот результат который хотел. Жаль конечно что пришлось код по разным модулям раскидать чтоб всё работала. Запись макроса другим макросом, в идеале должна была позволить ограничиться лишь одним, привязанным к форме, но хотя бы работает.
Забавно, столько возможностей в эксель и вба, а по итогу то, чего сильнее всего хочешь сделать как раз таки и невозможно, прихоидиться искать обходные пути
Спасиб за подсказку. Файл с рабочей формой прилагается, если интересно.
Модуль ЭтаКнига [vba]
Код
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) ' If Not Mid(Sh.CodeName, 5, 5) > 7 Then Exit Sub If Not Zakraska Then Exit Sub '========================= Dim rn As Range For Each rn In Target If rn.Column > 30 _ Or rn.Row > 30 _ Then Exit Sub Next rn For Each rn In Target With rn.Interior If .Color = 0 _ Then .Color = RGB(255, 255, 255) _ Else .Color = 0 End With DoEvents Next rn End Sub
[/vba] Модуль UserForm1 [vba]
Код
Const Лайм As Long = 65280 'RGB(0, 255, 0) Const Зеленый As Long = 32768 'RGB(0, 128, 0) Private Sub UserForm_Initialize() CommandButton1.BackColor = Зеленый End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) Zakraska = False End Sub Private Sub CommandButton1_Click() Zakraska = Not Zakraska If Zakraska _ Then CommandButton1.BackColor = Лайм _ Else CommandButton1.BackColor = Зеленый End Sub
[/vba] Модуль Module1 [vba]
Код
Public Zakraska As Boolean Sub ddd() UserForm1.Show End Sub