[[20180507082118]] 『Do Until...Loopがうまく動かない』(hiro) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Do Until...Loopがうまく動かない』(hiro)

繰り返し処理の練習です。
「値」「フォント」「行の高さ」のいずれかがsに設定されれば、MsgBoxでの警告の後、再び入力画面に戻るようにしたいのです。しかし、「型が一致しない」と出ます。

おかしな部分をご指摘いただけないでしょうか
よろしくお願いいたします。
(Sub ...()とEnd Subは省いています)

Dim rng As Range
Dim s As String

Set rng = Cells(6, 1)

s = InputBox("Cells(6, 1)の値、フォント、行の高さ?")

   Do

	Select Case s    
		Case "値"        
			MsgBox rng.Value        
		Case "フォント"
			MsgBox rng.Font.Name               
		Case "行の高さ"
			MsgBox rng.RowHeight
   		Case Else     
			MsgBox "値・フォント・行の高さのいずれかを入力"    

	End Select

   Loop Until s <> "値" Or "フォント" Or "行"

< 使用 Excel:unknown、使用 OS:unknown >


 > Loop Until s <> "値" Or "フォント" Or "行"

ぱっと見ですが、このように書くと、実際には以下のように書くのと同じになります。

    Loop Until s <> "値" Or "フォント" = True Or "行" = True

"フォント" という文字列はString型であり、Boolean型(True/False)ではないので、エラーになるかと思います。 比較を横着せず、以下のように書いてみてください。

    Loop Until s <> "値" Or s <> "フォント"  Or s <> "行"
(???) 2018/05/07(月) 09:21

ループしているのは、不正入力なら何度でも再入力させたいからですかね? ならば、InputBox はDoループの内側に入れて、判定は以下のように変えてみてください。

    Dim rng As Range
    Dim s As String

    Set rng = Cells(6, 1)

    Do
        s = InputBox("Cells(6, 1)の値、フォント、行の高さ?")
        Select Case s
        Case "値"
            MsgBox rng.Value
        Case "フォント"
            MsgBox rng.Font.Name
        Case "行の高さ"
            MsgBox rng.RowHeight
        Case Else
            MsgBox "値・フォント・行の高さのいずれかを入力"
        End Select
    Loop Until s = "値" Or s = "フォント" Or s = "行"
(???) 2018/05/07(月) 09:30

質問のこととは違うし、余計なお世話なんだろうけど・・・

    s = InputBox("Cells(6, 1)の値、フォント、行の高さ?")

    s = InputBox("「値」、「フォント」、「行の高さ」いずれかの文字列を入力してください。")

のように直さないと何度表示されても何を入力するのが正解なのかユーザーには伝わらないような気がするんですが・・
(キャンセルやバツボタン押しても「""」が返ってループから抜けないので、”正解”を知らないと無限ループする嫌がらせになるんじゃないかと)

また、「Cells(6, 1)の値」と表示されてもユーザーには、なんのこっちゃなのでは?
たとえば、「rng.Address(0, 0) & "セルの値"」などとして、「A6セルの値」と言ってあげるようにしないと意味が解らない人がいるような気がしますし、そもそも、そこは「A6セルの値」ではなく、「値」の間違いなんじゃないかと思ったり・・・

ちなみに、あらかじめ複数の候補を用意しておいて、ユーザーにどれかを選ばせるのであれば、コンボボックス(フォームコントロール、ActiveXコントロールどちらにもある)や入力規則などを使うという手があるので、平行してそちらも研究してみるといいかもしれません。

(もこな2) 2018/05/07(月) 11:27


>???さま
ループしているのは、不正入力なら何度でも再入力させたいからですかね?
→おっしゃる通りです。

「"フォント" という文字列はString型であり、Boolean型(True/False)ではないので、エラーになるかと思います。」がまだ理解半分なので、現時点ではなんとなくではありますが、理解しました。 

ありがとうございます。
>もこなさま
あくまで勉強中の練習なので、その辺は自分がわかるようにしか書いてません。
余計な手間をおかけして、大変失礼しました。
詳しく書いておくべきでした。

コンボボックスもできるのですね。
ありがとうございます。
(hiro) 2018/05/07(月) 12:02


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.