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

Вход

Регистрация

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

 

= Мир MS Excel/Запись макроса другим макросом через Userform - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Запись макроса другим макросом через Userform (Макросы/Sub)
Запись макроса другим макросом через Userform
ZetMenChavo Дата: Воскресенье, 18.09.2022, 13:15 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте. Для одной моей работы я пытаюсь сделать возможным включение из формы закрашивания листа через выделение нужных ячеек.
Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа.
Что бы в ручную каждый раз незаписывать макрос в лист, я нашел в инете, как через один макрос создовать другой. И когда проверял код отдельно, с виду он работал.
Но запустив его через форму, увидел что не всё идет гладко. Во первых, при отключонной Showmodal (которая обычно блокирует лист пока открыта форма), после запуска макроса, форма вылетает.
Во вторых (что скорее всего и является причиной первой), при пошаговом проигрывании макроса в форме вылазит ошибка

Подскажите в чём ошибка и как исправить (файл прилагается)
[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. Вот тема, откуда я узнал как добовлять макрос другим макросом
https://www.cyberforum.ru/vba/thread621775.html
К сообщению приложен файл: 5025587.xlsm(318.9 Kb)


Сообщение отредактировал ZetMenChavo - Воскресенье, 18.09.2022, 13:17
 
Ответить
СообщениеЗдравствуйте. Для одной моей работы я пытаюсь сделать возможным включение из формы закрашивания листа через выделение нужных ячеек.
Макрос, который реагировал бы на выделение ячеек (Worksheet_SelectionChange), можно написать лишь в модуле листа.
Что бы в ручную каждый раз незаписывать макрос в лист, я нашел в инете, как через один макрос создовать другой. И когда проверял код отдельно, с виду он работал.
Но запустив его через форму, увидел что не всё идет гладко. Во первых, при отключонной Showmodal (которая обычно блокирует лист пока открыта форма), после запуска макроса, форма вылетает.
Во вторых (что скорее всего и является причиной первой), при пошаговом проигрывании макроса в форме вылазит ошибка

Подскажите в чём ошибка и как исправить (файл прилагается)
[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. Вот тема, откуда я узнал как добовлять макрос другим макросом
https://www.cyberforum.ru/vba/thread621775.html

Автор - ZetMenChavo
Дата добавления - 18.09.2022 в 13:15
Nic70y Дата: Понедельник, 19.09.2022, 08:05 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 7725
Репутация: 1853 ±
Замечаний: 0% ±

Excel 2010
Макрос, который реагировал бы на выделение ячеек (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
[/vba]


ЮMoney 41001841029809
 
Ответить
Сообщение
Макрос, который реагировал бы на выделение ячеек (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
[/vba]

Автор - Nic70y
Дата добавления - 19.09.2022 в 08:05
ZetMenChavo Дата: Понедельник, 19.09.2022, 13:27 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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]

Так что мой вопрос в том, как сделать что бы форма не вылетала.
К сообщению приложен файл: 9605567.xlsm(320.8 Kb)


Сообщение отредактировал ZetMenChavo - Понедельник, 19.09.2022, 13:29
 
Ответить
Сообщение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
Дата добавления - 19.09.2022 в 13:27
RAN Дата: Понедельник, 19.09.2022, 14:15 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5630
Репутация: 1143 ±
Замечаний: 0% ±

2010
Место роста ног (ИМХО)
Создаем форму и любой код.
Запускаем форму, и пытаемся изменить любой код.
Return - хрен по фейсу.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеМесто роста ног (ИМХО)
Создаем форму и любой код.
Запускаем форму, и пытаемся изменить любой код.
Return - хрен по фейсу.

Автор - RAN
Дата добавления - 19.09.2022 в 14:15
ZetMenChavo Дата: Вторник, 20.09.2022, 14:38 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
RAN, если можно, то более понятным языком. Я ученик интернета в плане эксель и вба, так что хорошо впитываю лишь наглядные примеры без сложных и мало знакомых терминов на передовой.
Если возможно как то избавиться от вылета формы, то покажите пример в коде, а там я уже и в принципе работы разберусь и в сопутствующих процессу терминах
 
Ответить
Сообщение RAN, если можно, то более понятным языком. Я ученик интернета в плане эксель и вба, так что хорошо впитываю лишь наглядные примеры без сложных и мало знакомых терминов на передовой.
Если возможно как то избавиться от вылета формы, то покажите пример в коде, а там я уже и в принципе работы разберусь и в сопутствующих процессу терминах

Автор - ZetMenChavo
Дата добавления - 20.09.2022 в 14:38
RAN Дата: Вторник, 20.09.2022, 15:21 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5630
Репутация: 1143 ±
Замечаний: 0% ±

2010
Учитывая уровень, то вопрос странный...
Открытая форма блокирует доступ к коду.
При открытой форме код возможно редактировать, только если установить точку останова, и запустить код.
И это все не в 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
Дата добавления - 20.09.2022 в 15:21
ZetMenChavo Дата: Вторник, 20.09.2022, 19:18 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 138
Репутация: 7 ±
Замечаний: 0% ±

Excel 2010
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]
К сообщению приложен файл: 8276661.xlsm(22.8 Kb)
 
Ответить
Сообщение 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]

Автор - ZetMenChavo
Дата добавления - 20.09.2022 в 19:18
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Запись макроса другим макросом через Userform (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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