質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

4120閲覧

VB.NETでカレンダーで現在の日にちに印または色を変えたい

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/05/18 05:22

編集2020/05/18 06:07

前提・実現したいこと

Visual Studio2017のVB.NETでカレンダーを制作しております。
現在の日にちに印またはパネルの色を変えたいです。

また日にちをクリックすると別ページのForm1に画面遷移させたです。

利用環境:Visual Studio2017
WindowsFormで作成しています。

こちらが現在のソースコードになります。

VB.NET

1 2Public Class Form2 3 '-------------------------------------------------------------------------------------------------------- 4 '今日の日付・曜日を取得する 5 '-------------------------------------------------------------------------------------------------------- 6 Private listF1Day As New List(Of FlowLayoutPanel) 7 Private currentDate As DateTime = DateTime.Today 8 '-------------------------------------------------------------------------------------------------------- 9 'Panelの設定 10 '-------------------------------------------------------------------------------------------------------- 11 Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 12 GenerateDayPanel(42) 13 DisplayCurrentDate() 14 End Sub 15 '-------------------------------------------------------------------------------------------------------- 16 '月初めの日にちの設定 17 '-------------------------------------------------------------------------------------------------------- 18 Private Function GetFirstDayOfWeekOfCurrentDate() As Integer 19 Dim firstDayOfMonth As DateTime = New Date(currentDate.Year, currentDate.Month, 1) 20 Return firstDayOfMonth.DayOfWeek + 1 21 End Function 22 '-------------------------------------------------------------------------------------------------------- 23 '月終わりの日にちの設定 24 '-------------------------------------------------------------------------------------------------------- 25 Private Function GetTotalDaysOfCurrentDate() As Integer 26 Dim firstDayOfCurrentDate As DateTime = New Date(currentDate.Year, currentDate.Month, 1) 27 Return firstDayOfCurrentDate.AddMonths(1).AddDays(-1).Day 28 End Function 29 '-------------------------------------------------------------------------------------------------------- 30 '左上年月設定 31 '-------------------------------------------------------------------------------------------------------- 32 Private Sub DisplayCurrentDate() 33 lblMonth.Text = currentDate.ToString("yyyy.MMMM") 34 Addlabel1DayToF1Day(GetFirstDayOfWeekOfCurrentDate(), GetTotalDaysOfCurrentDate()) 35 End Sub 36 '-------------------------------------------------------------------------------------------------------- 37 '右上ボタン 38 '-------------------------------------------------------------------------------------------------------- 39 Private Sub PrevMonth() 40 currentDate = currentDate.AddMonths(-1) 41 DisplayCurrentDate() 42 End Sub 43 44 Private Sub NextMonth() 45 currentDate = currentDate.AddMonths(1) 46 DisplayCurrentDate() 47 End Sub 48 49 Private Sub Today() 50 currentDate = DateTime.Today 51 DisplayCurrentDate() 52 End Sub 53 '-------------------------------------------------------------------------------------------------------- 54 '日付のPanel設定 55 '-------------------------------------------------------------------------------------------------------- 56 Private Sub GenerateDayPanel(ByVal totalDays As Integer) 57 f1Days.Controls.Clear() 58 listF1Day.Clear() 59 60 For i As Integer = 1 To totalDays 61 Dim f1 As New FlowLayoutPanel 62 f1.Name = $"f1Day{i}" 63 f1.Size = New Size(144, 79) 64 f1.BackColor = Color.White 65 f1Days.Controls.Add(f1) 66 f1.BorderStyle = BorderStyle.FixedSingle 67 listF1Day.Add(f1) 68 Next 69 End Sub 70 '-------------------------------------------------------------------------------------------------------- 71 '日付Panelの日にち設定 72 '-------------------------------------------------------------------------------------------------------- 73 Private Sub Addlabel1DayToF1Day(ByVal startDayAtF1Number As Integer, ByVal totalDaysInMonth As Integer) 74 For Each f1 As FlowLayoutPanel In listF1Day 75 f1.Controls.Clear() 76 Next 77 78 For i As Integer = 1 To totalDaysInMonth 79 Dim lbl As New Label 80 lbl.Name = $"lblDay{i}" 81 lbl.AutoSize = False 82 lbl.TextAlign = ContentAlignment.MiddleRight 83 lbl.Size = New Size(122, 22) 84 lbl.Text = i 85 lbl.Font = New Font("Microsoft Sans Serif", 12) 86 listF1Day((i - 1) + (startDayAtF1Number - 1)).Controls.Add(lbl) 87 Next 88 End Sub 89 '-------------------------------------------------------------------------------------------------------- 90 'ボタンの設定 91 '-------------------------------------------------------------------------------------------------------- 92 Private Sub btnPrevMonth_Click(sender As Object, e As EventArgs) Handles btnPrevMonth.Click 93 PrevMonth() 94 End Sub 95 96 Private Sub btnNextMonth_Click(sender As Object, e As EventArgs) Handles btnNextMonth.Click 97 NextMonth() 98 End Sub 99 100 Private Sub btnToday_Click(sender As Object, e As EventArgs) Handles btnToday.Click 101 Today() 102 End Sub 103End Class 104

