• ベストアンサー

文字制限方法。

どなたか知識ある方、教えてください。 ソートプログラムの演習をしているんですが、 どのように書いていいか悩んでます。現在の課題は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 現在書いたのはここまででどうしてもエラーと文字制限の方法はわからないので教えていただける方、宜しくお願いします。

  • nozda
  • お礼率41% (31/74)

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

  • ベストアンサー
  • process9
  • ベストアンサー率29% (81/272)
回答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/272)
回答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/272)
回答No.2

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

nozda
質問者

補足

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

関連するQ&A

  • ある文字が含まれているセルの個数を結果表示

    いつもお世話になっております。 また詰まってしまいましたので質問させてください。 S列に「test」という文字が入っているセルの個数を集計し結果を セル「AC1」に表示したいのですがうまくいかずにおります。 なお、S列には様々な文字が入っているのでワイルドカードで検索しております。 データ数は変動します。 Sub Macro1() Dim c As Long Dim ans As Integer Dim i As Integer ans = 0 With ActiveSheet For i = Cells(65536, c).End(xlUp).Row To 1 Step -1 If Range("S" & i) = "*test*" Then ans = ans + 1 End If Next i Range("AC1") = ans End With End Sub 環境 Excel2003 以上、宜しくお願いします。

  • VBのGUI 行列の和を求める

    VBのGUIです。 行列の足し算を行うプログラムをつくりたいです。 以下のプログラムはできたところまで作成しています。 □個の□行□列(□はテキストボックス)の所に例えばユーザーが3 3 3と入力したとします。 ボタン1を押すと3×3の3個個分のテキストボックスがでてきて、要素を打ち込めるようになります。 そしてユーザが要素を打ち込みます。次に要素が 1 2 1  2 1 2   2 1 2 2 1 2  1 2 1   1 2 1 1 2 1  2 1 2   1 2 1 というように入力されたとします。 ボタン2を押すと 3×3のテキストボックスが出てきて この3つの行列の和を足した 5 4 5 4 5 4 4 5 4というようにテキストボックスに表示されるようにしたいです。 3この3行3列の和だけでなく何個の何行何列の場合でもできるようにしたいです。 どのようなソースでこのプログラムはできるのでしょうか。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Bounds = New Rectangle(10, 10, 1300, 800) Dim number As Integer Dim rows As Integer Dim columns As Integer If Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox1.Text, rows) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If Not Integer.TryParse(TextBox2.Text, columns) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If For k = 1 To number For i = 1 To rows For j = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() & "No" & k.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim number As Integer Dim rows As Integer Dim columns As Integer Dim r As Integer Dim n As Integer Dim m As Integer Dim sum As Double sum = 0 For n = 1 To columns For m = 1 To rows sum = 0 For r = 1 To number Next For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() tb.Name = "R" & i.ToString() & "C" & j.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 10 tb.Width = 40 Next Next Next Next End Sub End Class

  • Excel VBAライフゲーム

    ExcelのVBAでライフゲームを作りたいのですが、次のプログラムの途中以降がわかりません。 もしよろしければ、このつづきの簡単な実行できるVBAライフゲームを教えてください。 続きのプログラムを教えていただけたら幸いです。 Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const SIZE As Integer = 19 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim N As Integer Dim Cnext(SIZE, SIZE) As Integer Dim I As Integer, J As Integer InitRate = -1 Do While InitRate < 0 Or 1 < InitRate Loop For I = 0 To SIZE For J = 0 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 0 To SIZE For J = 0 To SIZE If C(I, J) = ALIVE Then Cells(I + 1, J + 1).Value = "■" Else Cells(I + 1, J + 1).Vallue = "" End If Next J Next I For I = 0 To SIZE For J = 0 To SIZE N = Count(I, J) Next J Next I For I = 0 To SIZE For J = 0 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Count(I As Integer, J As Integer) As Integer End Function

  • Workbook

    次のプログラムをExcelのWorkbookで開くやり方がよくわかりません。 どうやってやるのか教えていただけないでしょうか? Option Explicit Const ALIVE As Integer = 1 Const DEAD As Integer = 0 Const BORN As Integer = 3 Const LIFE As Integer = 2 Const SIZE As Integer = 20 Const Tmax As Integer = 100 Dim C(SIZE, SIZE) As Integer Dim Xrange As Variant Private Sub LifeGame() Dim InitRate As Single Dim T As Integer Dim I As Integer, J As Integer Randomize Xrange = Range("A1:T20") InitRate = 0.5 For I = 1 To SIZE For J = 1 To SIZE If Rnd() < InitRate Then C(I, J) = ALIVE Else C(I, J) = DEAD End If Next J Next I For T = 1 To Tmax For I = 1 To SIZE For J = 1 To SIZE If C(I, J) = ALIVE Then Xrange(I, J) = "■" Else Xrange(I, J) = "" End If Next J Next I Range("A1:T20") = Xrange For I = 1 To SIZE For J = 1 To SIZE C(I, J) = Cnext(I, J) Next J Next I Next T End Sub Function Cnext(I As Integer, J As Integer) As Integer Dim xi As Integer Dim xj As Integer Dim xsum As Integer For xi = I - 1 To I + 1 For xj = J - 1 To J + 1 If (xi > 0 And xi <= SIZE) _ And (xj > 0 And xj <= SIZE) Then If Not (xi = I And xj = J) Then If C(xi, xj) = ALIVE Then xsum = xsum + 1 End If End If End If Next Next Select Case xsum Case BORN Cnext = ALIVE Case LIFE Cnext = C(I, J) Case Else Cnext = DEAD End Select End Function Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Call LifeGame End Sub

  • VB6→VS2005アップグレード後

    いつもお世話になっております。 VBを勉強中です。 VB6→2005にアップグレード後、下記のエラーが発生しました。 "オブジェクト参照がオブジェクト インスタンスに設定されていません。" 以前もこちらでアドバイスをいただき、 デザインの中でADDされているかどうかを確認し、解決に結びついたので 今回も同様かと思い、色々と行ったのですが解決しません。 frmapli_S3のデザイナ内に下記が存在しましたが 原因はここでしょうか? CType(Me.Frame1, System.ComponentModel.ISupportInitialize).EndInit() 以下はVB6での正常稼動時のソースです。 Public Sub ShowPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) Textbox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As Textbox Dim i As Long: Dim j As Long: Dim k As Long For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Set Textbox = frmapli_S3.Controls("text" & k) PermValue(k) = Textbox.Text Next Next 下記はVB2005アップグレード時のソースです。 Public Sub ShowPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) TextBox.Text = PermValue(k) Next Next End Sub Public Sub SetPermValue() Dim Textbox As TextBox Dim i, j, k As Integer For i = 0 To 19 For j = 1 To 8 k = i * 10 + j Textbox = CType(frmapli_S3.Controls("text" & k), TextBox) PermValue(k) = Textbox.Text   ←ここでエラー Next Next End Sub

  • 一定の規則でエクセルに並んでいる表を、別シートに元のSheetに設定されているNO順で貼り付ける

    少しややこしいマクロなのですが、 Sheet1に表が左から順に飛び飛びで並んでいます。 1番目の表の1行目の項目値がNO.1で、2番目の表の1番目がNO.2、3番目の表の1番目がNO.3で。。。。と続いていき、最後の表の1行目までいくと、一番始めの表の2行目に続きます。 それを別シートにNO順に1つの表として完成させるマクロをVBAで作りたいと思っています。 調べ回って途中まではやってみたのですが、一向に進まないので教えて下さい(*_ _) 以下はエラーになったマクロです。 Sub CopyCell() Dim CopySource, PasteDist As Range Dim i As Integer Dim j As Integer Dim k As Integer For i = 1 To 7 For j = 1 To 7 For k = 2 To 33 Step 8 Set CopySource = Sheets(1).Range(Cells(i, k), Cells(i, k + 6)) Set PasteDist = Sheets(2).Range(Cells(j, 1), Cells(j, 7)) PasteDist = CopySource Next k Next j Next i End Sub

  • マクロが実行しない

     二行三列を一枡として月の勤務割表を作成しています。マクロで同じ事を しているのにMacro1の方が実行しません。お教え願えませんでしょうか。 (尚、図形を枠線上にコピペしています。) Sub Macro1()実行しません。 Dim i As Integer Dim j As Integer For i = 10 To 43 Step 2 For j = 10 To 103 Step 3 Select Case Cells(i, j).Value Case 1: ActiveSheet.Shapes("四角形1").Select Selection.Copy Cells(i + 1, j + 1).Select ActiveSheet.Paste End Select Next Next End Sub Sub Macro2()実行します。 ActiveSheet.Shapes.Range(Array("四角形1")).Select Selection.Copy Range("J11:K11").Select ActiveSheet.Paste End Sub

  • VBA A1をA2に変更したい

    またお世話になります。 下記のはランダムにチーム分けするものです。 TmCnt = 5がチーム数です。 これはA1から氏名を読み取り、C1からランダムに表を作成するものです。 A2、C2に変更したいのです。 Data1 = Range("A1:A" & Total).Value A1をA2に変えましたが、「インテックスが有効範囲にありません」とエラーメッセージが出ます。 どこが違うのでしょうか? 宜しくお願いします。 Sub Sample() Dim Total As Integer Dim TmCnt As Integer Dim Data1 As Variant Dim Data2() As String Dim i As Integer, j As Integer, k As Integer Total = Cells(Rows.Count, 1).End(xlUp).Row TmCnt = 5 Data1 = Range("A1:A" & Total).Value ReDim Data2(1 To Total) Randomize For i = TmCnt To 1 Step -1 j = Int(Rnd * i) + 1 Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i For i = Total To TmCnt + 1 Step -1 j = Int((i - (TmCnt + 1) + 1) * Rnd + TmCnt + 1) Data2(i) = Data1(j, 1) Data1(j, 1) = Data1(i, 1) Next i i = 1 Do For j = 1 To TmCnt k = k + 1 Cells(i, j + 2).Value = Data2(k) If k = Total Then Exit Sub Next j i = i + 1 Loop End Sub

  • Excel VBAにて2の100乗を計算するには

    プログラミングの勉強でVBAを学んでいるものです 以下の様な問題を出されました 2の100乗の値を計算する。この値はLong型で表せる最大の値をはるかに超すので、十分な大きさのInteger型の配列を用意し、その各要素で各けたの値を表す。値を2倍するサブプロシージャ「二倍」を書いてプログラムを完成させ、値を計算せよ。 Option Explicit Sub 二の百乗() Const n As Integer = 200 Dim s(n) As Integer Dim i As Integer, j As Integer s(1) = 1 For i = 2 To UBound(s) 'UBoundは配列の最大の添え字を返す関数 s(i) = 0 Next i For i = 1 To 100 二倍 s Next i For i = UBound(s) To 1 Step -1 If s(i) <> 0 Then Exit For Next i For j = 1 To i Cells(1, j).Value = s(i - j + 1) Next j End Sub セル一つに計算結果を表示させられないことはよく分かるのですが、そのための2の掛け算を全く思いつきません 二倍のサブプロシージャをどのようにすればいいのでしょうか

  • VBAでのマクロ実行中のオーバーフローについて

    以下のマクロ実行時にたまにオーバーフローが出てしまい マクロが止まってしまうときがあります。 毎回出るのであれば、原因を突き止めやすいのすが、 出なくなると全く出なくなりとても困っています。 もしわかる方がいらっしゃいましたら、御教授して頂けると 幸いです。 内容:データが元々10個単位であり、Sheet1に500×10、 Sheet2に500×10のデータを2次元配列に格納する。 Dim RES_CAM1(1 To 4000, 1 To 10) As Integer Dim RES_CAM2(1 To 4000, 1 To 10) As Integer Sub Macro10() ' ' Dim i, j As Integer .................................................... .................................................... Sheets("Sheet1").Select For i = 1 To 500 For j = 1 To 10 RES_CAM1(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j Next i Sheets("Sheet2").Select For i = 1 To 500 For j = 1 To 10 RES_CAM2(i, j) = Cells((i - 1) * 10 + j, 19) ← ☆ Next j Next i .................................................... .................................................... End Sub 上記☆のところでオーバーフローで止まったりします。。。

専門家に質問してみよう