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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2009, 19:33   #1
segail
Форумчанин
 
Регистрация: 13.06.2009
Сообщений: 691
По умолчанию Четыре кода одна кнопка.

Здравствуйте.

У меня вопрос по поводу календаря, который представлен на форуме.

1.Допустим на другой форме есть четыре кнопки, которые открывают календарь.
2.Есть четыре кода
3.Как выполнить код, кликом по кнопке ОК в календаре, по отношению к той кнопке, которой был открыт календарь?

Последний раз редактировалось segail; 07.09.2009 в 20:34.
segail вне форума Ответить с цитированием
Старый 08.09.2009, 06:39   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Можно создать глобальную переменную и перед вызовом формы календаря, в зависимости от того, какой кнопкой она вызывается, присваивать ей соответствующее значение. Затем, после клика по кнопке ОК в календаре, проверять значение этой переменной и запускать требуемый макрос.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 08.09.2009, 10:08   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
вопрос по поводу календаря, который представлен на форуме
Если хорошо поискать, то можно найти пару десятков различных реализаций календаря. Про какой идёт речь?

Цитата:
Есть четыре кода
Хорошо сказано
Если бы мы увидели Ваши "коды" вместе с файлом, Вы уже получили бы готовый результат.

Цитата:
Как выполнить код, кликом по кнопке ОК в календаре, по отношению к той кнопке, которой был открыт календарь?
Если Вы по поводу календарика из этой темы, то там всё делается намного проще - достаточно сделать обработчик события изменения того поля, в которое заносится дата (получится 4 обработчика для 4 полей), - ведь при нажатии кнопки ОК функция Get_Date(Now) закрывает форму, и возвращает изменённое значение даты в текстовое поле.

Короче, будет заготовка формы - будет и более подробный ответ.
EducatedFool вне форума Ответить с цитированием
Старый 08.09.2009, 17:48   #4
segail
Форумчанин
 
Регистрация: 13.06.2009
Сообщений: 691
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Если хорошо поискать, то можно найти пару десятков различных реализаций календаря. Про какой идёт речь?


Хорошо сказано
Если бы мы увидели Ваши "коды" вместе с файлом, Вы уже получили бы готовый результат.


Если Вы по поводу календарика из этой темы, то там всё делается намного проще - достаточно сделать обработчик события изменения того поля, в которое заносится дата (получится 4 обработчика для 4 полей), - ведь при нажатии кнопки ОК функция Get_Date(Now) закрывает форму, и возвращает изменённое значение даты в текстовое поле.

Короче, будет заготовка формы - будет и более подробный ответ.
Данный код был вписан в кнопку ОК. Хотя он и выполнял то, что в нем прописано, но это не то, что мне надо. Еще будут три кода, но они пока еще сырые. Хотя бы на одном коде покажите, я потом может сам, разберусь.
Код:
Private Sub Cmd_Select_Click()
    
If CDate(TextBox_Year) <> CDate(Sheets("Отчет").Range("R1")) Then
MsgBox " Год ввода данных выбран не верно.", vbInformation, "Запрет ввода"
Exit Sub
End If
    
    Dim i As Integer
    
    For i = 1 To 1000
        If Sheets("Отчет").Cells(i, 1).Value = CStr(DateValue(dt_1)) Then 'Поиск даты

'Удаление данных на выбранную дату, если ТextBox1 пустой
            
            If UserForm1.TextBox1.Text = "" Then
             Sheets("Отчет").Cells(i, 2).Value = ""
             Sheets("Отчет").Cells(i, 3).Value = ""
             Sheets("Отчет").Cells(i, 4).Value = ""
             Sheets("Отчет").Cells(i, 5).Value = ""
             Sheets("Отчет").Cells(i, 6).Value = ""
             Sheets("Отчет").Cells(i, 7).Value = ""
             Sheets("Отчет").Cells(i, 8).Value = ""
             Sheets("Отчет").Cells(i, 9).Value = ""
            

             Sheets("Отчет").Cells(i, 21).Value = Sheets("Отчет").Cells(i - 1, 21).Value ' Значения беруться из строки выше
             Sheets("Отчет").Cells(i, 22).Value = Sheets("Отчет").Cells(i - 1, 22).Value ' Значения беруться из строки выше
            Else

'Ввод данных на выбранную дату.

            If chb_Time.Value = True Then Sheets("Отчет").Cells(i, 2).Value = Label_Hour.Caption + ":" + Label_Minute 'Ввод времени если chb_Time обозначен галочкой
            If chb_Time.Value = False Then Sheets("Отчет").Cells(i, 2).Value = "" 'Удаление времени если chb_Time не обозначен галочкой
             Sheets("Отчет").Cells(i, 3).Value = UserForm1.TextBox1.Text + Sheets("Отчет").Cells(i, 3).Value
             Sheets("Отчет").Cells(i, 4).Value = UserForm1.TextBox2.Text + Sheets("Отчет").Cells(i, 4).Value
             Sheets("Отчет").Cells(i, 5).Value = UserForm1.TextBox3.Text + Sheets("Отчет").Cells(i, 5).Value
             Sheets("Отчет").Cells(i, 6).Value = UserForm1.TextBox5.Text + Sheets("Отчет").Cells(i, 6).Value
             Sheets("Отчет").Cells(i, 7).Value = UserForm1.TextBox6.Text + Sheets("Отчет").Cells(i, 7).Value
             Sheets("Отчет").Cells(i, 8).Value = UserForm1.TextBox7.Text + Sheets("Отчет").Cells(i, 8).Value
             Sheets("Отчет").Cells(i, 9).Value = UserForm1.TextBox8.Text + Sheets("Отчет").Cells(i, 9).Value
    
             Sheets("Отчет").Cells(i, 21).Value = Range("F10").Value
             Sheets("Отчет").Cells(i, 22).Value = Range("G10").Value
            End If
        End If
    'Команда - закончить выбор даты и закрыть форму
    SelectedDate = CStr(DateValue(dt_1))
    Unload Me
    Next
