• ベストアンサー

ForNext文のループ値がおかしいのですが

エクセル2003のVBAで、以下のコードを実行すると、 3つ目のメッセージボックスで「121」と表示されます。 1つ目、2つ目のメッセージボックスは「1」と表示されます。 ユーザーフォームで、テキストボックスを貼り付ける際に、 注意事項があるのでしょうか? ループ文も間違ってないと思うのですが。 原因と対処法がわかるかた、もしくはこれだろうと予測がつく方は、 教えてください。よろしくお願いいたします。 'ユーザーフォームロード時 Private Sub UserForm_Initialize() '【一括設定】補正値代入(デフォルト値) Me.TextBox100.Text = "XXX" For i = 1 To 10 'ファイル名代入 Me.Controls("TextBox" & i).Value = Left(strFileName(i), 4) msgbox i '補正値(デフォルト) Me.Controls("TextBox" & i + 10).Value = "XXX" msgbox i '大気圧(デフォルト) Me.Controls("TextBox" & i + 20).Value = "XXX" msgbox i '給気圧(デフォルト) Me.Controls("TextBox" & i + 30).Value = "XXX" '系列 Me.Controls("TextBox" & i + 50).Value = "XXX" 'グラフメモ(デフォルト) Me.Controls("TextBox" & i + 100).Value = "XXX" Next i End Sub

  • ddtqp
  • お礼率68% (139/203)

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

  • ベストアンサー
  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.2

質問のソースをコピー&ペーストしたものに一部追記したものを実行しましたが、メッセージボックスでは3個とも「1」が出ました。(1回目のループ) どこかでiの値をいじってたり、TextBox3のinitializeに何か設定していたりしませんか? 本当にソースは質問者さんが問題起きているものと同一のものですか? ちなみに私が実行したソース貼っておきます。 Private Sub UserForm_Initialize() Dim strFileName(10) As String Dim i As Integer Dim cnt As Integer For cnt = 0 To 9 strFileName(cnt) = cnt + 1 Next cnt '【一括設定】補正値代入(デフォルト値) Me.TextBox100.Text = "XXX" For i = 1 To 10 'ファイル名代入 Me.Controls("TextBox" & i).Value = Left(strFileName(i - 1), 4) MsgBox i '補正値(デフォルト) Me.Controls("TextBox" & i + 10).Value = "XXX" MsgBox i '大気圧(デフォルト) Me.Controls("TextBox" & i + 20).Value = "XXX" MsgBox i '給気圧(デフォルト) Me.Controls("TextBox" & i + 30).Value = "XXX" '系列 Me.Controls("TextBox" & i + 50).Value = "XXX" 'グラフメモ(デフォルト) Me.Controls("TextBox" & i + 100).Value = "XXX" Next i End Sub

ddtqp
質問者

お礼

回答ありがとうございます >どこかでTextBoxの値をいじっていませんか エラーのでているTextBox21~のコードを調べてみたところ、 以下の記述ミスがありました。 '補正値の条件入力(deg値以外は受け付けない) Private Sub TextBox100_Change() ※【ミス】TextBox21と記述していました For i = 7 To 1446 If Val(Me.TextBox100.Value) = ThisWorkbook.Sheets("default").Cells(i, 13).Value Then Exit Sub Next i If i = 1447 Then MsgBox "deg値と一致しません。補正値を入れなおしてください。" Me.TextBox100.Value = "" End If End Sub

その他の回答 (3)

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

こんにちは。 純粋にご質問のコードからは、  >3つ目のメッセージボックスで「121」と表示されます。 ということはありえませんし、事実ありません。この範疇から問題を見出すことは不可能です。 今回のような場合は、値を、なぜとらなくてはならなくなったのか、そのいきさつにも不明です。 掲示内容のコードに、省略した部分やプライバシーや秘匿性のために変更した部分はないのではないでしょうか。見た感じでは、何か抜いているようですが。 = "XXX" '←本来は、DDEなどから取っているのでしょうか。 それと、MsgBox の文字も、パスカル型になっていないようで、どこかでいじっていないでしょうか。割り込みが予想される場合の値をとる時は、Debug.Print のほうがよいかもしれません。

  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.3