!イメージ説明明](ffcbf1edd50d013f6f2b614f4971be15.jpeg)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/05/18 05:31

具体的にどの部分が分からないのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/18 05:39

無知で大変お恥ずかしい限りですが、何がわからないかもわかっていないのが現状です。。 実装したいイメージはあるのですがコードそのものの書き方があまりわかりません。。
YAmaGNZ

2020/05/18 05:51

例えば、「本日の色を変更したい」という機能を実装する場合 1.「本日」の月日を求める 2.その月日のパネルがどれか調べる 3.該当のパネルの色を変える といったことをしなくてはなりません。 このうち何が分からないのでしょうか?ということです。 機能を一気に言葉にせず、段階を追って考えて、それのどこが分からないのか考えてみましょう。 また、質問にコードを書く際にはマークダウンを利用しましょう。 https://teratail.com/help/question-tips#questionTips3-7
退会済みユーザー

退会済みユーザー

2020/05/18 05:56

丁寧にアドバイス頂き誠にありがとうございます。 現時点では 1.本日の月日を求める 2.その月日のパネルがどれか調べる がわからない部分になります。
YAmaGNZ

2020/05/18 06:02

落ち着いて編集してください。 ソースコードの部分ではなく、本文の部分がcodeとして囲まれています。 PCであれば、プレビューが見れると思いますので、そちらで表示の確認をしてください。
退会済みユーザー

退会済みユーザー

2020/05/18 06:08

大変申し訳ございません。 修正いたしました。
guest

回答1

0

ベストアンサー

本日が何月何日か得る方法ですが
currentDateの年や月を取得していたりするので、年、月、日を取得する方法は分かるのではないかと思います。

また、本日にあたるパネルの求め方ですが、
左上から右にlistF1Day(0)、listF1Day(1)となっているのは分かるかと思います。
そうなれば、その月の1日のインデックスは分かるのですから、それに本日の日を足してやれば、該当のパネルを求めることができます。
例えば、2020/05の場合の1日はlistF1Day(5)となっているのが分かるはずです。
(これは、実際に日付の数字のラベルを設定しているので求め方は分かるはずです)

このように本日のパネルを求める時に使うものに関しては現在のソースにちりばめられていますので、しっかり理解し考えてみてください。

また、日にちをクリックすると別ページのForm1に画面遷移させたいとのことですが、
これに関しては、各パネルにClickイベントのイベントハンドラを追加する必要があります。

VBNET

1Private Sub GenerateDayPanel(ByVal totalDays As Integer) 2 f1Days.Controls.Clear() 3 listF1Day.Clear() 4 5 For i As Integer = 1 To totalDays 6 Dim f1 As New FlowLayoutPanel 7 f1.Name = $"f1Day{i}" 8 f1.Size = New Size(144, 79) 9 f1.BackColor = Color.White 10 f1Days.Controls.Add(f1) 11 f1.BorderStyle = BorderStyle.FixedSingle 12 13 'クリックイベントのイベントハンドラを追加する 14 AddHandler f1.Click, AddressOf Day_Click 15 16 listF1Day.Add(f1) 17 Next 18End Sub 19 20Private Sub Day_Click(sender As Object, e As EventArgs) 21 'クリックされたオブジェクトをFlowLayoutPanel型にキャストする 22 Dim dayf = DirectCast(sender, FlowLayoutPanel) 23 24 Debug.WriteLine($"{dayf.Name}") 25 26 'ここで日付を求めて、Form1を開く 27End Sub 28

あとは、クリックされたものから日付を求めればよろしいかと思います。

各パネルのTagプロパティに、そのパネルが表示している日を格納しておくと
各処理が楽になるかもしれません。

投稿2020/05/18 06:54

編集2020/05/18 06:55
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/18 07:24

丁寧にありがとうございます。 大変助かりました。
退会済みユーザー

退会済みユーザー

2020/05/19 23:39

お世話になります。 回答いただいたのちに自分自身で試してみたのですが、上手くいきません。 もしよろしければソース例を見せていただく事は可能でしょうか?
YAmaGNZ

2020/05/20 00:33

試してみたソースを提示していただければ、何が原因でうまくいかないのか指摘することは可能だと思います。
退会済みユーザー

退会済みユーザー

2020/05/20 01:28

