• ベストアンサー

文字制限方法。

どなたか知識ある方、教えてください。 ソートプログラムの演習をしているんですが、 どのように書いていいか悩んでます。現在の課題はtextが10個あり、sortボタンをクリックすると左から数字を小さい順に並びます、数字のみ入力可、空白でもエラーなしで(全て空白はエラー)とりあえず数字があれば10個埋めていなくても並べる、文字等はエラーを出したいです。 '配列のインデックス番号の開始に1を設定 Option Base 1 Option Explicit Private Sub cmdCLEAR_Click() '変数の宣言 Dim ans As Integer Dim i As Integer '消去する際の確認事項 ans = MsgBox("消去していいですか?", vbYesNo + vbQuestion) Select Case ans Case vbYes For i = 1 To 10 Step 1 Text(i).Text = "" Next i Case vbNo MsgBox "取り消します", vbInformation End Select End Sub Private Sub cmdSORT_Click() '変数の宣言 Dim intNum(10) As Integer Dim S As Integer Dim j As Integer Dim k As Integer Dim i As Integer '配列の整理 For i = 1 To 10 Step 1 intNum(i) = Int(Text(i).Text) Next i 'バブルソート For k = 1 To 9 Step 1 For j = 1 To 9 Step 1 If intNum(j) > intNum(j + 1) Then S = intNum(j) intNum(j) = intNum(j + 1) intNum(j + 1) = S End If Next j Next k '結果を返して表記する For i = 1 To 10 Step 1 Text(i).Text = intNum(i) Next i End Sub 現在書いたのはここまででどうしてもエラーと文字制限の方法はわからないので教えていただける方、宜しくお願いします。

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

  • ベストアンサー
  • process9
  • ベストアンサー率29% (81/271)
回答No.1

エラー時の動作は、どういう風にしたいのかが 記述されていないので、回答のしようがないですよ。 ・エラーチェックは、ソートボタンを押したタイミングでいいのか? ・エラー時は、どういう風にユーザにお知らせするのか。  (ラベルに表示?メッセージボックス?)

nozda
質問者

補足

すいません、記入が足りませんでした。。 1、エラーチェックはsortボタンクリック時です。 2、エラーはラベルに表示させるようにします。。

その他の回答 (4)

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.5

Private Sub cmdSORT_Click()で()の中には中にまず何も書けません。 ⇒()の中は、イベントでOSから渡される引数なので、何も書けないのは当然です。 誤解があるといけないので書きますが、setTextは、cmdSORT_Click()の外に定義した関数です。 Private Sub cmdSORT_Click() : End sub private function setText(byval s as string) as Variant : end function 演習と言うことで、制限が多いのだと思いますが、integer,string,Isnumericしか使えないのであれば、配列を定義するところを変える必要があります。 Dim intNum() As Integer dim idx as integer idx = 0 For i = 1 To 10 Step 1 if isNumeric(Text(i).Text) then idx = idx + 1 end if Next i if (idx=0) then msgbox "有効な数字を1つ以上入れてください" exit sub end if redim intNum(idx) As Integer 'バブルソート '結果を返して表記する For i = 1 To idx Step 1 Text(i).Text = intNum(i) Next i For i = idx To 10 Step 1 Text(i).Text = "" Next i integer型の変数を定義すると、デフォルトで"0"が入ります。そのため、配列をそのままTextへ入れると、空白が"0"になってしまうので、数値が入っている個数を数えて対応する必要があります。

nozda
質問者

補足

いま気合でなんとかできました。エラー項目はまだですがなんとか動きます。ありがとうございました。 Private Sub cmdSORT_Click() '変数の宣言 Dim intNum(10) As Integer Dim i As Integer Dim S As Integer Dim j As Integer Dim k As Integer Dim intCount As Integer 'ソート対象テキストボックス数 intCount = 0 '配列の整理 For i = 1 To 10 Step 1 If Text(i).Text <> "" And IsNumeric(Text(i).Text) = True Then intNum(i) = CInt(Text(i).Text) intCount = intCount + 1 End If Next i 'バブルソート For k = 1 To intCount - 1 Step 1 For j = 1 To intCount - 1 Step 1 If intNum(j) > intNum(j + 1) Then S = intNum(j) intNum(j) = intNum(j + 1) intNum(j + 1) = S End If Next j Next k '結果を返して表記する For i = 1 To 10 Step 1 If i > intCount Then Text(i).Text = "" Else Text(i).Text = intNum(i) End If Next i

  • process9
  • ベストアンサー率29% (81/271)
回答No.4

>private function setText(byval s as string) as Variant >すいません、上記の方法はなしでかつ、バリアントも不可な条件なんですよ>ね。。。。。。 >申し訳ないです。。。。でも、ありがとうございます。 そういう条件があるのなら、書かないとわかりませんよ? 他にこういうのはダメな実装(プログラムの仕方)というのがあるのなら、 補足にすべて書いてみてください。 ついでに、手前の質問の補足にあった 入力仕様とチェックタイミングも整理した形で 補足に書いてみてください。

nozda
質問者

補足

初めて日が浅いのであまりいえませんが、使用するのが Private Sub cmdSORT_Click()で()の中には中にまず何も書けません。 上記のPrivate Subのあとの文章もなにもいじらず、以下エラー時にラベル表記→全角不可、0不可、未入力は可ですが、全て空白は不可、空白があってもほかのtextに数字があれば、随時記入してある数字の小さい順に左から表記、 チェックのタイミングはcmdSORT_click時にまず、エラーチェック(エラーがあればラベル表記)、その後プログラムが進行していくような形です、、ちょっといいにくいんですが。 変数の宣言で使える方はinteger,string,Isnumeric3点で、またはCIntなどCを追加した形のものです。 宜しくお願いします。

  • ctrlzr
  • ベストアンサー率29% (18/62)
回答No.3

'空白もありとのことなので、配列はVariantにする必要があります。 Dim intNum(10) As Integer ⇒Dim intNum(10) As Variant 'TextをIntしただけでは、数値でないとエラーになってしまうので、代入する関数を作成すると、よいかと思います。 intNum(i) = Int(Text(i).Text) ⇒ intNum(i) = setText(Text(i).Text) private function setText(byval s as string) as Variant 'ここにいろいろなチェックを入れます '数値のチェック if not isNumeric(s) then msgbox "数値ではありません" setText = "" exit function end if setText = Cint(s) end function 空白が入ると比較がうまくいかないので、空白を配列の後ろに移動するコードを、バブルソートの前に書きます。

nozda
質問者

補足

private function setText(byval s as string) as Variant すいません、上記の方法はなしでかつ、バリアントも不可な条件なんですよね。。。。。。 申し訳ないです。。。。でも、ありがとうございます。

  • process9
  • ベストアンサー率29% (81/271)
回答No.2

書き忘れたました。。。 入力仕様も必要です。 数字の入力とありますが・・・   1.入力桁数。   2.整数か、自然数か、実数なのか。   3.空白とは、ブランク(全角?半角?)の入力なのか、未入力を指すのか。

nozda
質問者

補足

こちらも補足で 1、MaxLengthで4行までにしました。 2、マイナス、小数点はありで0は不可です。整数等の違いがわからないので今至急に調べます。 3、空白は未入力をさします、しかし、空白はエラーにせず入力された数字があれば、左から順に詰めて表記するようにしたいです。。。長々とすいません。全角の入力も制限入れます。。。

関連するQ&A