• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAのIf ~ Thenステートメントで)

エクセルVBAのIf ~ Thenステートメントで予約フォームの作成に挑戦

このQ&Aのポイント
  • エクセルVBAのIf ~ Thenステートメントを使用して予約日が特定の日の場合に結果を記入する予約フォームを作成しています。
  • Private Subコマンドを使用して、予約日が特定の日の場合に実行することができます。
  • 特定の日である場合には、指定したシートに結果を記入し、指定したセルに値を入力することができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.5

No.1のおまけです。 If ListBox1.Text = "44774" Then で成功したという事なので(実際成功しました) No.1の回答になりましたが 両辺の型を合わせる感じで If CDate(Me.ListBox1.Text) = CDate(Sheets("Sheet6").Range("A2").Value) Then の方がいいのかもしれません。

753
質問者

お礼

たくさんご回答ありがとうございました。ご指摘いただいた方法で完璧にうまく行きました。No4のご回答もとても役に立ちました。本当にありがとうございます。これで一歩先に進めました。

その他の回答 (7)

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.8

No.5のもしかしての追加 Sheet6がシート名だと思って If CDate(Me.ListBox1.Text) = CDate(Sheets("Sheet6").Range("A2").Value) Then としましたが Sheet6がオブジェクト名だとしたら If CDate(Me.ListBox1.Text) = CDate(Sheet6.Range("A2").Value) Then ですね。

回答No.7

失礼! 誤「.sheet6.Cells(2, 1).Value」 正「.sheets(sheet6).Cells(2, 1).Value」 でした。

回答No.6

そもそも、対象ワークブックさえ指定していません。 sheet4ってなんですか? selectしたものが正しい対象である保証が無いです。 また、「ActiveCell.Value」ってユーザがActiveCellを変えてしまったらどうするのか? >>If ListBox1.Text = "sheet6.Range("A2")" Then >>や >>If ListBox1.Text = "sheet6.Cells(2, 1).Value" Then (ダブルクオーテーションしている意味も分かりませんが) これもsheet6が何なのか分かりません。ブックから順番に、 特定できるようにしないといけません。 勿論この書き方だと「with」を使用し、 .sheet6.Cells(2, 1).Valueというふうに書かないといけません。 ほかも同じです。 excelは特に明記しなくても色々なところで 「よろしくやってくれる」機能が満載ですし、 ましてや「自動記録」を参照すると、 惨憺たるコードが出力されます。 オブジェクトの階層や変数の型や参照かどうかなど、 全てプログラマが明示することを推奨しますし、 ユーザの余分な操作を排除するコードを書かないといけません。 ざっとでいいので、C言語やアセンブラを勉強して、 「プログラマが自由に決定でき、逆に責任を負う」ものが あることを理解すると、 貴殿のVBAの書き方にパラダイムシフトが起こるでしょう。

753
質問者

お礼

ご回答ありがとうございました。ご指摘いただいたご意見、本当に役に立ちました。勉強を少しずつ頑張っていきます。ありがとうございました!

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.4

No.1No.2の追加かつ余計なお世話ですが セルの指定が絶対的なシート指定をしていないのでちょっと不安な感じがします。 シートを指定するようにしてみてはいかがでしょう。 一例です。 With Sheet4 'Sheet4がシート名でしたら 'With Sheets("Sheet4") .Activate With .Range("C2").End(xlDown) .Offset(1, 0).Value = Reservationform.ListBox2.Value .Offset(1, 1).Value = Reservationform.ListBox3.Value .Offset(1, 2).Value = Reservationform.ListBox4.Value .Offset(1, 2).NumberFormat = Sheet4.Range("C2").NumberFormat '.Offset(1, 2).NumberFormat = Sheets("Sheet4").Range("C2").NumberFormat End With End With

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

ListBox1.Text で返ってくるのは文字列であるはずです。 Listbox1.の選択するアイテムに、「"44774" 」のような、日付シリアル値と思しき 文字列を設定する、はずがありません。 アイテムの1つは、2022年8月1火のような文字列であるはずです。 ですから、選択した日付文字列(例 2022年8月1日) を、日付シリアル値に変換して、以後考えないとならないはずです。 例 標準モジュールに Sub test01() MsgBox DateValue("平成22年1月1日") MsgBox DateValue("令和4年6月18日") End Sub 返って画面に返ってくるのは  2022/6/18のようなものですが、セルの値的に言えば、日付シリアル値(整数値44730)です。 この辺の考えを整理して、比較の両辺のデータ性格を考えて、同性格のデータになるよう、考え直すべきです。

753
質問者

お礼

ご回答ありがとうございました。貴重なご意見で、とても役に立ちました。うまくいきました。ありがとうございました。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.2

No.1の補足です。 説明が下手な気がしたので "sheet6.Range("A2")" だとただの文字列になってしまいますので は "sheet6.Range("A2")" だとsheet6.Range("A2")にあるデータではなくて、「sheet6.Range("A2")」という文字列になってしまいますので と読み替えて下さい。 また、今回とは別で仮に文字列にするとした場合には"sheet6.Range(""A2"")"だと思います。

  • kkkkkm
  • ベストアンサー率66% (1725/2595)
回答No.1

"sheet6.Range("A2")" だとただの文字列になってしまいますので If Me.ListBox1.Text = CDate(Sheets("Sheet6").Range("A2").Value) Then にしてみてください。

関連するQ&A