VBの添削をお願いします

このQ&Aのポイント
  • VBの添削をお願いします。先日質問した者です。
  • リンク先にもありますが、テキストボックスの値の倍数が改行されながら表示されるようにする方法を知りたいです。
  • また、表示されるのは最新の5行のみで、テキストボックス内の値が10の場合、60が表示された時点で10は消え、70が出た時点で20が消えるような処理を実装したいです。
回答を見る
  • ベストアンサー

VBの添削をお願いします。

VBの添削をお願いします。 先日 http://okwave.jp/qa/q5919602.html で質問した者です。 (textboxの値の倍数が改行されながら表示されるようにするには?という主旨です。) リンク先にもありますが下記の回答をいただきました。 Public Class Form1 Dim a As Integer Dim b As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim b As Integer = 10 a = TextBox1.Text lblMessage.Text = a & ControlChars.CrLf & a + b End Sub End Class それで今度は下記の問いが出ました。 「表示されるのは最新の5行のみ」 Textbox内が10の場合、「60が表示された時点で10は消え、70が出た時点で20が消える」というものです。 このまま続けてもよし、Labelを5つ並べてもよし、とのことです。 で今回は前者で作ってみました。 lblmessage.textの上にlblmessage2.textを被せて隠しちゃえ、というやつなんですが、 模範解答とは程遠いんでしょうね。。。。 どなたか添削お願いできませんか。

  • qc4
  • お礼率78% (183/234)

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

  • ベストアンサー
  • WOPR
  • ベストアンサー率29% (38/131)
回答No.4

ANo.2 です。 まず、ANo.1 さんに謝っといた方がいいと思いますよ。 qc4 さんの最初の質問にあるコードを元に回答されていますので、TextBox1 に入力された数値の倍数の問題じゃなくなっていますよ。 記憶では 10 → 20 → 30 … であり、2 → 4 → 6 → 8 … を求められていたはず。 今だと 2 → 12 → 24 → 36 → 48 … になっていますよ。 以前もお答えいましたが Dim b As Integer = 10 が不要です。 さて、私なりに添削してみます。 拝見しますに下記 3 行が足されただけのように見受けられますが… 思った通り動いてないのでは。 If m >= 50 Then   lblmessage2.Text = lblmessage2.Text & ControlChars.CrLf End If If m >= 50 Then の部分が何をしたいかはなんとなく分かります。「60 が表示された時点で 10 が消え」という部分を If 文で実現したかったのでしょう。 「最新の 5 行」という条件がいつのまにか「50 を含めて超えた場合」って勝手にすり替わっています。 TextBox1 に 10 だけではなく 2 とか 15 とか 200 とか入れてテストされていますか。 それから lblmessage2.Text に何も設定されていないので、どうなるかと言うと… lblmessage2.Text = lblmessage2.Text(何も入っていない) & ControlChars.CrLf(改行) ↑ つまり何も表示されないが改行だけ表示されている。 なんだかんだでラベルを 5 つ並べるのをお勧めします。 「はい、わたしでも作れます。」とのことですが、一度こちらを作成されてから配列にチャレンジされるのがいいと思うのですが、いかがですか。 用意するもの  Form1、Button1、TextBox1、lblMessage1、lblMessage2、lblMessage3、lblMessage4、lblMessage5 コード Public Class Form1   Dim i As Integer = 0 ' 初期値   Dim c As Integer = 0 ' クリック数   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     If String.IsNullOrEmpty(TextBox1.Text) Then       i = 0     Else       i = TextBox1.Text     End If     c = c + 1     If i * c > 100 Then       Exit Sub     End If     If c = 1 Then       lblMessage1.Text = i * c     ElseIf c = 2 Then       lblMessage2.Text = i * c     ElseIf c = 3 Then       lblMessage3.Text = i * c     ElseIf c = 4 Then       lblMessage4.Text = i * c     ElseIf c = 5 Then       lblMessage5.Text = i * c     ElseIf c > 5 Then       lblMessage1.Text = lblMessage2.Text       lblMessage2.Text = lblMessage3.Text       lblMessage3.Text = lblMessage4.Text       lblMessage4.Text = lblMessage5.Text       lblMessage5.Text = i * c     End If   End Sub End Class こうなりました。いかがでしょうか。

