我有一个日期由3个文本框和一个微调框组成的表单。 我使用了3个文本框来解决国际日期的问题,因此Excel无法根据不同的格式误解预期的日期。
总之... 单击微调器时,下一个或上一个日期将显示在3个框中。即如果它是2013年2月28日,它将在2013年3月1日。它一次移动一天。
我的老板希望它根据光标所在的文本框移动。所以如果它在txtMonth中,日期应该从2013年2月28日到2013年3月28日等等。
如何让微调器检测哪个文本框包含光标(如果有的话)?一旦我知道,我就可以进行数学计算。
Private Sub spinDate_SpinDown()
Dim bGoodDate As Boolean
Dim iMonth As Integer
Dim dDate As Date
If Not bIsValidDate(bGoodDate) Then ' Check that the 3 boxes make a valid date
GoTo ErrorExit
End If
iMonth = Month(DateValue("01-" & Me.txtMon & "-2014"))
dDate = DateValue(Me.txtDay & "-" & Me.txtMon & "-" & Me.txtYear)
dDate = DateAdd("d", -1, dDate) ' Decrement date
Me.txtDay = Format(Day(dDate), "00")
Me.txtMon = Format(dDate, "mmm")
Me.txtYear = Format(Year(dDate), "0000")
m_clsCRE.ETA = dDate
m_clsCRE.bChanged = True
ErrorExit:
End Sub
* 更新解决方案 ** '此解决方案检测光标是在日,月或年框中的最后一个。 '旋转按钮按所选数量(日,月或年)递增 '这些框是链接的,因此旋转会根据您的选择将您带到下一个有效日期
Private Sub spinDate_SpinDown() ' Same for SpinUp but used +1
Dim bGoodDate As Boolean
Dim dDate As Date
If Not bIsValidDate(bGoodDate) Then ' check that date user typed in boxes is valid
GoTo ErrorExit
End If
dDate = DateValue(Me.txtDay & "-" & Me.txtMon & "-" & Me.txtYear)
If Len(msDatePart) = 0 Or StrComp(msDatePart, "DAY", vbTextCompare) = 0 Then
dDate = DateAdd("d", -1, dDate)
ElseIf StrComp(msDatePart, "MONTH", vbTextCompare) = 0 Then
dDate = DateAdd("m", -1, dDate)
Else ' Year
dDate = DateAdd("yyyy", -1, dDate)
End If
Me.txtDay = Format(Day(dDate), "00")
Me.txtMon = Format(dDate, "mmm")
Me.txtYear = Format(Year(dDate), "0000")
m_clsCRE.ETA = dDate ' Save real date value (not text form)
m_clsCRE.bChanged = True
ErrorExit:
End Sub
Private Sub txtDay_Enter()
' Used with calendar spinner
msDatePart = "DAY"
End Sub
Private Sub txtMon_Enter()
' Used with calendar spinner
msDatePart = "MONTH"
End Sub
Private Sub txtYear_Enter()
' Used with calendar spinner
msDatePart = "YEAR"
End Sub
答案 0 :(得分:1)
我不确定如何检测焦点上的当前对象。
作为初步解决方法,您可能会在下面看到我的代码。我们检测到enter
事件“输入”文本框的时间,而不是检测焦点上的对象。然后我们使用全局变量来存储该文本框的名称
Option Explicit
'Declare a global variable here
Dim onFocus As String
Private Sub SpinButton1_SpinDown()
Dim obj As Object
Set obj = Controls(onFocus)
obj.Value = obj.Value + 1
End Sub
Private Sub TextBox1_Enter()
onFocus = "TextBox1"
End Sub
Private Sub TextBox2_Enter()
onFocus = "TextBox2"
End Sub
Private Sub TextBox3_Enter()
onFocus = "TextBox3"
End Sub
Private Sub UserForm_Initialize()
Controls("Textbox1").SetFocus
End Sub
答案 1 :(得分:1)
试试这个:
此代码会在按下TextBox
之前检测到具有焦点的最后SpinButton
请注意,一旦将焦点设置在另一个对象上,Textbox
或任何其他对象将失去焦点。
Option Explicit
Public LastActiveObject As String 'Declare a public variable to store the last active object name
Private Sub SpinButton1_SpinDown() 'Here you test which Textbox was last active
If LastActiveObject = "TextBox1" Then MsgBox "TB1"
If LastActiveObject = "TextBox2" Then MsgBox "TB2"
If LastActiveObject = "TextBox3" Then MsgBox "TB3"
End Sub
在所有TextBox上添加Exit事件,将其名称存储在LastActiveObject
变量
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
LastActiveObject = TextBox1.Name
End Sub
Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
LastActiveObject = TextBox2.Name
End Sub
Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean)
LastActiveObject = TextBox3.Name
End Sub
希望这可以帮助你完成你想要的任务。