下で回答してるものです。 訂正と補足要求します。 >TextBox3のinitializeに何か設定していたりしませんか? ↑すいません、これミスです…。無視してください。 補足要求です。 (1)strFileNameは察するにグローバル変数のようですが、この配列の値をどこで設定していますか?そこのソースも含め全てを提示してください。 (2)3つ目のmsgbox iで「121」と表示されたようですが、2回目以降のループ時は何が表示されますか? (3)もしiの値が121になっている場合3つ目のmsgbox i以降の処理 '給気圧(デフォルト) Me.Controls("TextBox" & i + 30).Value = "XXX" '系列 Me.Controls("TextBox" & i + 50).Value = "XXX" 'グラフメモ(デフォルト) Me.Controls("TextBox" & i + 100).Value = "XXX" にてTextBox151などの存在しないTextBoxを指定する事になりエラーになると思われますが、実行するとどういう現象が起きますか? 「121」と表示されたにも関わらず期待しているTextBox31.Value="XXX"が実行されるのでしょうか? エラーの場合はエラー文を記載願います。

  • Alshark
  • ベストアンサー率12% (1/8)
回答No.1

私自身もまだまだ初心者なんで、原因は不明ですが もし"XXX"が同値だったらFor Each文も加えて Private Sub UserForm_Initialize() Dim Ctr AS Control, i AS Integer For Each Ctr In Controls If Ctr.Name Like "Text*" Then Ctr.Value = "XXX" Next For i = 1 To 10 Me.Controls("TextBox" & i).Value = Left(strFileName(i), 4) Next i End Sub だったらどうですか? 動作は未確認です

ddtqp
質問者

お礼

回答ありがとうございます。 そうですね。XXXが同値であれば、このやり方が早いですね。 参考になりました。

