Доброе. Имеется код который убирает крестик в UserForm. Возможно ли его доработать так, что бы заголовок UserForm выравнивался по центру имел шрифт "Times New Roman", жирный, размер 14.
Код
Private Const GWL_STYLE As Long = -16& 'для установки нового вида окна
Private Const GWL_EXSTYLE = -20& 'для расширенного стиля окна
Private Const WS_CAPTION As Long = &HC00000 'определяет заголовок
Private Const WS_BORDER As Long = &H800000 'определяет рамку формы
'Функции API, применяемые для поиска окна и изменения его стиля
#If VBA7 Then
Private Declare PtrSafe Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
Private Declare PtrSafe Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
Private Declare PtrSafe Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function DrawMenuBar Lib "User32" (ByVal hwnd As LongPtr) As Long
#Else
Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As Long) As Long
#End If
Sub NoQueryClose(FormName As String)
Dim ihWnd, hStyle
'ищем окно формы среди всех открытых окон
If Val(Application.Version) < 9 Then
ihWnd = FindWindow("ThunderXFrame", FormName) 'для Excel 97
Else
ihWnd = FindWindow("ThunderDFrame", FormName) 'для Excel 2000 и выше
End If
'получаем информацию о найденном окне(стили и т.д.)
hStyle = GetWindowLong(ihWnd, -16&)
'убираем кнопку крестика
SetWindowLong ihWnd, -16&, hStyle And Not &H80000
End Sub
Доброе. У меня не получается с помощью кода создать TextBox и ограничить ввод символов. Подскажите, как реализовать? Так же нужно, что бы во время ввода пропадал Label1 а если TextBox пустой Label1 появлялся.
Доброе, помогите реализовать идею. В файле Word Есть UserForm в которой имеются TextBox (Фамилия, имя, отчество), так же две кнопки, "Добавить" и "База". Каким образом можно сделать что бы при нажатии кнопки добавить ФИО сохранялось в Excel а при нажатии кнопки База открывается еще окно со списком ранее сохранённых ФИО при выборе нужного человека, TextBox заполняется выбранными данными.
Доброе. Решил поделиться своим решение автоматического форматирования даты в TextBox. Возможно кому-то пригодится. Так же выкладываю для обсуждения и критики. Я не очень опытный в плане написания кода так что возможно код окажется примитивным. Буду рад любой критике и любым предложениям по доработке.
Из возможностей: Возможно вводить только цифры, точку и подчёркивание При нажатии кнопки Tab сразу вставляется текущая дата Так же если ввести число и нажать Tab то сразу вставляется текущий месяц и год Там есть еще много разных комбинаций, в общем тестируйте кому интересно)
Единственная проблема которую не смог решить это авто постановка точек. Желаемый результат: что бы при вводе 2 и 5-го символа точка ставилась сразу, однако в таком варианте не получается потом точку удалить в случае необходимости. Текущий результат: точка делит цифры на части при попытке ввести 3 и 6-й символ, в таком случае пользователь может сам нажимать всегда точку и даже не узнать что мог этого не делать)
Добрый вечер Уважаемые форумчане. Подскажите как ревизовать. На UserForm находится ComboBox в который необходимо вводить определённые данные если данные не верны то при переходе к следующему ComboBox появляется MsgBox. Однако в той ситуации когда введены не верные данные а пользователь просто хочет закрыть UserForm это уведомление не нужно. Хочу в событие Exit из ComboBox добавить проверку на предмет закрытия UserForm, если UserForm закрыто то Exit sub.
Или возможно в Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) прописать что-то что не позволит выполнять какие либо действия другим объектам
Доброго Помогите реализовать. В UserForm есть TextBox в который пользователь должен ввести дату. Идея заключается в том, когда человек ввел число, например 12 то сразу автоматом ставится точка, потом он вводит 10 и так же подставляется точка, дальше может быть два развития события либо человек написал 2019 и его курсор автоматический переводится на следующий TextBox или он просто пишет 19 и перейдя на следующий TextBox либо с помощью Tab или курсором 12.10.19 переделывается в 12.10.2019. Так же нужно что бы можно было писать только цифры и подчеркивание "_".
Доброе Уважаемые форумчане. Меня мучает один вопрос и я решил спросить опытных людей.
У меня есть много текстбоксов в итоге их будет около 30 в каждом текст боксе буду свои правила форматирования текста. Вопрос в следующем. В данном случае есть ли смысл в переменных? я имею в виду не глупо будет присваивать переменной txt_surname, как вообще делают в таких случаях опытные люди?
Код
Dim Фамилия As String = txt_surname.Text
плохо что я использую русские имена для переменных? есть ли в этом смысл, возможно в такой ситуации переменная это просто лишнее? возможно такое действие благотворно влияет на программу и операции будут проходить быстрее?
В качестве примера приведу программный которым я сейчас занимаюсь (особая благодарность Ігор Гончаренко)
Код
' *****************************************************************************
' ComboBox Кызы \ Оглы
'
Private Sub cbo_kz_og_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If cbo_kz_og.Text = "" Then lbl_kz_og.Visible = True
End Sub
Private Sub cbo_kz_og_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyTab Then Exit Sub
If lbl_kz_og.Visible = True Then lbl_kz_og.Visible = False
End Sub
' *****************************************************************************
' TextBox Фамилия
'
Private Sub txt_surname_Enter()
ВключитьРусскуюРаскладку
End Sub
Private Sub txt_Surname_Change()
If txt_surname.Text <> "" Then txt_surname.Text = Up1Letter(txt_surname.Text)
End Sub
Private Sub txt_Surname_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If txt_surname.Text = "" Then lbl_surname.Visible = True
txt_surname = Trim(txt_surname)
End Sub
Private Sub txt_surname_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyTab Then Exit Sub
If lbl_surname.Visible = True Then lbl_surname.Visible = False
If KeyCode = vbKeyDelete Then
If txt_surname > "" Then
txt_surname.Value = ""
End If
End If
End Sub
' *****************************************************************************
' TextBox Имя
'
Private Sub txt_name_Enter()
ВключитьРусскуюРаскладку
End Sub
Private Sub txt_name_Change()
If txt_name.Text <> "" Then txt_name.Text = Up1Letter(txt_name.Text)
End Sub
Private Sub txt_name_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If txt_name.Text = "" Then lbl_name.Visible = True
End Sub
Private Sub txt_name_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = vbKeyTab Then Exit Sub
If lbl_name.Visible = True Then lbl_name.Visible = False
If KeyCode = vbKeyDelete Then
If txt_name > "" Then
txt_name.Value = ""
End If
End If
End Sub
Logistic, не вижу ничего плохого в том что я на разных форумах одно и тоже пишу.... часто бывает что в одном месте ни кто не ответил а в другом очень бурная дискуссия началась...
Доброго. Помогите реализовать. Нужно что бы при появление UserForm в TextBox1,2,3,4 были надписи Фамилия, Имя, Отчество, Дата рождения. --Текст серый и полупрозрачный. --Как только нажимаешь на поле или переходишь на поле с помощью Tab текст пропадает и вводишь то, что нужно. --Если в поле нечего не вводилось, то текст с информацией должен появиться снова. --Так же в TextBox Фамилия, Имя, Отчество нужно сделать, так что бы первая буква автоматический становилась заглавной, а другие строчными (на случай если регистр перепутал). --В поле дата рождения нужно, что бы текст сам подгонялся под формат дата, к примеру, если я написал 2101999 или 2 11 1999 или 02 октября 1999 а так же 02октября1999 после перехода на другое поле с помощью Tab или курсора мыши введенное значение должно стать 02.10.1999 --в случае когда в это поле было введено любое другое значение, которое ни как не связано с датой, на 5 сек. должно появиться всплывающее уведомление о том, что формат даты не верен, автоматически заполняем поле датой 11.04.1992, фокус на поле дата рождения и выделяем весь текст в поле, начиная с левого края. --Нужно чтобы исправления, например, в поле Фамилия происходили сразу, как перешёл на другое поле с помощью Tab ли курсора мыши.
Так же есть просьба.... в коде писать описание что делается и зачем.
Юрий М, Я не хочу захламлять листами свой проект. Плюс ко всему такого способа в гугле не нашел и стало интересно возможно ли это))) Видимо Вариантов не много либо масив либо реестр... но в реестре хранить не удобно но это было интересно)
А возможно программно изменить код? на подобие как тут. Просто что бы при нажатие "+" в UserForm_Initialize() Добавлялось строка ComboBox1.AddItem "новый текст"
Как то давно на Word находил такую формулу. Для того что бы ComboBox запоминал последнее значение которые выбирал пользователь.
Код
Private Sub UserForm_Initialize()
ComboBox1.AddItem "Иванов"
ComboBox1.AddItem "Петров"
ComboBox1.AddItem "Сидоров"
Dim i As Integer
On Error Resume Next
i = CInt(ThisDocument.Variables("Combobox1LastChoice").Value)
If Err.Number <> 0 Then Err.Clear
ComboBox1.ListIndex = i
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Dim var As Variable
For Each var In ThisDocument.Variables
If var.Name = "Combobox1LastChoice" Then
Exit For
End If
Next
If var Is Nothing Then
ThisDocument.Variables.Add "Combobox1LastChoice", ComboBox1.ListIndex
Else
var.Value = ComboBox1.ListIndex
End If
End Sub
Возможно что то подобное можно придумать для Excel ну естественно что бы Лист запоминался.
Dim t$, i As Variant
t = "Premix Drops"
i = Application.Match(t, ComboBox1.List, 0)
If Not IsError(i) Then
MsgBox t & " уже есть с списке и мы его уничтожим ", vbCritical, ""
ComboBox1.RemoveItem i - 1
Else
ComboBox1.AddItem t
End If
Единственный недостаток это то что после того как закрываешь UserForm все возвращается в исходное состояние. Как доработать?
Доброго и с Наступающим. Помогите реализовать. В UserForm есть ComboBox добавил в него значения с помощью такой формулы
Код
Private Sub UserForm_Initialize()
ComboBox1.List = Array("Capella", "DIY Flavor Shack", "Flavor West", "Flavorah", "Inawera")
End Sub
Как в таком случае добавить новые элементы в Userform и удалить старые, а так же добавить предупреждение что в списке такой элемент уже присутствует? Мне нужно что бы не было связи ни с диапазоном ни с ячейками.
Sanja, В UserForm у меня два а в дальнейшем больше Combobox два из них взаимосвязаны ( возможно это важно) В одном списке я выбераю округ в другом район и после того как я закрываю диалоговое окно нужно что эти данные сохранились. то есть при новом открытии UserForm были уже выбраны предыдущие данные.