End Sub
Прилагаю пример. Это пробный вариант в виде черновика.
Вложения
Тип файла: zip primer.zip (47.7 Кб, 22 просмотров)

Последний раз редактировалось segail; 08.09.2009 в 17:51.
segail вне форума Ответить с цитированием
Старый 08.09.2009, 18:40   #5
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Как же Вы любите всё усложнять...

Цитата:
Данный код был вписан в кнопку ОК.
Это и было самой главной Вашей ошибкой.
Не надо трогать код формы Form_SelectDate

Если нужно, чтобы год невозможно было изменить - уберите с формы элемент SpinButton_Year, и заблокируйте текстбокс для ввода года.

Отлавливайте события изменения полей типа TextBox1 на своей форме:
Код:
Private Sub TextBox1_Change()    ' нажата кнопка ОК на форме выбора даты
    ' Ваш код
End Sub

PS: Вместо
Код:
    Sheets("Отчет").Cells(i, 2).Value = ""
    Sheets("Отчет").Cells(i, 3).Value = ""
    Sheets("Отчет").Cells(i, 4).Value = ""
    Sheets("Отчет").Cells(i, 5).Value = ""
    Sheets("Отчет").Cells(i, 6).Value = ""
    Sheets("Отчет").Cells(i, 7).Value = ""
    Sheets("Отчет").Cells(i, 8).Value = ""
    Sheets("Отчет").Cells(i, 9).Value = ""


    Sheets("Отчет").Cells(i, 21).Value = Sheets("Отчет").Cells(i - 1, 21).Value    ' Значения беруться из строки выше
    Sheets("Отчет").Cells(i, 22).Value = Sheets("Отчет").Cells(i - 1, 22).Value    ' Значения беруться из строки выше
можно написать
Код:
    With Sheets("Отчет")
        .Cells(i, 2).Resize(, 8).ClearContents ' очищаем сразу 8 ячеек
        .Cells(i, 21) = .Cells(i - 1, 21)   ' Значения берутся из строки выше
        .Cells(i, 22) = .Cells(i - 1, 22)    ' Значения берутся из строки выше
    End With
И вообще, в данном случае цикл в десятки раз замедляет код.
Для быстрого нахождения подходящих ячеек можно использовать метод Find, или формулы.


И не забываем про
Код:
Application.ScreenUpdating = False
' код
Application.ScreenUpdating = True

Последний раз редактировалось EducatedFool; 08.09.2009 в 18:42.
EducatedFool вне форума Ответить с цитированием
Старый 08.09.2009, 19:32   #6
segail
Форумчанин
 
Регистрация: 13.06.2009
Сообщений: 691
По умолчанию

Что-то я заплутал. Код необходимо вставить в TextBox1? А как же при нажатии кнопки ОК в календаре он выполнится?

Код:
Private Sub TextBox1_Change()    ' нажата кнопка ОК на форме выбора даты
    ' Ваш код
End Sub
И не забываем про

Код:
Application.ScreenUpdating = False
' код
Application.ScreenUpdating = True
Я бы не забыл, если бы знал что с ним делать.

Общий смысл данного кода в том, что он вносит данные TextBox с суммированием в ячейки на выбранную дату в календаре на дату в ячейке (в ячейках даты уже проставлены), или удаляет если TextBox1 чистый.

С годом все нормально. Смысл изменения года в ячейки (лист отчет ячейка R1) и не совпадение его с годом в календаре, выходит сообщение и не дает выполнить действие. Необходимо выбор года в календаре или изменения его в ячейке, то есть совпадение годов дает выполнение кода (так надо).

p/s
TextBox1 берется за основу, если есть значение или нет значения, но не дата.

Последний раз редактировалось segail; 08.09.2009 в 22:56.
segail вне форума Ответить с цитированием
Старый 09.09.2009, 17:15   #7
segail
Форумчанин
 
Регистрация: 13.06.2009
Сообщений: 691
По умолчанию

Цитата:
Отлавливайте события изменения полей типа TextBox1 на своей форме:
Подскажите как их отлавливать.
Хотя бы небольшой пример.
segail вне форума Ответить с цитированием
Старый 09.09.2009, 18:27   #8
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Правой кнопкой на текстбоксе - View Code

Код:
Private Sub TextBox1_Change()
MsgBox ("Hello world")
End Sub
motorway вне форума Ответить с цитированием
Старый 09.09.2009, 18:36   #9
segail
Форумчанин
 
Регистрация: 13.06.2009
Сообщений: 691
По умолчанию

Это понятно. Как отлавливать события изменения полей, при клике по кнопке ОК?
segail вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
разделить число например 1234, и переместить в четыре переменные pomoshnic Помощь студентам 5 22.12.2008 20:29
Кнопка не создается Манжосов Денис :) Компоненты Delphi 10 28.04.2008 17:43
Кнопка обнуления Pabelu Microsoft Office Excel 6 15.04.2008 17:09
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51