- ベストアンサー
Select Case文についてご教授お願いします。
助けて下さい。Select Case文についてご教授お願いします。現在VB2008にてプログラムを作成しているのですが、どうにも煮詰まってしまいました。 作成内容は、Excelの任意のSheetから文字をVB上のTextBox1~50に呼び出し、その内いくつかをCheckBoxとButtonを使用してRichTextBox1に表示させると共に、TextBox51に入力した文字をExcelから呼び出した任意の文字に対応したセルへ保存というものです。Excelからの呼び出しにIf文を使用しているため、同一プロシージャ内で別のIf文を使用してしまうと、先のIf文で決めた変数が反映されないためSelect Case文を使用して保存をさせようとしているのですが上手くいきません。以下に現在のコードを記載しますのでよろしくお願いいたします。 Private Sub Button1_Click~ Excel取得コード If RadioButton1.Checked = True AndAlso RadioButton13.Checked = True Then 'Sheetと列を選択 tuki = CType(Book.Worksheets.Item(2), Microsoft.Office.Interop.Excel.Worksheet) 'Sheet情報 COLUMN1 = "B" '列1情報 COLUMN2 = "F" '列2情報 ・ ・ ・ End If 'ここから先は指定したTextBoxをRichTextBoxに表示(先のIf文内の変数は未使用) RichTextBox1.Clear() If Me.CheckBox1.Checked = True Then RichTextBox1.Text = TextBox1.Text End If If Me.CheckBox2.Checked = True ThenIf RichTextBox1.Text <> "" Then RichTextBox1.Text = RichTextBox1.Text & "・" End If RichTextBox1.Text = RichTextBox1.Text & TextBox2.Text End If ・ ・ ・ End If 'ここから保存指示=エラー箇所 Select Case tuki.Range(COLUMN1 & "3").Value Case RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value tuki.Range(COLUMN2 & "3").Value = TextBox51.Text Book.Save() という感じで作成しているのですが「String "" から型 'Boolean' への変換は無効です」と表示されます。 他のケースではIf文の変数をSelect Caseに対応できたので、この方法を選択しました。 基本的にSelect Caseの使い方が誤っていると思うのですが解決策が見つかりませんでした。 他の方法も含めて、良い案がありましたらご教授お願いいたします。 長文申し訳ありません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
If A = 1 Then (A が 1 のときの処理) ElseIf A = 2 Then (A が 2 のときの処理) Else (1 でも 2 でもないときの処理) End If この書き方をスマートにしたものがSelect Case文です。 Select Case A Case 1 (A が 1 のときの処理) Case 2 (A が 2 のときの処理) Case Else (1 でも 2 でもないときの処理) End Select 上記の2つの例のように、If~ElseIf~Else~End If や Select Case~End Select のブロックでは『選択肢のうちのひとつ』しか実行されません。クイズで言えば「3択問題を1問出題」している状態です。 質問者様が行おうとしているのは「2択問題を2問出題」だと思います。であれば、ひとつのブロックで片付けることはできません。条件式を2つばらばらに用意してください。 また、Select CaseもIfも書き方が違うだけで、内部の処理はほとんど違いがありません。「Ifを使っているからSelect Caseで…」という考えは改めたほうがよいかと。 以上を踏まえて・・・ (1) RichTextBox1.text と tuki.Range(COLUMN1 & "3").Value が一致したら保存。 (2) RichTextBox1.Text と tuki.Range(COLUMN1 & "5").Value が一致したら保存。 '(1) の実装 If RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value Then ' 保存処理 ★ End If '(2) の実装 If RichTextBox1.Text = tuki.Range(COLUMN1 & "5").Value Then ' 保存処理 ☆ End If こうしないと、★と☆を両方通過するコードになりません。Select Caseを1回だけでやろうとするのは仕様上不可能です。(なぜこれをひとつにまとめようとするのか、意図が掴めませんです) #他にも何箇所か訂正したいけど、長くなるのでひとまずここまで。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
Selec Case A < ーー Aは色々な値を取るもの。変数など Case B <ーー AがBの場合 (この場合に該当する場合の処理) ・・ End Select のような書き方をするはず。 ところが、質問では Case A=B のような、CASEがあたかもIF分のような書き方をしている。 Select Case tuki.Range(COLUMN1 & "3").Value Case RichTextBox1.text (この場合の処理) に改めてはどうでしょう。
お礼
ご回答頂きありがとうございます。多くの方にお知恵を貸して頂いたおかげで、非常に勉強になるとともに無事目的を達成することが出来ました。本当にありがとうございました。本当は皆さんに良回答を贈呈させて頂きたいのですが、システム上出来ないため最初の回答者様と、解決の方法を提案してくださった最後の方に贈呈しますことをお許し下さい。
補足
imogasi様、ご回答ありがとうございます。補足にありますように Select Case RichTextBox1.Text Case tuki.Range(COLUMN1 & "3").Value tuki.Range(COLUMN2 & "3").Value = TextBox51.Text Book.Save() End Select Select Case RichTextBox1.Text Case tuki.Range(COLUMN1 & "5").Value tuki.Range(COLUMN2 & "5").Value = TextBox51.Text Book.Save() End Select も試して見ましたが、一つずつなら良いのですが同時には無理でした。駄目もとで Select Case RichTextBox1.Text Case tuki.Range(COLUMN1 & "3").Value tuki.Range(COLUMN2 & "3").Value = TextBox51.Text Book.Save() Case tuki.Range(COLUMN1 & "5").Value tuki.Range(COLUMN2 & "5").Value = TextBox51.Text Book.Save() End Select も試しましたがやはり2つ同時の保存は出来ませんでした。
- m-take0220
- ベストアンサー率60% (477/782)
> Excelからの呼び出しにIf文を使用しているため、同一プロシージャ内で別のIf文を使用してしまうと、先のIf文で決めた変数が反映されないため この時点で、Ifの使い方がよくわかってないように思いますが、具体例がないのでどこが問題なのかまではわかりません。 > Select Case tuki.Range(COLUMN1 & "3").Value > Case RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value これだと、「tuki.Range(COLUMN1 & "3").Value」(最初の行のCase以下)が「RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value」と等しい場合にそれ以下の処理をする、という意味になります。 「RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value」は比較した結果のためBoolean型なのでエラーになります。 最初の行で、比較対象は「tuki.Range(COLUMN1 & "3").Value」であると示しているので、次の行のCaseには、それと比較したいものだけを記述すればいいのです。「Case RichTextBox1.text」と記述すれば、「tuki.Range(COLUMN1 & "3").ValueがRichTextBox1.textと等しい場合に以下の処理をする」ということになります。
お礼
ご回答頂きありがとうございます。多くの方にお知恵を貸して頂いたおかげで、非常に勉強になるとともに無事目的を達成することが出来ました。本当にありがとうございました。本当は皆さんに良回答を贈呈させて頂きたいのですが、システム上出来ないため最初の回答者様と、解決の方法を提案してくださった最後の方に贈呈しますことをお許し下さい。
補足
cistronezk様・ m-take0220様回答頂きありがとうございます。おかげさまでエラーは出なくなりました。ところが、教えて頂いたことを参考に書きのように修正したのですが、一つずつなら保存出来るのですが同時に複数選択してしまうと保存されませんでした。正直、初心者で知識が不足しており何度も質問するのは申し訳ないのですが良い案があればご教授お願いいたします。 パターン1 Select Case RichTextBox1.Text Case tuki.Range(COLUMN1 & "3").Value tuki.Range(COLUMN2 & "3").Value = TextBox71.Text Book.Save() End Select Select Case RichTextBox1.Text Case tuki.Range(COLUMN1 & "5").Value tuki.Range(COLUMN2 & "5").Value = TextBox71.Text Book.Save() End Select パターン2 Select Case tuki.Range(COLUMN1 & "3").Value Case RichTextBox1.Text tuki.Range(COLUMN2 & "3").Value = TextBox71.Text Book.Save() End Select Select tuki.Range(COLUMN1 & "5").Value Case RichTextBox1.Text tuki.Range(COLUMN2 & "5").Value = TextBox71.Text Book.Save() End Select いづれの場合もtuki.Range(COLUMN1 & "3").Valueとtuki.Range(COLUMN1 & "5").Valueを同時に保存しようとすると何も保存されません。1つずつ選択すれば希望とおりの動作をしてくれるのですが同時には無理なのでしょうか?
- cistronezk
- ベストアンサー率38% (120/309)
とりあえず、 >Case RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value は Case RichTextBox1.text ですかね。 If文のつもりで「RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value」と書いてしまったのでしょうが、これでは「tuki.Range(COLUMN1 & "3").Value」と「RichTextBox1.text = tuki.Range(COLUMN1 & "3").Value(つまり, TrueかFalse)」と比較していますのでエラーになります。
お礼
ご回答頂きありがとうございます。多くの方にお知恵を貸して頂いたおかげで、非常に勉強になるとともに無事目的を達成することが出来ました。本当にありがとうございました。
お礼
いつもありがとうございます。If文を使用して目的を達成することが出来ました。思考錯誤していた時に、同一プロジージャ内でIf文にて変数を宣言し、その下に改めてIf文にて保存のコードを書いた際、変数が宣言されていないとのエラーになってしまいました。そのため、他のケースで上手くいったIf文とSelect Case文との組み合わせならと思い試していたのですが、おっしゃるとおりいくつかを通過するコードは書けませんでした。今回、Wizard_Zero様に指摘して頂いたコードをもとに、再度If文を使用したところ、変数エラーも出ず無事に解決に至ることが出来ました。たぶん、前回変数エラーになったのはIf文のせいではなく、私のコードがおかしかったためだとわかり多くの方にご迷惑をおかけしたことを反省しております。この掲示板にはいつも助けられ本当に勉強になりました。何分プログラムというものに触れて日が浅いため、勉強不足で突っ込みどころ満載のコードしか書けませんが、勉強を続けていきたいと思います。皆さん本当にありがとうございました。