Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
Calenderコントロールが利用できないのでDateTimePickerを利用したい
投稿日時: 18/03/19 07:06:35
投稿者: SweetHornet

皆様 おはようございます。
 
SweetHornet@徹夜明け と申します。
 
Excel2007で Calenderコントロールを
利用して、日付を選択できるように
していました。
 
PCの老朽化更新後、Office365を利用する
ようにしたところ、これが利用できなく
なっていることに今更ながら気づきました。
 
GoogleやらYahooなどのブログから
Visual StudioでのVBであればFormにて
"System.Windows.Forms.DateTimePicker"が
利用できることを知りました。
 
Excel-VBAでDateTimePickerを利用するには
どのようにすればよろしいでしょうか。
 
実施したいことは
・表示するときの規定値として、任意の
 日付を設定すること
 
・日付をユーザが選択したときに
 指定した日付をDateか、
 Variable(Date)で受け取れること。
 
・開発==>挿入のコントロールにて
 DateTimePickerが挿入できるようになること
 
について、実施できればと考えております。
 
お手数をおかけして申し訳ないのですが
御教示願えればと思います。
 
 
 
追記
(1) 参照設定は"System.Windows.Forms"は
  ツール→参照設定で選択済です。
 
(2) 必要と思われる URLについては
  下記となるようです。
 
  MSDN:DateTimePicker クラス
    https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker(v=vs.110).aspx
 
  *MSDNでの記載より転載
   https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker(v=vs.110).aspx
  名前空間: System.Windows.Forms
  アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)
 
(3) カレンダーコントロールは
  Office2007は利用可能だが
  それ以後の版では利用不可となるもよう。

投稿日時: 18/03/19 07:16:14
投稿者: SweetHornet

Excel-VBAでの開発はやっていたものの VBの知識不足でして...
 
ExcelVBAで作成していたものについては、textboxへ変更して
利用したので、とりあえずはなんとかごまかした。って感じに
なっています。
 
お手数をおかけして、申し訳ないのですが
御教示願えればと思いまして、書き込みさせて頂きました。
 
*ユーザのおばちゃんの怒る顔が浮かびますが
 まぁしょうがない。頑張ります。
 

回答
投稿日時: 18/03/19 09:37:23
投稿者: WinArrow
投稿者のウェブサイトに移動

↓のページが参考になりませんか?
 
https://surleconomiejp.blogspot.jp/2015/11/excel-vbadatepicker.html

投稿日時: 18/03/19 09:44:49
投稿者: SweetHornet

WinArrow さんの引用:
↓のページが参考になりませんか?
 
https://surleconomiejp.blogspot.jp/2015/11/excel-vbadatepicker.html

 
早々に回答ありがとうございます
 
確認致しましたところ、残念なことにできないことを
確認致しました。
 
*Date and Time picker control 6.0 (SP6)
についてなのですが、開発用PC並びにユーザのPC
(Offfice365導入済みの新しいPC)にも入っていないようでした。
 
*旧PCについては破棄に回ってしまったとのことで
 確認できず...
 
これについては、VB6時代かOffice2007あたりまでに
入っていたもので現在は削除されてしまった
カレンダーコントロールのものではと考えております。

投稿日時: 18/03/19 09:57:40
投稿者: SweetHornet

一つ書き忘れました
 
当件の質問とは関係なさそのなのですが
Windows 10 Creators Update を利用している場合に
DateTimePickerが動作しない状態となるようです
 
−−−−
現象
 
Windows 10 Creators Update において、DateTimePicker コントロールの年月日の入力および表示が正しく機能しない現象が確認されています。
具体的には以下 (A)、(B)、(C) いずれかの条件で DateTimePicker コントロールを使用した際に発生する場合があります。
 
(A)Win32 の場合、date and time picker controls
(B)MFC の場合、CDateTimeCtrl
(C)Windows フォーム アプリケーションの場合、DateTimePicker
−−−−
原因
 
Windows 10 Creators Update に含まれる、DateTimePicker コントロールの不具合が原因です。
 
DateTimePicker コントロールは、コモンコントロールと呼ばれるコントロール群に含まれています。
コモンコントロールには、バージョン 5 とバージョン 6 が用意されていますが、バージョン 5 の DateTimePicker コントロールに不具合が確認されています。
−−−−
回避策
本現象は、以下の KB4022725 の更新プログラムにより修正されました。
KB4022725 の更新プログラムは、Windows Update により自動的にダウンロードされ、インストールされます。−−−−
 
 
Windows 10 Creators Update において、DateTimePicker コントロールの表示や入力が正しく機能しない場合がある
 
https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2017/04/28/windows-10-creators-update-%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%81datetimepicker-%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%82%84%E5%85%A5%E5%8A%9B/
 
JAPAN Platform SDK Support Team2017年4月28日
-----

投稿日時: 18/03/19 10:29:29
投稿者: SweetHornet

WinArrow様
早々に回答 誠にありがとうございました。
 
その後、頂いたページを元に調査を進めました。
------
御教示頂いたページの中には
https://surleconomiejp.blogspot.jp/2015/11/excel-vbadatepicker.html
「mscomct2.ocxをマイクロソフトからダウンロードします。」
との記載があります。
------
 
 
------
下記のマイクロソフトのページでは
Microsoft Visual Basic 6.0 コモン コントロールの
ファイル名が"mscomctl.ocx および comctl32.ocx"で
あることが記載されています。
 
Microsoft Visual Basic 6.0 コモン コントロールである mscomctl.ocx および comctl32.ocx の更新
https://www.microsoft.com/ja-jp/download/details.aspx?id=10019
 
