OCN光で最大124,800円おトク!

自力でVBAを書いてみたのですが、長くなってしまいました。
もうちょっとシンプルにするアイディアがあればお願いします。
やりたいことは、
(1)ユーザーフォームのテキストボックス内が空欄だったら「無視」
(2)テキストボックスの中が空欄でなければ「書き込み」
以上のことをやりたいのですが、テキストボックスが6種類あるので単純に記述すると結構長くなってしまいました。
特に問題がなければ、その旨をお願いします。

If TextBox1 = "" Then
If TextBox2 = "" Then
If TextBox3 = "" Then
If TextBox4 = "" Then
If TextBox5 = "" Then
If TextBox6 = "" Then
MsgBox ("得点が入力されていません。")
ElseIf TextBox6 <> "" Then
Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value
End If
ElseIf TextBox5 <> "" Then
Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value
ElseIf TextBox6 <> "" Then
Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value
End If
End If
ElseIf TextBox4 <> "" Then
Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value
If TextBox5 <> "" Then
Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value
If TextBox6 <> "" Then
Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value
End If
End If
End If
ElseIf TextBox3 <> "" Then
Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value
If TextBox4 <> "" Then
Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value
If TextBox5 <> "" Then
Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value
If TextBox6 <> "" Then
Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value
End If
End If
End If
End If
ElseIf TextBox2 <> "" Then
Sheets("総合(得点)").Cells(t + 5, u) = TextBox2.Value
If TextBox3 <> "" Then
Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value
If TextBox4 <> "" Then
Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value
If TextBox5 <> "" Then
Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value



こんな感じで規則的に記述しただけです。(文字数が多いので最後は省略しました)
段差がなくて見づらいですが、宜しくお願いします。

A 回答 (4件)

No.1の方が言っていますが、if多すぎ&重ねすぎ(笑)


自分でもよくわからなくなってきませんか?

俺ならこうするって例えですが
Dim MyTextBox
Dim iCnt As Integer
With UserForm1
 For Each MyTextBox In .Controls 'UserForm1内部のコントロールを次々に代入
  If MyTextBox.Name Like "TextBox*" Then '今回代入したコントロール名が"TextBoxほにゃらら"だったら
   If MyTextBox.Text <> "" Then 'そのコントロールに値が入っていたら
    iCnt = CInt(Replace(MyTextBox.Name, "TextBox", "")) 'コントロール名の"TextBox"の部分を""に変換(例:TextBox1→1)
    'iCntの変換が必要ならここに記述
    Cells(iCnt, 1) = MyTextBox.Text
   End If
  End If
  iCnt = 0 '初期化
 Next MyTextBox
End With

ソースはあえて色々含めています
慣れればそれほどすごい事をしているわけではないと判りますが、この方法でやれば、TextBoxはいくら増えても(限度はありますが)この部分の調整は要らなくなります

変数『t』と『u』について触れていませんでしたが、ソースを載せるのであれば、その辺もきちんと書くようにすると、好感度が上がります
好感度が上がると「よっしゃ教えちゃろう」って気に拍車が掛かるため、結局あなたの為です
蛇足ですが、Tabの代わりに全角スペースを2個入れると見た目が同じになります
    • good
    • 0
この回答へのお礼

みなさん、いろいろな回答ありがとうございました。
無事、コードをシンプルにすることができました。
また一歩成長した気がします。
pulsaさんの回答が応用範囲が広そうだったので、使わせてもらいました。

お礼日時:2008/05/05 23:10

やっていることが良くわからない(私ならやりそうに無い流儀のコードなので)のだが


下記が参考にならないか考えて、できれば応用してみてはどうでしょう。
UserForm1フォームに,仮にテキストを3つ貼り付ける。コマンドボタンを1つ張り付け。
コードはコマンドボタンのクリックイベントに
Private Sub CommandButton1_Click()
U = 3
t = 8
For i = 1 To 3
Worksheets("Sheet1").Cells(t + (i - 1) * 2, U) = UserForm1.Controls("TextBox" & i).Text
Next i
End Sub
ーーー
これで操作は
フォームのテキストボックス1-3にデータを入れる。
コマンドボタンを押す。
上記だとC8、C10、C12にテキストボックスの1-3の値がそれぞれセットされる。
セット先の番地が不規則でも、配列に行データを持つとかして、手を打てる。
テキストボックスの空白チェックも出来るが、する必要があるのかな。
    • good
    • 0

優先順位が TextBox6 TextBox5 TextBox4 TextBox3 TextBox2 TextBox1といった順でいいなら



dim ctl as MSForms.TextBox
dim n as integer
for n = 6 to 1 Step -1
  set Ctl = Coltrols( "TextBox" & n )
  if ctl.Value<>"" then
    Sheets("総合(得点)").Cells(t+n+3,u).value = ctl.value
    exit sub
  End if
  MsgBox "得点が入力されていません。"
next
といた具合でしょう
ただし t,uなどが別に定義されているとします
    • good
    • 0

Ifに頼りすぎです。

こんな感じですかね
※全角の空白を使ってます。半角の空白に置き換えてね

Dim b_blank As Boolean
Dim w_sh As Worksheet

b_blank = True
Set w_sh = Sheets("総合(得点)")

If TextBox1.Value <> "" Then
 w_sh.Cells(t + 3, u) = TextBox1.Value
 b_blank = False
End If

' 省略

If TextBox6.Value <> "" Then
 w_sh.Cells(t + 9, u) = TextBox6.Value
 b_blank = False
End If

If b_blank = True Then
 MsgBox ("得点が入力されていません。")
End If
    • good
    • 0

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


人気Q&Aランキング