関連するQ&A

  • テキストボックスの数値を3桁ごとに区切りたい。

    テキストボックスの数値を3桁ごとに区切りたい。 エクセルのユーザーフォームにテキストボックスを1~7まで並べています。 テキストボックス1~6の合計を7に入れるようにしています。 テキストボックスに記入するVBAは以下のように投入しています。 合計は上手く表示されるのですが、3桁ごとに「,」の区切りを入れたいと思っています。 どのように記述したらよいのか、教えていただけないでしょうか。 -------------------------------------- Private Sub TextBox1_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox2_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox3_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox4_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox5_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub Private Sub TextBox6_AfterUpdate() Dim i Dim res For i = 1 To 6 res = res + Val(Me.Controls("TextBox" & i).Value) Next i TextBox7 = res End Sub -------------------------------------- #次の文字を書くテキストボックスの情報に加えてみましたが、 合計が狂ってうまくいきませんでした。 TextBox1.Text = Format(TextBox1.Value, "#,##0") TextBox7.Text = Format(TextBox7.Value, "#,##0")

  • エクセル ユーザーフォームでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • ユーザーフォームのテキストボックスでVLOOK

    ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 上から順番に入力した際、テキストボックス5に値を入たら、 listのシートから該当するもの(項目は20個)をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。

  • エクセル2003のVBAで、ユーザーフォームにあるテキストボックスに入力制限をつけたいのですが

    エクセル2003のVBAで、ユーザーフォーム上にあるテキストボックスに入力制限をつけようとしています。 エクセルのセル13列目にdeg値 0 0.5 1 1.5 2 ・ ・ ・ があります。 ここにない値を入力するとエラーメッセージを表示させます。 下記のコードで、小数点を入力した瞬間(例えば「1.」)にエラーメッセージが表示されてしまいます。 どう修正したらよいか、どなたか分かりませんでしょうか? よろしくお願いいたします。 Private Sub TextBox21_Change() For i = 7 To 1446 If TextBox21.Value = ThisWorkbook.Sheets(\"default\").Cells(i, 13).Value Then Exit For Next i If i = 1447 Then MsgBox \"deg値と一致しません。補正値を入れなおしてください。\" TextBox21.Text = \"\" End If End Sub

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • VBAでのオブジェクト名の付け方で困っています。

    私が知りたいのはユーザフォームを一度作成した後にオブジェクトを追加したときのオブジェクト名の処理の仕方です。 今、EXCEL VBAでアンケート入力フォームを作成しています。テキストボックスやチェックボックスが全部で70ほどあります。以下のようにControlsコレクションを用いてユーザフォームに入力した文字列などをワークシートに追加しています。 ……<略> For i = 1 To 10 Cells(Row, i).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> しかし、入力フォームの画面構成を変更して、新たにテキストボックスやチェックボックスを追加すると、例えば、ユーザフォーム上で隣り合ったTextBox1とTextBox2の間にTextBox35が入ってきて以下のようにコードを書き換えねばなりません。 ……<略> Cells(Row, 1).Value = Me.CheckBox1.Value Cells(Row, 2).Value = Me.CheckBox35.Value For i = 2 To 10 Cells(Row, i+1).Value = Me.Controls("CheckBox" & i ).Value Next i ……<略> プロパティからオブジェクト名のひとつひとつを編集してユーザフォームのテキストボックスの表示順にするのも手間ですし……まだ、設計の試行錯誤の段階なのでまだまだテキストボックスやチェックボックスを追加・削除をすると思いますし…… 何か効率のよいオブジェクト名の付け方はないでしょうか? みなさんはどのようにされていますか?

  • VBA 空白をエラー表示させる!

    ボタンをクリックすると、入力ミスがないように MsgBoxで表示させるものを作りましたが TextBox3を都合のため切り取りました! そしたら、エラー表示され If Controls("TextBox" & i).Text = "" Then ↑黄色く表示されます! どのように下の記述を変えれば良いか教えてください! Private Sub CommandButton5_Click() Dim i As Integer For i = 1 To 9 If Controls("TextBox" & i).Text = "" Then MsgBox "判定入力していない項目がありますよ!", vbInformation, "空欄を見て!" Exit Sub End If Next If MsgBox("記録するよ?", vbOKCancel) = vbOK Then With Worksheets("グラフ") 'アセスメント身体 .Range("U2").Value = TextBox1.Value .Range("U3").Value = TextBox2.Value .Range("U4").Value = TextBox3.Value .Range("U5").Value = TextBox4.Value .Range("U6").Value = TextBox5.Value .Range("U7").Value = TextBox6.Value .Range("U8").Value = TextBox7.Value .Range("U9").Value = TextBox8.Value .Range("U10").Value = TextBox9.Value

  • エクセルのユーザーフォームにあるテキストボックスへの値代入

    エクセルのユーザーフォームにあるテキストボックスへの値代入 お世話になります. エクセルのシートの入力を,ユーザーフォームを使って入力させています. 新規の場合は空欄のフォームがでるのですが,既存の列を編集するには編集用のフォームで行っています. フォームにはテキストボックスが15個(Textbox1からTextbox15まで)あり,Textbox1はCells(*,1)Textbox2はCells(*,2)というふうにセルの列との関連付けがあります. この規則性を上手く使おうと,For Nextを使っていきたいのですが, Dim r As Integer Dim i As Integer Dim t As String r = ActiveCell.Row For i = 1 To 15 t = "TextBox" & i t = Cells(r, i).Value Next i と,ここまで入力をしてみたものの,値の代入がうまくいきません. MsgboxでCells(r, i)の動きは確認できているので,おそらく,TextBox & iのところが原因と思われますが・・・ どのように修正すればよろしいでしょうか?教えてください.

  • MDBの大量のフィールドへループでinsert

    お世話になっております。 Visual Studio2013で、テキストボックスに入力された値をmdbへ挿入しようと思っています。 フォーム上にTextBox1~ TextBox100があり、それぞれの値を1つずつフィールド へ挿入したいのですが、INSERT文へ100個もフィールド名を書かないように ループさせる方法はあるのでしょうか? For i = 1 to 100 sSql = "INSERT INTO table1(???) VALUES('" & Me.Controls("TextBox" & i).Text & "');" のようなイメージです・・・。 初心者の質問で申し訳ありませんが、よろしくお願いします。

  • テキスト値をExcel反映空欄を無視し連続入力

    テキストボックス1~30に入力した際、テキストの3行目をクリアーした後、実行ボタンを押したらExcelsheet1のABC列に入力できるがテキストに空欄が生じた場合、以下のコードでは空欄以降の値が入力できません。空欄は無視し続けてセルに入力するコード表示はあるのでしょうか、お解りになる方宜しくお願いします。 できればコード追加入力で行いたいのですが。 Private Sub 実行_Click() Dim i As Integer Dim LRow As Long LRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To 10 If Me.Controls("TextBox" & i).Text = "" Then Exit For Range("A" & LRow + i).Value = Me.Controls("TextBox" & i).Text Range("B" & LRow + i).Value = Me.Controls("TextBox" & i + 10).Text Range("C" & LRow + i).Value = Me.Controls("TextBox" & i + 20).Text Next End Sub

専門家に質問してみよう