かなり前に書いたソースということもあって、どのコードがどのような機能を実装しているのか理解できてない状況になります。 ですので、ソースの意味自体がわかっていないのでソース例が戴きたいです。
YAmaGNZ

2020/05/20 01:46

すみません。状況が今一理解できていないのですが、 5/18に質問に提示されたコードに対して、私の回答を見て試された結果思った動作をしなかったのですよね? その試されたコードはどうなっていますか?という問いだったのですが、かなり前に書いたとはどういうことなのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/20 02:03

申し訳ございません。 試したコードに関しては上手くいかず削除してしまいました。 「かなり前に書いたコード」の意味に関しては質問に提示したコードになります。
YAmaGNZ

2020/05/20 02:20

listF1Day(New Date(年, 月, 1).DayOfWeek) これで指定の年月の1日のパネルが分かります。これを元に当日の日の分(例えば20日なら+19)加算すれば当日のパネルが分かりますよね 回答したことのどこが理解出来ていないのかこちらも分かりませんので、そのあたりを教えていただければ、アドバイスできるかと思います。
退会済みユーザー

退会済みユーザー

2020/05/20 02:29

そちらのコードをどちらに入力すればよいのでしょうか?
YAmaGNZ

2020/05/20 02:34

当月を表示する時に処理すればいいのではないですか? まずは、ご自身の書いたコードを理解されることをお勧めします。 このままですと、少し手を加えたいなど修正が発生した場合に何も出来ませんよ
退会済みユーザー

退会済みユーザー

2020/05/20 02:45

度々申し訳ございません。 当日の日の分を加算するとのことですが当日の日を足すソースがいまいちわかりません。
YAmaGNZ

2020/05/20 02:52

New Date(年, 月, 1).DayOfWeek これで指定年月の1日の曜日を0~6であらわすことになります。 それに指定日の日-1を足せばいいことになります。
退会済みユーザー

退会済みユーザー

2020/05/20 03:05

Private Sub DisplayCurrentDate() lblMonth.Text = currentDate.ToString("yyyy.MMMM") Addlabel1DayToF1Day(GetFirstDayOfWeekOfCurrentDate(), GetTotalDaysOfCurrentDate()) End Sub の中で処理すればよいのでしょうか?
YAmaGNZ

2020/05/20 03:19

そこでも出来るでしょうし、そこじゃなくても出来るでしょう。 大事なのは、ご自身がソースを理解して納得して手を入れるということです。
退会済みユーザー

退会済みユーザー

2020/05/20 04:49

ありがとうございます。 あとクリックされたパネルの日付の求め方がわかりません。 度々申し訳ございません。
YAmaGNZ

2020/05/20 04:52

どのパネルがクリックされたかというのは分かりますか?
退会済みユーザー

退会済みユーザー

2020/05/20 04:59

FlowLayoutPanelでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/20 05:04

現在ですが、わかりやすくするためにクリックするとメッセージボックスを出すようにしています。 ですが、日付ではなくパネルの番号が入ってしまいので日付に変更したいです。 Private Sub GenerateDayPanel(ByVal totalDays As Integer) f1Days.Controls.Clear() listF1Day.Clear() For i As Integer = 1 To totalDays Dim f1 As New FlowLayoutPanel f1.Name = $"Day{i}" f1.Size = New Size(144, 69) f1.BackColor = Color.White f1Days.Controls.Add(f1) f1.BorderStyle = BorderStyle.FixedSingle AddHandler f1.Click, AddressOf Day_Click listF1Day.Add(f1) Next End Sub Private Sub Day_Click(sender As Object, e As EventArgs) 'クリックされたオブジェクトをFlowLayoutPanel型にキャストする Dim dayf = DirectCast(sender, FlowLayoutPanel) MessageBox.Show($"{dayf.Name}") 'ここで日付を求めて、Form1を開く Dim lbl As New Label End Sub
YAmaGNZ

2020/05/20 05:25

クリックされたパネルを取得できているのであれば、listF1Dayの中から名前が同じものを探すなどして、listF1Dayの何番目のパネルか取得できるはずです。 クリックされたパネルのインデックス(listF1Dayの何番目)が分かれば、1日が格納されているパネルのインデックスを引けば、そのパネルが何日のパネルなのか分かります。 例えば、クリックされたパネルが12番目のパネルで1日のパネルが5番目だった場合 12-5+1で8日となります。 表示している年月は分かるので、それらと組み合わせれば、クリックしたパネルが示す日付を求めることが出来ます。
YAmaGNZ

2020/05/20 05:31