qc4
質問者

お礼

lblmessage1の上にlblmessage2を重ねて配置しています。 で60が表示されると同時にlblmessage2にブランク" "が入るようにしています。 条件だけは満たす形になったのですが。 クリック数も変数にできるんですね。 で、表示される数の一番小さい数が上にずれるようになっているんですね。 IF文のところがまだ私には全部理解できませんが、 とにかく丁寧に書いてくださったおかげで、 自分で丸写しして確認ができました。 ありがしうございます。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#1の回答者です。配列は、VBでは初歩だとは思いますが、何かダメ出しのような気もしますので、暫定球を出しておきます。以下のような方法も可能です。 >出題者がIF文の羅列を求めているとは思えないのですが If 構文でも可能です。If文の羅列?悪くないと思います。 今回は、単に、Select Case は省スペースのために、使っただけです。 '// Public Class Form1   Dim buf, buf1, buf2, buf3, buf4, buf5 As String   Dim i As Integer = 1   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Dim b As Integer = 10     Dim a As Integer     a = Val(TextBox1.Text) '要件は前回と同じです。初期値0なら、Val不要です。     i = (i - 1) Mod 5 + 1     Select Case i       Case 1 : buf1 = a + buf + b : buf = buf1       Case 2 : buf2 = a + buf + b : buf = buf2       Case 3 : buf3 = a + buf + b : buf = buf3       Case 4 : buf4 = a + buf + b : buf = buf4       Case 5 : buf5 = a + buf + b : buf = buf5     End Select     lblmessage.Text = buf1 & ControlChars.CrLf & _     buf2 & ControlChars.CrLf & _     buf3 & ControlChars.CrLf & _     buf4 & ControlChars.CrLf & _     buf5 & ControlChars.CrLf     i = i + 1   End Sub End Class

qc4
質問者

お礼

す、すみません。 かき回してしまいました。 頭の中がもうそんな感じで…。 ご厚意感謝しております。

  • WOPR
  • ベストアンサー率29% (38/131)
回答No.2

前回、回答したものです。 リンク先にもありますが、そのような回答はしておりません。落ち着いてください。 それから、添削しようにも今回 qc4 さんが考えたコードがありません。 私の見落としでしょうか。 考え方ですが、前回の概念を応用するなら Label を 5 つ並べる方をお勧めします。 見た目は美しくなりませんが、If 文を駆使して作れます。 このまま続けてもよしという方は、配列もしくは List<T> という概念が必要ですが習われましたか。 習っていないもしくは理解が追いついていないのであれば難易度が跳ね上がりますよ。 lblmessage.text の上に lblmessage2.text を被せて隠しちゃえという考え方がどうなるのかはイメージできませんが、あまり幸せな結果にならないような… 究極的にはプログラムは動けば勝ちなのですが、動いてますか。 模範解答というのは何を求められているのか存じませんが、前者であれば配列を使用している。 後者であれば Label の Text を操作している。というのが分かれば○なのではないでしょうか。

qc4
質問者

お礼

まったく返す言葉がございません。 Public Class Form1 Dim i As Integer Dim m As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click i = TextBox1.Text m = i + m If m > 100 Then Return End If lblmessage.Text = lblmessage.Text & ControlChars.CrLf & m If m >= 50 Then lblmessage2.Text = lblmessage2.Text & ControlChars.CrLf End If End Sub End Class 以上を見ていただきたかったのですが。 >考え方ですが、前回の概念を応用するなら Label を 5 つ並べる方をお勧めします。 >見た目は美しくなりませんが、If 文を駆使して作れます。 はい、わたしでも作れます。 しかし、VBを初めてひと月とはいえ、出題者がIF文の羅列を求めているとは思えないのですが。。。。 List<T>は初対面です。配列使用もテキストを見て理解でき…ないところです。 「後者」は分かるんですが…。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

