Страницы: 1
RSS
возможно ли создать публичную функцию внутри Class Module?
 
всем доброго времени суток
у меня есть class module:
Код
Option Explicit
Public WithEvents eBx1 As MSForms.TextBox
Public WithEvents eBx2 As MSForms.TextBox
...
до Public WithEvents eBx50 As MSForms.TextBox


Private Sub eBx1_Change()
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
    If eBx1.Tag = "" Then Exit Sub
    Dim lc1 As Long, lc2 As Long, r As Integer, Str
    Str = Split(eBx1.Tag, ";")
    If UBound(Str) < 1 Then Exit Sub
    lc1 = val(Str(0))
    lc2 = val(Str(1))
    With Worksheets("updateEvent")
        If .Cells(5, 2).Value = .Cells(1, 1).Value Then
            .Cells(3, lc1).Value = Format(val(eBx1.Value) / 100, "#0%")
        Else
            .Cells(3, lc2).Value = Format(val(eBx1.Value) / 100, "#0%")
        End If
    End With
    With eBx1
        If Not IsNumeric(.Text) And .Text <> "" Then
            .Text = Left(.Text, Len(.Text) - 1)
            .SelStart = Len(.Text)
        End If
    End With
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub

Private Sub eBx2_Change()
With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With
    If eBx2.Tag = "" Then Exit Sub
    Dim lc1 As Long, lc2 As Long, r As Integer, Str
    Str = Split(eBx2.Tag, ";")
    If UBound(Str) < 1 Then Exit Sub
    lc1 = val(Str(0))
    lc2 = val(Str(1))
    With Worksheets("updateEvent")
        If .Cells(5, 2).Value = .Cells(1, 1).Value Then
            .Cells(4, lc1).Value = Format(val(eBx2.Value) / 100, "#0%")
        Else
            .Cells(4, lc2).Value = Format(val(eBx2.Value) / 100, "#0%")
        End If
    End With
    With eBx2
        If Not IsNumeric(.Text) And .Text <> "" Then
            .Text = Left(.Text, Len(.Text) - 1)
            .SelStart = Len(.Text)
        End If
    End With
With Application
    .EnableEvents = True
    .ScreenUpdating = True
End With
End Sub
...
до Private Sub eBx50_Change()

возможно ли создать публичную функцию внутри Class Module?
затем использовать ее внутри UserForm
использую следующий код внутри UserForm
Код
'function for import data from eventsFC to sheet
Dim eVal1() As New eventFC 'название Class Molude
Dim eVal2() As New eventFC
...
до Dim eVal50() As New eventFC
Private Sub UserForm_Initialize()
Application.EnableEvents = False
Application.ScreenUpdating = False
    Dim c, r As Integer
    If Sheets("updateEvent").Cells(1, 2).Value = "New" Then
    Else
        ReDim eVal1(1 To 12)
            For c = 1 To 12
               Set eVal1(c).eBx1 = eventsFC.frmEvent.Controls("txtBrand1_" & c)
            Next c
        ReDim eVal2(1 To 12)
            For c = 1 To 12
               Set eVal2(c).eBx2 = eventsFC.frmEvent.Controls("txtBrand2_" & c)
            Next c
...
до 
        ReDim eVal50(1 To 12) 
           For c = 1 To 12
               Set eVal50(c).eBx50 = eventsFC.frmEvent.Controls("txtBrand50_" & c)
            Next c
    End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
можно ли добавить в этот код еще один цикл?
код у меня работал когда использовал в User Form 12 наименование товара
основная задача заключается в том что если пользователь меняет данные в UserForm, данные должны менятся внутри Excel
есть ли у вас какая-то идея по этому поводу
заранее спасибо за потраченное время
 
Трудно разбираться, не видя общей картины, но непонятно, зачем отдельные события для каждого текстбокса? Почему не для группы? Процедура-то одна и та же для всех 50-ти. Одну переменную надо менять, так это можно по индексу текстбокса в группе сделать.
Вот тут инструкции:
http://spreadsheetpage.com/index.php/site/tip/handle_multiple_userform_buttons_with_one_subro­utine/
Изменено: KL - 10.02.2016 21:30:49
KL
 
