2016-08-15 170 views
0

我發現這個驚人的日期選擇器形成一個可供用戶自定義用於Excel版本的不支持日曆控件的團隊。 我將此添加到我的另一個WB,以便每次用戶單擊需要日期的列時,都會顯示datepicker用戶窗體,然後在單元格中輸入所選日期。自定義日期選擇器彈出窗口excel 2010

現在我正嘗試將這與我創建的用戶窗體一起使用。我添加了一個文本框,當用戶窗體打開時自動填充今天的日期,但我想以某種方式獲取datepickerform在點擊日期文本框時彈出。我添加了private sub textbox_change() datepickerform.show,但我正在收到一個運行時錯誤91「對象變量或塊變量未設置」。

調試器將我帶到DatePickerForm代碼的這一部分,並突出顯示第一行。

Private Sub UserForm_Activate() 

If IsDate(Target.Value) Then 
    Calendar1.Value = Target.Value 
End If 

Call MoveToTarget 

End Sub 

這是標記,因爲我的文本框不是日期格式? 我可以根據要求分享完整的代碼,這只是它的很多,我不想添加到我已經很長的帖子。

這裏是爲datepickerform代碼:

Option Explicit 


Private WithEvents Calendar1 As cCalendar 

Public Target As Range 

Private Sub Calendar1_Click() 
    Call CloseDatePicker(True) 
End Sub 

Private Sub Calendar1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 
    If KeyCode = vbKeyEscape Then 
     Call CloseDatePicker(False) 
    End If 
End Sub 

Private Sub UserForm_Initialize() 
    If Calendar1 Is Nothing Then 
     Set Calendar1 = New cCalendar 
     With Calendar1 
      .Add_Calendar_into_Frame Me.Frame1 
      .UseDefaultBackColors = False 
      .DayLength = 3 
      .MonthLength = mlENShort 
      .Height = 120 
      .Width = 180 
      .GridFont.Size = 7 
      .DayFont.Size = 7 
      .Refresh 
     End With 
     Me.Height = 153 'Win7 Aero 
     Me.Width = 197 
    End If 
End Sub 



Public Sub MoveToTarget() 
    Dim dLeft As Double, dTop As Double 

    dLeft = Target.Left - ActiveWindow.VisibleRange.Left + ActiveWindow.Left 
    If dLeft > Application.Width - Me.Width Then 
     dLeft = Application.Width - Me.Width 
    End If 
    dLeft = dLeft + Application.Left 

    dTop = Target.Top - ActiveWindow.VisibleRange.Top + ActiveWindow.Top 
    If dTop > Application.Height - Me.Height Then 
     dTop = Application.Height - Me.Height 
    End If 
    dTop = dTop + Application.Top 

    Me.Left = IIf(dLeft > 0, dLeft, 0) 
    Me.Top = IIf(dTop > 0, dTop, 0) 
End Sub 


Sub CloseDatePicker(Save As Boolean) 
    If Save And Not Target Is Nothing And IsDate(Calendar1.Value) Then 
     Target.Value = Calendar1.Value 
    End If 
    Set Target = Nothing 

    Me.Hide 
End Sub 
+0

日曆日期選擇器是它自己的對象,並且必須在您的用戶表單中創建。用戶窗體的初始化代碼可以創建該日期選擇器對象,並在用戶窗體上選擇日期控件時取消隱藏它。運行時錯誤正在抱怨,因爲您尚未在任何地方創建日期選擇器對象。如果要在用戶窗體之外創建日期選取器對象,則創建用戶窗體的屬性以將外部日期選擇器對象分配給用戶窗體變量。 – PeterT

+0

經過一段時間的玩,我得到了自定義日期選擇器表單彈出時,當我選擇我的主要用戶表單的指定文本框,但是當我選擇一個日期,它不會改變文本框的值。我實際上完全不用上面的userform activate,它會彈出並正確關閉,它只是不更新​​文本框的值。 – Awill

+0

沒有看到日期選取器的代碼,或瞭解更多關於它的信息,我無法告訴日期選取器對象如何/如何更新,即如何將日期選擇器連接到您的文本框(或工作表單元格,或任何其他)。 – PeterT

回答

0

這是比我想象的,我想我只是在想代碼的複雜性往往倍,我很新的VBA,幾乎沒有更簡單知道多少。

我改變了關閉字符串,並沒有任何問題呢。

Sub CloseDatePicker(Save As Boolean) 

myUserForm.myTextBox.Text = Calendar1.Value 

    Me.Hide 
End Sub 

如果有人對此感興趣,我想我已經得到了我的最終產品。我把我的主要用戶表單放在按鈕單擊上並使用此編碼將其居中置於活動的Excel窗口中(我使用雙顯示器,用戶窗體不能正確顯示,使用基本設置,它們會在非活動屏幕上彈出)

Sub ShowForm() 

With Audit_Criteria 
    .StartUpPosition = 0 
    .Left = Application.Left + (0.5 * Application.Width) - (0.5 * .Width) 
    .Top = Application.Top + (0.5 * Application.Height) - (0.5 * .Height) 
    .Show 
End With 
End Sub 

然後,當用戶在用戶窗體上選擇「日期」文本框時,將彈出日期選擇窗體,並與位於用戶窗體右上角的文本框重疊。

Private Sub tbDOS_Enter() 
With DatePickerForm 
    .StartUpPosition = 0 
    .Left = Application.Left + (0.5 * Application.Width) - (0.01 * .Width) 
    .Top = Application.Top + (0.5 * Application.Height) - (1.5 * .Height) 
    .Show 
End With 
End Sub 

我不知道是否有通過識別文本框的位置,並從它抵消了日期選擇這樣做的一個簡單的方法,但它是我抵達,並與我的經驗不足,不知道的另一種方法。