TextBox1 は、0を入れていれば、10ずつ増加します。 配列とJoin を使いました。配列を使わないなら、5個の変数を使えばよいと思います。 '// Public Class Form1   Dim ar(4) As String   Dim i As Integer   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click     Dim b As Integer = 10     Dim j As Integer     If ar(0) = "" Then ar(0) = "0"     i = (i + 5) Mod 5     j = (i + 1) Mod 5     'もし、TextBox1 のデフォルト値に0を入れるなら、Val は不要です。     ar(j) = ar(i) + Val(TextBox1.Text) + b     lblmessage.Text = Join(ar, ControlChars.CrLf)     i = i + 1   End Sub End Class

qc4
質問者

お礼

ありがとうございます。 今日初めて、配列の存在を知ったのですが、 使い方がよくわからないでいます。 ただ、頂いたプログラムは問題なく動きました。 ご丁寧にありがとうございます。

関連するQ&A

  • VBで倍数を出したい

    VBで倍数を出したい よろしくお願いします。 おそらく基本なんだと思うのですが、さっぱりわかりません。 TextBox Label Buttonと並んでいて、 TextBoxに入った整数に対し、 Buttonを1度押すたびに、 Labelに倍数が表記されていく、 という趣旨なのですが。 まず、前段階として下記を作らされました。 Public Class Form1 Dim i As Integer Dim m As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click i = TextBox1.Text lblmessage.Text = i + m m = lblmessage.Text End Sub End Class このように、labelの数字がどんどん変わっていくのはできたのですが、問題は、 Text…10 Label…10    20    30    40    50    60    70    80    90    100 となり、しかも一度に出るのではなく、Buttonひと押しにつき一つの解が出ね 次の一押しで改行され解が出る。 かつ、100で打ち止めにすること…だそうです。 いちおうめちゃくちゃですが、みんな風に作りました。 Public Class Form1 Dim a As Integer Dim b As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim b As Integer = 10 a = TextBox1.Text lblMessage.Text = a & ControlChars.CrLf & a + b End Sub End Class どうかヒントだけでもお願いします。

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tb" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) Next tb.Text = sum.ToString() Next Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • VBのfunctionの引数について

    2の Double型と 3の Single型のように送る側と受け取る側の変数の型が 違ってもよいのでしょうか?プログラムはそのまま実行できたのですが・・・・。 Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim koku As Integer Dim san As Integer Dim rika As Integer Dim ave As Double------------------------------------1 koku = Val(TextBox1.Text) san = Val(TextBox2.Text) rika = Val(TextBox3.Text) ave = (koku + san + rika) / 3 Label5.Text = Round(ave)-------------------------------2 End Sub Private Function Round(ByVal sngvalue As Single-----3) As Integer Dim intvalue As Integer intvalue = Int(sngvalue + 0.5) Return intvalue End Function End Class

  • VB初心者です。コードの書き方が分かりません。

    VB初心者です。 VBで(zのn乗)-(xのn乗+yのn乗)の計算が出来るようにしたいのですが、答えが必ず-1になってしまいます。 Option Explicit On Public Class Form1 Dim x As Long Dim y As Long Dim z As Long Dim n As Long Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Close() End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox5.Text = (z ^ n) - (x ^ n + y ^ n) End Sub End Class 正しいコードの書き方を教えて下さい。 また特定の答えのときにメッセージを表示したいのですが、どうすればいいですか?

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • VB2008改行できません

    VB2008改行できません お願いします。 メロンパン 3個 240円 コロッケパン 2個 … という風にしたいのですが、 一行目が表示され、2行目の「コロッケパン」を入れた瞬間、 1行目が消え、 コロッケパンのみが表示されます。 なぜでしょうか。 正しいコードと、どのような理屈でそうなるのか頂けると嬉しいです。 Public Class Form1 Dim cm, a As String Dim kosu, en As Integer Private Sub ShapeComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShapeComboBox.SelectedIndexChanged cm = ShapeComboBox.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click kosu = TextBox1.Text Select Case ShapeComboBox.SelectedIndex Case 0 en = kosu * 120 Case 1 en = kosu * 180 Case 2 en = kosu * 240 End Select txtKaimono.Text = cm + kosu.ToString(" ##個") + en.ToString(" #,###円") + vbCrLf End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Application.Exit() End Sub End Class

  • 順列のプログラムについて(VB)

    下記が、組み合わせを求めるプログラムです。 これのどこを変更すれば、順列を列挙するプログラムになりますか(ただし、重複順列でない。例、5P2=5*4=20通り)?教えていただけませんか? Public Class Form1 Dim w0, w1, count As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Text = "コンビネーションサーチ" Label1.Text = "個の中から" Label2.Text = "個とる組リスト" Button1.Text = "計算" TextBox1.Text = "6" TextBox2.Text = "3" TextBox3.Text = "" TextBox3.ScrollBars = ScrollBars.Vertical count = 0 End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim n, m As Integer n = TextBox1.Text m = TextBox2.Text w1 = " }" w0 = "{ " TextBox3.Text = "" count = 0 combisearch(1, n, m) MsgBox("組み合わせ個数は、" & count & "個です。") End Sub Sub combisearch(ByVal st, ByVal ed, ByVal depth) Dim i, temp If depth - 1 < 1 Then For i = st To ed TextBox3.Text &= w0 & i & w1 & vbCrLf count += 1 Next Else For i = st To ed temp = w0 w0 &= i & " " combisearch(i + 1, ed, depth - 1) w0 = temp Next End If End Sub End Class

  • VB、教えてください。

    VB、教えてください。 5つのラベルが縦に並んでいます。 label0 label1 label2 label3 label4 あらかじめ、 Dim m as integer=0 を宣言し、 どうにかして "label"という文字列とmという数字をくっつけ、 label0 label1… という風にできないでしょうか。 そして label"m".text=10*m というような表示を作りたいのですが。 下記のようなイメージです。分かりにくかったらごめんなさい。 Public Class Form1 Dim m As Integer = 0 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click lblmessage(+("m").Text = 10*m m = m + 1 End Sub End Class

  • VB.NET プログラミングの基礎で分らないところを教えてください。

    2つの整数n,m (n>m) を入力し、組み合わせ nCm を表示させるプログラムです。 Private Sub Button1_Click(Byval sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Clieck Dim intN intM, intl As linteger Dim dblComb As Double intN = Textbox1.Text intM = Textbox2.Text dblComb = 1.0 For intl = 1 To intM Next Textbox3.Text = intM End Sub End Class ここまで出来ているんですが、For intl = 1 To intM 以下のプログラムが分りません。どなたか教えてください。。

  • VBのテキスト書き込み読み出し

    VB初心者です。 VBのテキスト書き込み読み出しについて質問させていただきます。 ~使用オブジェクト~ textbox1 textbox2 button1 button2 現在下記の通りtextbox1とtextbox2に書いた文字(length 10まで)をbutton1 clickで C:\test.txtに書き出し、 button2 clickでtextbox1 と textbox2に戻すプログラムを書いてみました。 読み込みのところが現在は2個ですが、実用的には膨大な数にしたいと思っています。 単純に沢山書けばいいのでしょうが現実的ではないのでスッキリと書く書き方はないでしょうか? さらに、例としてtextbox1にAさんの名前textbox2にAさんの年齢をいれたとします。 その際、Bさん以降を登録したいのですがその場合テキストへの書き込みを次行に書き込み 次行を読み込むにはどのように書けばよろしいでしょうか? ご教授お願い致します。 Public Class Form1 '##################################################### '"C:\test.txt"へ書き込み '##################################################### Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim write_data As New System.IO.StreamWriter("C:\test.txt", False, _ System.Text.Encoding.Default) Dim str As String Dim str1 As String str = String.Format("{0, -10}", TextBox1.Text) str1 = String.Format("{0, -10}", TextBox2.Text) write_data.Write(str & str1) write_data.Close() End Sub '##################################################### '"C:\test.txt"の読み込み '##################################################### Private Sub Button2_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button2.Click Dim Reader As New IO.StreamReader("C:\test.txt", System.Text.Encoding.GetEncoding("Shift-JIS")) While Reader.Peek() > -1 '10文字取得 Dim c(9) As Char Dim d(9) As Char Reader.ReadBlock(c, 0, c.Length) Reader.ReadBlock(d, 0, d.Length) TextBox1.Text = c TextBox2.Text = d End While Reader.Close() End Sub End Class

専門家に質問してみよう