アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBA初心者です。以下のコードに不具合があって、結果が変です。
どうしても直らないので、どなたかお助けいただけませんか。

目的:顧客リストを作るユーザーフォームを作成している。
textbox1に顧客番号を入力すると、その顧客に関して
すでに入力した情報がユーザーフォームとシート上の検索結果を表示する行B-S2行に
表示されるようにする。

現状:最初はテキストボックスだけを使用していて、うまくいっていた。
途中でコンボボックスを4か所追加したところ、ユーザーフォームと
シート上の検索結果を表示する行に、結果がずれて表示されてしまうようになった。
例えば、I2は空欄、本来I2に表示されてほしいCombobox2の値はJ2に表示されている。
以下の列はどんどんずれて行っている。
変数の場所の指定の仕方が違うのでしょうが、いろいろいじっても直りません。

Private Sub CommandButton2_Click()

Range("B2").Value = TextBox1.Value
Dim mycell As Range
Set mycell = Range("B4:B70").Find(What:=Range("B2").Value, LookAt:=xlWhole)
If Not mycell Is Nothing Then
mycell.Select
With UserForm1
For i = 2 To 14
UserForm1.Controls("TextBox" & i).Value = mycell.Offset(, i - 1).Value
Next i
End With
Range("C2").Value = TextBox2.Value
Range("D2").Value = TextBox3.Value
Range("E2").Value = TextBox4.Value
Range("F2").Value = TextBox5.Value
Range("G2").Value = TextBox6.Value
Range("H2").Value = TextBox7.Value
Range("I2").Value = ComboBox2.Value
Range("J2").Value = TextBox8.Value
Range("K2").Value = ComboBox3.Value
Range("L2").Value = TextBox9.Value
Range("M2").Value = ComboBox4.Value
Range("N2").Value = TextBox10.Value
Range("O2").Value = ComboBox5.Value
Range("P2").Value = TextBox11.Value
Range("Q2").Value = TextBox12.Value
Range("R2").Value = TextBox13.Value
Range("S2").Value = TextBox14.Value
Else
MsgBox "未登録番号です"
Exit Sub
End If
End Sub

質問者からの補足コメント

  • うーん・・・

    ご回答ありがとうございます。名前は面倒で変えていなかったのですが、結局、順番に数えて特定する手間が生じるので、名前をちゃんと付けようと思います。

    数え方がおかしいのか、名前は自体は、ずれていないように思います。「テキストボックス1に顧客番号入力→コマンドボタン2押す」でそれまでに入力した顧客情報を呼び出しているつもりなのですが、その際、前回にコンボボックス(「あり」か「なし」を選ぶ)で選択して保存した答えが、次に情報を呼び出した際にコンボボックス内に表示されません。コンボボックスは未選択(空欄)のまま、「あり」か「なし」の答えがその次のテキストボックスに表示されます。

    どうしたらいいか分かりません。画面をお見せできず、正しく質問できているかも不明で、申し訳ありません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/09/24 13:46

A 回答 (7件)

#6 です


ボケボケで申し訳ないです。
(見直してよかった、、投稿前に見直せよ!)
With UserForm1は無視していました 削除して良いと思います。

If i = 7 And 9 And 11 And 13 Then・・なんじゃこれ、、!!
下記の様に訂正します。
If i = 7 Or i = 9 Or i = 11 Or i = 13 Then

If i = 9 And 11 And 13 And 15 And 17 Then については
上記訂正を参考に自身で直してください

酔いが限界と判断して寝ます。。すみません。
    • good
    • 0

こんばんは


テキストボックス、コンボボックスの出力先と抽出先が一致していませんね

名前添え字がそのままとして、分けて考えた方がわかり易いのではないでしょうか
Private Sub CommandButton2_Click()の前に一度出力していると言う事で良いでしょうか、、、

テストしていませんが、こんな感じでどうでしょう
Dim n As Integer, j As Integer
n = 2 'ComboBox添え字
j = 2 'TextBox添え字
If Not mycell Is Nothing Then
mycell.Select
With UserForm1
For i = 1 To 17
If i = 7 And 9 And 11 And 13 Then
UserForm1.Controls("ComboBox" & n).Value = mycell.Offset(, i).Value
n = n + 1
Else
UserForm1.Controls("TextBox" & j).Value = mycell.Offset(, i).Value
j = j + 1
End If
Next i
End With
n = 2 'ComboBox添え字
j = 2 'TextBox添え字
For i = 3 To 19 'セルの列番号
If i = 9 And 11 And 13 And 15 And 17 Then 'ComboBoxからの列番号
Cells(2, i).Value = UserForm1.Controls("ComboBox" & n).Value
n = n + 1
Else 'Not ComboBox
Cells(2, i).Value = UserForm1.Controls("TextBox" & j).Value
j = j + 1
End If
Next
Else