KL, спасибо за инфо
реализовал вот так
class module:
Код
Option Explicit
Public WithEvents eBoxes As MSForms.TextBox

Private Sub eBoxes_Change()
    If eBoxes.Tag = "" Then Exit Sub
    Dim lc1 As Long, lc2 As Long, r As Integer, Str
    Str = Split(eBoxes.Tag, ";")
    If UBound(Str) < 1 Then Exit Sub
    lc1 = val(Str(0))
    lc2 = val(Str(1))
    With Worksheets("updateEvent")
        For r = 3 To 52 Step 1
            If .Cells(5, 2).Value = .Cells(1, 1).Value Then
                .Cells(r, lc1).Value = Format(val(eBoxes.Value) / 100, "#0%")
            Else
                .Cells(r, lc2).Value = Format(val(eBoxes.Value) / 100, "#0%")
            End If
        Next r
    End With
    With eBoxes
        If Not IsNumeric(.Text) And .Text <> "" Then
            .Text = Left(.Text, Len(.Text) - 1)
            .SelStart = Len(.Text)
        End If
    End With
End Sub
add code:
Код
Dim eValues() As New eventFC

Private Sub UserForm_Initialize()
    Dim c, r, cnt As Integer
    Dim ctl As Control
    If Sheets("updateEvent").Cells(1, 2).Value = "New" Then
    Else
        cnt = 0
        For Each ctl In eventsFC.frmEvent.Controls
            If TypeName(ctl) = "txtBrand" Then
                For r = 1 To 50 Step 1
                    cnt = cnt + 1
                    ReDim Preserve eValues(1 To cnt)
                    For c = 1 To 12
                       Set eValues(c).eBoxes = eventsFC.frmEvent.Controls("txtBrand" & r & "_" & c)
                    Next c
                Next r
            End If
        Next ctl
    End If
End Sub
к сожалению не работает, не могу понять где ошибка, прошу помочь, заранее спасибо
 
Цитата
hk1209 написал: сожалению не работает
Про "не работает" можно поподробнее? В чем выражается? Прошу учитывать, что мне неизвестно, что вы делаете и у меня нет вашего файла, а значит я не могу смоделировать и протестировать код. Да и трудоемко это :)
KL
 
А так?
Код
Set eValues(c).eBoxes = frmEvent.Controls("txtBrand" & r & "_" & c)
 
KL, выложил тестовый файл
у меня 50, но в этом файле оставил только 10 наименование товаров
что не работает: если мы меняем данные в userForm, то данные внутри Экселя не меняются
прошу помочь, спасибо
 
RAN, спасибо за участие, к сожалению не поможет:((
 
Если честно, некогда вникать в то, что делает ваш макрос, а примера вы не повесили, чтобы помочь мне помочь вам. Я сделал небольшой макет с действующим присвоением событий кнопкам. Вам остается только редактировать процедуру Sub TextBoxes_Change() внутри класса.
Удачи!
KL
 
KL, спасибо за потраченное время
сегодня утром выложил пример, сейчас вижу что нет, почему не знаю
еще надо учитывать по горизонтально (т.е. по месячно)
попробую переобразовать ваш код под себя
если не трудно, то прошу еще раз посмотреть мой пример, заранее спасибо
если будут ответы то буду очень признателен
 
Вот так как-то. Код правки форматов в текстбоксах полностью на вашей совести - у меня заканчивается батарея в ноутбуке :)
Изменено: KL - 12.02.2016 02:35:44
KL
 
KL, огромное спасибо за потраченное драгоценное время:)
 
Подумалось: а не перемудрили мы? Тут и класс и события особо не нужны. Должно хватить проперти .ControlSource (см. вложение)
Изменено: KL - 14.02.2016 02:05:33
KL
Страницы: 1
Наверх