• ベストアンサー

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう