Подскажите, пожалуйста, что можно сделать. Есть макрос - календарь. Делала форму для особо ленивых, чтобы даты не набирать руками, а выбрать в календаре, макрос конечно же нагуглила. Проблема в том, что этот календарь выскакивает при каждом удобном и неудобном случае (при открытии книги, даже когда на ячейку с календарем не становишься, просто выделяешь ячейку), а нужно чтобы он появлялся только тогда, когда я встала на ячейку с календарем (столбец F) и щелкнула по ней, для "вызова" этого календаря. Короче что бы он появлялся только по щелчку мыши. Можно так сделать?
Вот код
Скрытый текст
ption Explicit
Dim dt As Date, d As Date, cdt As Date, changing As Boolean, i&, mon&
Dim w
Dim BT() As New CAL
Const ylen = 99 ' период дат, отображаемых в комбо годов - т.е. от 48 лет до указ даты и длиной в 99 лет
Property Get Value() As Date
Value = dt ' обеспечение обращения slancalendar.value
End Property
Private Sub combomon_Change()
If changing Then Exit Sub ' отсекание циклических вызовов
If combomon.ListIndex = -1 Then Exit Sub 'запрет произвольного ввода
Call setcal(DateSerial(Val(comboyear.Text), combomon.ListIndex + 1, 1)) 'инициализация новой датой
Application.SendKeys "{end}" 'чтобы без выделения
End Sub
Private Sub comboyear_Change()
If changing Then Exit Sub ' отсекание циклических вызовов
If comboyear.ListIndex = -1 Then ' при ручном вводе запрет инициализации до окончания ввода(enter)
changing = True
Exit Sub
End If
Call setcal(DateSerial(Val(comboyear.Text), combomon.ListIndex + 1, 1)) 'инициализация новой датой
Application.SendKeys "{end}" 'чтобы без выделения
End Sub
Private Sub comboyear_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Then ' реакция на нажатие интера
changing = False ' разрешение последующей инициализации
Call setcal(DateSerial(Val(comboyear.Text), combomon.ListIndex + 1, 1)) 'инициализация новой датой
End If
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub now_Click()
setcal (Date)
End Sub
Private Sub sz_Change()
On Error Resume Next
Dim n#, np, x
n = sz.Value: n = IIf(n < 0, (100 - Abs(n)) / 100, 1 + n / 50)
With Me
np = w / .Width * n
.Width = np * .Width
.Height = np * .Height
For Each x In .Controls
' If x.Name <> "sz" Then
With x
.Top = .Top * np + IIf(sz.Value < 0, -0.1, 0.1)
.Left = .Left * np
.Width = .Width * np
.Height = .Height * np
If .Font.Size > 5 Or np > 1 Then .Font.Size = .Height / IIf(TypeName(x) = "CommandButton", 2.5, 1.8)
End With
' End If
Next
End With
End Sub
Private Sub UserForm_Activate()
Dim Oble As Control
Dim t As Integer: t = 0
Dim s11 As String
For Each Oble In slancalendar.Controls
Debug.Print TypeName(Oble), Oble.Name
If TypeName(Oble) = "Label" Then
ReDim Preserve BT(0 To t)
Set BT(t).Tb = Oble
t = t + 1
End If
Next
Call setcal(Date) 'инициализация текущей датой
End Sub
Sub setcal(cd As Date) ' cd - заданная дата
ReDim Y&(1 To ylen) ' выделение памяти под массив лет
changing = True ' запрет циклических вызовов
cdt = Date ' текущая дата - для выделения ее в календаре, если присутствует
mon = Month(cd) ' месяц, соответствующий заданной дате(cd)
combomon.ListIndex = mon - 1 ' отображение нужного месяца в списке
Y(ylen) = Year(cd) - Int(ylen / 2) ' начало перода дат в списке
For i = 1 To ylen ' заполнение массива лет
Y(i) = Y(ylen) + i
Next
comboyear.List = Y ' заполнение списка лет
comboyear.ListIndex = Int(ylen / 2) - 1 ' выделение нужного года
d = cd - Day(cd) ' определение начала месяца
d = d - Weekday(d, vbMonday) ' дата начала заполнения календаря(понедельник недели начала месяца)
For i = 1 To 42 ' заполнение чисел календаря
d = d + 1
With Me.Controls("label" & i) ' labelы заранее расположены в соответствующем порядке
.Caption = Day(d) ' число
.Tag = CStr(d) ' дата присваивается тэгу лэйбла, чтобы потом не искать
If Month(d) = mon Then .BackColor = &HC0E0FF Else .BackColor = &H80000004 ' закрашивание лэйблов месяца, соответствующего cd одним цветом, а остальных другим
If d = cdt Then .BackColor = &HFF8080 ' закрашивание текущей даты
End With
Next
changing = False ' окончание инициализации
End Sub
Private Sub UserForm_Initialize()
'Me.StartUpPosition = 0
With Me
w = .Width
End With
combomon.List = Array("январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь")
Call setcal(Date) 'инициализация текущей датой
Относительно прикалываться, вроде статус у меня проходящий мимо и т.д, чтобы писать ересь.
Поставлю вопрос так: Эксель 2003, в графе стоимость необходимо чтобы вверху появились крупные суммы и ниже-ниже.
Ставите курсор на верхнюю строчку (где название столбика), заходите Данные - Фильтр, нажимаете его. У вас появляется фильтр (кнопка). Нажимаете эту кнопку, у вас появляется окно Сортировка от минимального к максимальному, и наоборот. Выбираете что вам нужно. Вы мой пример хоть открывали?
Относительно прикалываться, вроде статус у меня проходящий мимо и т.д, чтобы писать ересь.
Поставлю вопрос так: Эксель 2003, в графе стоимость необходимо чтобы вверху появились крупные суммы и ниже-ниже.
Ставите курсор на верхнюю строчку (где название столбика), заходите Данные - Фильтр, нажимаете его. У вас появляется фильтр (кнопка). Нажимаете эту кнопку, у вас появляется окно Сортировка от минимального к максимальному, и наоборот. Выбираете что вам нужно. Вы мой пример хоть открывали?
Неполучается, потому что ваши цифры в текстовом формате. Прежде чем сортировать, умножте все цифры на 1, чтобы они были в числовом формате и после сортируте.