ただ、Addlabel1DayToF1Dayにてそのパネルにいつの日付を表示するのかわかるので listF1Day((i - 1) + (startDayAtF1Number - 1)).Tag = New Date(currentDate.Year, currentDate.Month, i) といった感じでTagプロパティに日付を入れてやれば、 クリックイベントにて Dim ClickDate = dayf.Tag とすれば、クリックしたパネルの日付をすぐに取得できます。 こういう意味で、回答に 各パネルのTagプロパティに、そのパネルが表示している日を格納しておくと 各処理が楽になるかもしれません。 と書きました。
退会済みユーザー

退会済みユーザー

2020/05/20 06:02

ありがとうございます。 無事にできました! あとは Private Sub Day_Click(sender As Object, e As EventArgs) 'クリックされたオブジェクトをFlowLayoutPanel型にキャストする Dim dayf = DirectCast(sender, FlowLayoutPanel) Dim ClickDate = dayf.Tag MessageBox.Show($"{ClickDate}") End Sub にしたときに時間まで表記されるのですがどうすれば消せますでしょうか? ToStringを使用したところエラーが出てしまいました。
YAmaGNZ

2020/05/20 06:05

どのように記述して、どのようなエラーが出たのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/20 06:11

Private Sub Day_Click(sender As Object, e As EventArgs) 'クリックされたオブジェクトをFlowLayoutPanel型にキャストする Dim dayf = DirectCast(sender, FlowLayoutPanel) 'ここで日付を求めて、Form1を開く Dim ClickDate = dayf.Tag MessageBox.Show($"{ClickDate.ToString("yyyy.MMMM")}") End Sub このようにしたところエラーが”正しくない形式です”と出ました。
YAmaGNZ

2020/05/20 06:33

Dim ClickDate As Date = dayf.Tag と型を指定すればよろしいかと思います。 また、日付を確認するのに何故月までしか表示しないのでしょうか? あと注意点としては、 表示月を変更した時の空白部分のTagプロパティをどうするか 空白部分をクリックした時の対応 を考える必要があります。 これについては、Tagプロパティに空白と分かる値を入れて、クリック時に空白を示す値であれば無視をするという対応を行えばよろしいかと思います。
退会済みユーザー

退会済みユーザー

2020/05/20 06:49

If文はわかるのですが、何もしない処理の時はThenの後に何を入れるべきでしょうか?
YAmaGNZ

2020/05/20 07:15

何かする場合にIf文内に入るようにすれば、何かしない場合は実行されませんよ
退会済みユーザー

退会済みユーザー

2020/05/26 05:01

度々申し訳ございません。 現在の日にちパネルの背景色を変えるコードについてですが listF1Day(New Date(currentDate.Year, currentDate.Month, i).DayOfWeek).BackColor =Color.Yellow で最初の週を0~6であらわすのはわかったのですが、そこから現在の日を表すコードがわかりません。
YAmaGNZ

2020/05/26 05:15

前にコメントした --- listF1Day(New Date(年, 月, 1).DayOfWeek) これで指定の年月の1日のパネルが分かります。これを元に当日の日の分(例えば20日なら+19)加算すれば当日のパネルが分かりますよね --- これを良く考えてください。
退会済みユーザー

退会済みユーザー

2020/05/26 05:20

listF1Day(New Date(年, 月, 1).DayOfWeek+(i-1)) +当日の日ー1という認識でこのコードになるのですがうまく動かないです。。
YAmaGNZ

2020/05/26 05:30

私には 先ほどのコメントの listF1Day(New Date(currentDate.Year, currentDate.Month, i).DayOfWeek) と今のコメントの listF1Day(New Date(年, 月, 1).DayOfWeek+(i-1)) は違った意味のコードに見えますがどういうことですか? また、うまく動かないとはどういう動きをすることですか? ここでいう「i」とは何を指す変数ですか? VisualStudioを使用してのデバッグしていますか? ステップ実行するなどして、自分で作ったプログラムがどう動くか確認するのは必須です
退会済みユーザー

退会済みユーザー

2020/05/26 05:38

最初のiは間違っておりました。 listF1Day(New Date(currentDate.Year, currentDate.Month, 1).DayOfWeek+(i-1)) iは1日から月終わりのまでのパネルを指す変数です。 上記のソースですと日にちが入っているパネル全ての色が変わってしまいます。。
YAmaGNZ

2020/05/26 05:59

iが1日~月末までを指す(多分ループで回しているのだとは思いますが)のであれば、1日~月末まで色が変わるのは当たり前じゃないですか? 私が書いたのは「当日の日」であって、「当日の日」以外を処理するようには書いてないのですが・・・ ご自身が手を入れたコードを理解していないということですよね?
退会済みユーザー

退会済みユーザー

2020/05/26 06:34

お恥ずかしい話ですが自分で書いたコードがあまり理解できておりません。 当日の日と当日の日以外の区別もあいまいなのが現状です。 ご迷惑をおかけし大変申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問