テストしていないので書き替え部分だけですが、、
Offset場所間違っていたら、ごめんなさいです。。
    • good
    • 0
この回答へのお礼

おかげさまで解決できました!スマートな書き方をされていて、すごく勉強になりました。ありがとうございます。

お礼日時:2021/09/25 06:03

あ。



>For i = 2 To 14

ではなく

For i = 2 To 18ですか。
    • good
    • 0

With UserForm1


For i = 2 To 14
UserForm1.Controls("TextBox" & i).Value = mycell.Offset(, i - 1).Value
Next i
End With
Range("C2").Value = TextBox2.Value
Range("D2").Value = TextBox3.Value
Range("E2").Value = TextBox4.Value
Range("F2").Value = TextBox5.Value
Range("G2").Value = TextBox6.Value
Range("H2").Value = TextBox7.Value
Range("I2").Value = ComboBox2.Value
Range("J2").Value = TextBox8.Value
Range("K2").Value = ComboBox3.Value
Range("L2").Value = TextBox9.Value
Range("M2").Value = ComboBox4.Value
Range("N2").Value = TextBox10.Value
Range("O2").Value = ComboBox5.Value
Range("P2").Value = TextBox11.Value
Range("Q2").Value = TextBox12.Value
Range("R2").Value = TextBox13.Value
Range("S2").Value = TextBox14.Value
Else
-----------これを--------

For i = 2 To 14
Range("B2").Offset(, i - 1).Value = mycell.Offset(, i - 1).Value
Next i

TextBox2.Value = Range("C2").Value
TextBox3.Value = Range("D2").Value
TextBox4.Value = Range("E2").Value
TextBox5.Value = Range("F2").Value
TextBox6.Value = Range("G2").Value
TextBox7.Value = Range("H2").Value
ComboBox2.Value = Range("I2").Value
TextBox8.Value = Range("J2").Value
ComboBox3.Value = Range("K2").Value
TextBox9.Value = Range("L2").Value
ComboBox4.Value = Range("M2").Value
TextBox10.Value = Range("N2").Value
ComboBox5.Value = Range("O2").Value
TextBox11.Value = Range("P2").Value
TextBox12.Value = Range("Q2").Value
TextBox13.Value = Range("R2").Value
TextBox14.Value = Range("S2").Value
Else

とか?
    • good
    • 0
この回答へのお礼

おかげさまで解決できました!ここ1週間くらい、ずっと考えて分からなかったので助かりました。感謝します。

お礼日時:2021/09/25 06:02

スマホなのでスマートとはいきませんが,


・見つかったセル以降のデータを2行目に入れる
・2行目のデータを各コントロールに入れる
みたいに順序を入れ替えてみるとか?
    • good
    • 0
この回答へのお礼

いろいろやって、まだうまく行っていませんが、ご助言ありがとうございました。

お礼日時:2021/09/24 18:38

For i = 2 To 14


UserForm1.Controls(\"TextBox\" & i).Value = mycell.Offset(, i - 1).Value
Next i

上記って見つかった場合にその行の値を『テキストボックス』だけに入れるようになってますよね?
これって目的に合ってますか?
スマホなので検証は出来ませんが気になったので。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おっしゃるとおりで、そこが対応できていません。
しかし素人考えで
For i = 2 To 18 (もともとはテキストボックス分の14)
UserForm1.Controls("TextBox", "ComboBox" & i).Value = mycell.Offset(, i - 1).Value
Next i
End With
(テキストボックスの横にコンボボックスを足した)にするとコンパイルエラーが出ます。本当に基本的な書き方なのでしょうが、分かりません。

お礼日時:2021/09/24 15:00

> 途中でコンボボックスを4か所追加したところ、



コントロールの追加、削除を行うと、
TextBox3だったものがTextBox4に名前が変わってたりとかする事もあった気がするけど。
まずは、テキストボックスのプロパティとかで、期待した通りに名前が振られているか、確認しては。

そういうの避けるには、きちんとコントロールに、
TextBox氏名
TextBox_年齢
TextBox03住所
とか、自動で振られる名前と別の名前付けとくのが良いと思う。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。名前は面倒で変えていなかったのですが、結局、順番に数えて特定する手間が生じるので、名前をちゃんと付けようと思います。ありがとうございます。

お礼日時:2021/09/24 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!