Visual Basic 6.0 のメインストリーム サポートは 2005 年 3 月 31 日に終了しております。
------
 
 
------
MSDN:
VB 6.0 ユーザーのための VB .NET 移行ガイド - 標準コントロール
 
https://msdn.microsoft.com/ja-jp/library/dd297722.aspx
 
新しい便利なコントロールの紹介
 
DateTimePicker コントロール
コンボボックスの右のドロップダウン矢印をクリックすると、
カレンダーが表示され、その一覧から日付を選択することができます (図 7)。
------
 
 
以上のことから、御教示頂いたページでの
ファイル名:mscomct2.ocx は誤記で
"mscomctl.ocx および comctl32.ocx"が
正しいファイル名であると思いますが
上記の情報から、VB6の標準コントロールを
ダウンロードしようとしていると思われますので
Office365の環境ではダメではないかと思います。
 

投稿日時: 18/03/19 10:35:24
投稿者: SweetHornet

 
 
−−−−
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.datetimepicker.aspx
 
ユーザーが日時を選択し、書式を指定して日時を表示できる Windows コントロールを表します。
 
名前空間: System.Windows.Forms
アセンブリ: System.Windows.Forms (System.Windows.Forms.dll 内)
−−−−
というところから、"System.Windows.Forms"を
参照することで、利用できると判断致しました。
 

回答
投稿日時: 18/03/19 21:34:06
投稿者: Abyss2

お互い土台が異なるので、.NETの「Windowsコントロール」を
VBA上(Userformなど)利用する事は「不可能」です。
 
OCXファイルがサポート切れになっている現在、直接Win32APIを利用するか
またはサードパーティーが用意しているVBA用コントロールを利用する事になるでしょうね。
 
まずは、下記テストを実行してみてください。
 
Frame1
1)新規ユーザーフォールにフレームコントロールを一つ追加する。
  (これは、DateTimePickerの親として働いてもらうため)
  フレームコントロールの大きさは、横102、縦18ポイントでいいでしょう
 
Class1
2)直接Userformモジュールに記述してもいいが、将来部品として使う事を想定し
  クラスモジュールにDateTimePicker本体を記述する。
 
【ソース】
UserForm1

Private Sub UserForm_Initialize()
    Dim cc As Class1
    Set cc = New Class1
    
    cc.CreateDTPicker Frame1
    
End Sub

Class1
Private Declare PtrSafe Function CreateWindowExW Lib "User32" _
    (Optional ByVal dwExStyle&, _
     Optional ByVal lpClassName As LongPtr, _
     Optional ByVal lpWindowName As LongPtr, _
     Optional ByVal dwStyle&, _
     Optional ByVal x&, Optional ByVal y&, _
     Optional ByVal nWidth&, Optional ByVal nHeight&, _
     Optional ByVal hwndParent As LongPtr, _
     Optional ByVal hmenu As LongPtr, _
     Optional ByVal hInstance As LongPtr, _
     Optional ByVal lpParam As LongPtr) As LongPtr

Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const DATETIMEPICK_CLASS = "SysDateTimePick32"

Friend Function CreateDTPicker(ByVal Parent As Frame) As LongPtr
    Dim hwndParent As LongPtr
    Dim ctl As Control
    Dim acc As IAccessible
    Dim wd As Long, ht As Long
    
    Parent.Caption = vbNullString
    Parent.BorderStyle = fmBorderStyleNone
    'Set ctl = Parent.Controls.Add("Forms.CheckBox.1")
    'ctl.Height = 0
    
    Set ctl = Parent: hwndParent = ctl.[_GethWnd]
    Set acc = Parent: acc.accLocation 0, 0, wd, ht
    
    Dim pStr As LongPtr: pStr = StrPtr(DATETIMEPICK_CLASS)
    Dim flg As Long: flg = WS_CHILD Or WS_VISIBLE
    
    CreateDTPicker = CreateWindowExW(, pStr, , flg, , , wd, ht, hwndParent)
    
End Function

※ここまでは目視確認のためのソースですのでいろいろ拡張する必要があります。

回答
投稿日時: 18/03/19 21:44:48
投稿者: Abyss2

頑張ればリンク先画像のような表現が可能になります。
 
Visual Style適用なし(デフォルト)
https://i.imgur.com/bKKkPEM.png
 
Visual Style適用あり
https://i.imgur.com/PueChg9.png
 

回答
投稿日時: 18/03/19 22:48:14
投稿者: MMYS

素の状態の Excel ではカレンダーコントロールは使用出来ません。
別のソフトで使用するために たまたま入っていただけです。
http://addinbox.sakura.ne.jp/Excel_Tips06.htm
 
単に、カレンダーコントロールを使いたいだけなら
次のキーワードで検索して下さい。
 
検索キーワード
  excel カレンダーコントロール 自作
 
 
以下補足、
VBAとVB.Netは別物。似て非なるものです。
 
VBA  → ExcelなどのOfficeアプリケーション上だけで動作。
VB.Net → Net Frameworkで動作。Net FrameworkはWindowsに標準で入ってます。
 
DateTimePicker はNET Frameworkです。
VBAからは使用出来ません。
 
VBAはVB6.0から派生したのもなので VB6.0用コントロールは使用可能ですが
Windows10で動作するかは分かりません
 
 

投稿日時: 18/03/20 08:30:05
投稿者: SweetHornet

Abyss2様
 
回答 誠にありがとうございます。
しかもサンプルまで!!
 
試してみます。
ありがとうございます。 m(_ _)m
 
MMYS様
回答 誠にありがとうございます。
 
> 素の状態の Excel ではカレンダーコントロールは使用出来ません。
> VBAとVB.Netは別物。似て非なるものです。
 
承知致しました。精進致します。 m(_ _)m