- ベストアンサー
excelvbaのweekday関数の比較
下記のようなプログラムを書きましたが、 weekday関数の戻り値との比較ができません。 お分かりになる方、ご教授お願いします。 フォームには、 コンボボックス "曜日" コマンドボタン "比較" があるとします。 Private Sub UserForm_Initialize() 'コンボボックスのプロパティ設定 With 曜日 .Style = fmStyleDropDownList .ColumnCount = 2 .ColumnWidths = "0;30" .TextColumn = 2 .BoundColumn = 1 .ListWidth = 30 End With '曜日データの設定 With 曜日 For i = 1 To 7 .AddItem i '戻り値は数値 .List(i - 1, 1) = WeekdayName(i, True) '表示は文字列 Next i End With End Sub Private Sub 比較_Click() Dim 開始日付 As Date 開始日付 = DateSerial(2008, 4, 1) Do Until Weekday(開始日付) = 曜日 開始日付 = 開始日付 + 1 Loop End Sub 上記の処理で、開始日付を選択された曜日までインクリメントさせたいのですが、 Doの比較が一致せず、オーバーフローになってしまいます。 いろいろ調べましたが、何がいけないのかさっぱりわかりません。 ちなみに、Dateserialの中の数値も、 コンボボックスで選択するように作成しています。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Variant型の数値(Weekday(開始日付)) と Variant型の文字列(曜日.Value)は、等しくなりませんよ!! Private Sub 比較_Click() Dim 開始日付 As Date 開始日付 = DateSerial(2008, 4, 1) Do Until Weekday(開始日付) = CInt(曜日.Value) ' どちらかを型変換してあげましょう ' それから、プロパティは、付けた方がよいですよ!! 開始日付 = 開始日付 + 1 Loop MsgBox 開始日付 End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 そのループの部分は、 開始日付 = 開始日付 + (CInt(曜日.Value) - Weekday(開始日付)) Mod 7 という式に置き換えられると思いますから、わざわざループしなくてもよいような気がしますね。
お礼
回答ありがとうございます。 返答が遅くなり、申し訳ありません。 新しい方法を教えていただきありがとうございました。 後にプログラムを見たときにも、処理がすぐわかるように作っていましたが、 教えていただいた方法も参考にしたいと思います。 ありがとうございました。
- suz83238
- ベストアンサー率30% (197/656)
Do Until Weekday(開始日付) = 曜日 これを Do Until Weekday(開始日付) = 曜日.ListIndex + 1 にしてみればどう?
お礼
すみません。 お礼を補足に記載してしまいました。 失礼しました。
補足
回答ありがとうございます。 返答が遅くなり、申し訳ありません。 新しい方法を教えていただきありがとうございました。 参考にさせていただきます。
お礼
早速ご回答していただき、ありがとうございます。 返答が遅くなりまして申し訳ありません。 コンボボックスから帰ってくる値の型までは、 気にしたことがありませんでした。 変数には普段から型宣言をしているため、 Variant型については意識したことがありませんでした。 教えていただいたとおり、できました。 ありがとうございました。