こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Excel VBAでIF~Thenの入れ子がうまくできません。

いつもお世話になってます。
IF~Then~EndIfにIFを入れていますがうまくいきません。よろしくお願いします。
Private Sub CommandButton10_Click()

Dim i As Long
Dim 最終行 As String
Dim サーチ行 As Long
Dim 行 As Long
Dim 列 As Long

If TextBox33.Value = "" Then
MsgBox "使用量を入力してください。"

Else

If TextBox11 <> "" Then
TextBox26 = TextBox33 * TextBox11 / 100 '成分1
End If

If TextBox12 <> "" Then
TextBox25 = TextBox33 * TextBox12 / 100 '成分2
End If

Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("shinki").Activate

最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索

サーチ行 = 0
For i = 2 To 最終行
If ComboBox3.Value = Range("B" & i) Then
Workbooks("データ物質試薬管理.xls").Close savechanges:=False '保存しない


Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("kongou").Select
Range("A65536").End(xlUp).Offset(1).Select


行 = ActiveCell.Row
列 = ActiveCell.Column

Cells(行, 列) = UserForm11.TextBox16.Value 'CAS
Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量


Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS
Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量
Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類
Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位
Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名

Workbooks("データ物質試薬管理.xls").Close savechanges:=True

'showhinに在庫管理する

Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("showhin").Select
Range("A65536").End(xlUp).Offset(1).Select

行 = ActiveCell.Row
列 = ActiveCell.Column


Cells(行, 列) = UserForm11.TextBox2.Value '品名コード

Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名
'Cells(行, 列 + 2) = UserForm9.TextBox3.Value '1本の量
'Cells(行, 列 + 3) = UserForm9.TextBox4.Value '本数
Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位
Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別

Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名
Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量

Workbooks("データ物質試薬管理.xls").Close savechanges:=True
MsgBox "登録しました。"
End If
サーチ行 = i
Exit For
'End If
Next
If サーチ行 = 0 Then
MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。"
End If

End If
If TextBox21.Value = "" Then '使用量
MsgBox "使用日を入力してください。"
End If
ComboBox3.SetFocus
End Sub

投稿日時 - 2007-05-27 04:52:36

QNo.3033801

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>1 回ではなく3000回ループしています。

ループは1回です。
For i = 2 To 最終行
If ComboBox3.Value = Range("B" & i) Then
'処理
End If
Exit For
Next
となっているので、IF文終了後に強制的にループが終了します。

Exit For は不要なのでは?

投稿日時 - 2007-05-30 09:16:53

ANo.5

> サーチ行 = i
Exit For
FOR文の中のこの意味が良く解りませんが。
「サーチ行」は最後の登録メッセージのためと思われますが。。。
「Exit For」では、ループが1回しか実行されません。
1回で良ければFOR文を使用する意味はありませんし、最終行を取得する必要も無いのでは?

Private Sub CommandButton10_Click()

Dim i As Long
Dim 最終行 As String
Dim サーチ行 As Long
Dim 行 As Long
Dim 列 As Long

If IsDate(TextBox21.Value) = False Then
MsgBox "使用日を入力してください。"
Exit Sub
End If
If IsNumeric(TextBox33.Value) = False Or _
IsNumeric(TextBox11.Value) = False Or _
IsNumeric(TextBox12.Value) = False Then
MsgBox "使用量を入力してください。"
Exit Sub
End If


TextBox26 = TextBox33 * TextBox11 / 100 '成分1
TextBox25 = TextBox33 * TextBox12 / 100 '成分2

Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("shinki").Activate

最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索

サーチ行 = 0
For i = 2 To 最終行
If ComboBox3.Value = Range("B" & i) Then

Workbooks("データ物質試薬管理.xls").Activate
Sheets("kongou").Activate
Range("A65536").End(xlUp).Offset(1).Select

行 = ActiveCell.Row
列 = ActiveCell.Column

Cells(行, 列) = UserForm11.TextBox16.Value 'CAS
Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量

Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS
Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量
Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類
Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位
Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名

'showhinに在庫管理する
'Workbooks("データ物質試薬管理.xls").Activate
Sheets("showhin").Activate
Range("A65536").End(xlUp).Offset(1).Select

行 = ActiveCell.Row
列 = ActiveCell.Column

Cells(行, 列) = UserForm11.TextBox2.Value '品名コード
Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名
'Cells(行, 列 + 2) = UserForm9.TextBox3.Value '1本の量
'Cells(行, 列 + 3) = UserForm9.TextBox4.Value '本数
Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位
Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別
Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名
Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量

End If

サーチ行 = i
Exit For
'End If
Next

If サーチ行 = 0 Then
MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。"
Workbooks("データ物質試薬管理.xls").Close savechanges:=False
Else
MsgBox "登録しました。"
Workbooks("データ物質試薬管理.xls").Close savechanges:=True
End If

ComboBox3.SetFocus

End Sub

投稿日時 - 2007-05-27 22:56:00

補足

1回はComboBox3.Value = Range("B" & i) なので
1行づつを約3000行のデータをみていくと言うことなので
1回ではなく3000回ループしています。
最終行まで、イコールになるまで繰り返します。
マッチ関数やサ-チを使えば1回で済みますが・・・。
今回はイコールを使いました。

投稿日時 - 2007-05-29 21:57:00

ANo.4

>うまくいきません。よろしくお願いします。

「うまくいきません」と書かれても、動作条件も上手く行かない部分も明示されて居ないので、何が上手く動かないのかは判別できません。
エラーが起きない限り(プログラムした通りに)正しく動作しているものと思われます。

ただ、For Next ループの中でファイルのオープン・クローズを繰り返すのは動作の無駄です。
Workbooks("データ物質試薬管理.xls").Activate などと記述すれば作業ブックを切り替える事が出来ます。

投稿日時 - 2007-05-27 08:46:39

補足

言葉足らずですみません。

shinkiシートに商品名があったら
使用量=TextBox33
使用日=textbox21
使用者名=textbox29
上記3つが入力されていたら、計算をして
シートのkongouとshowhinに入力し
そうでなければ、メッセージで新規商品登録から入力・・・。とだし
登録はやめる。
使用量・使用日・使用者名が空白で登録やめる。
としたいのですが、textbox33が空白でも登録されてしまいます。

if then elseの使い方悪いと思います。
よろしくお願いいたします。

投稿日時 - 2007-05-27 20:53:36

ANo.3

疑問;

UserForm11.TextBox21.Value '使用日



TextBox21.Value '使用量

は、同一( UserForm11 )で ないでしょう??。

投稿日時 - 2007-05-27 08:43:04

ANo.2

下記 ***** を見てください。

Private Sub CommandButton10_Click()

Dim i As Long
Dim 最終行 As String
Dim サーチ行 As Long
Dim 行 As Long
Dim 列 As Long

If TextBox33.Value = "" Then
MsgBox "使用量を入力してください。"

Else

If TextBox11 <> "" Then
TextBox26 = TextBox33 * TextBox11 / 100 '成分1
End If

If TextBox12 <> "" Then
TextBox25 = TextBox33 * TextBox12 / 100 '成分2
End If
End If '← ここを追加   *****

Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("shinki").Activate

最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索

サーチ行 = 0

For i = 2 To 最終行

If ComboBox3.Value = Range("B" & i) Then
Workbooks("データ物質試薬管理.xls").Close savechanges:=False '保存しない


Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("kongou").Select
Range("A65536").End(xlUp).Offset(1).Select


行 = ActiveCell.Row
列 = ActiveCell.Column

Cells(行, 列) = UserForm11.TextBox16.Value 'CAS
Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量


Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS
Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日
Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者
Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量
Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類
Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位
Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名

Workbooks("データ物質試薬管理.xls").Close savechanges:=True

'showhinに在庫管理する

Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
Sheets("showhin").Select
Range("A65536").End(xlUp).Offset(1).Select

行 = ActiveCell.Row
列 = ActiveCell.Column


Cells(行, 列) = UserForm11.TextBox2.Value '品名コード

Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名
'Cells(行, 列 + 2) = UserForm9.TextBox3.Value '1本の量
'Cells(行, 列 + 3) = UserForm9.TextBox4.Value '本数
Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位
Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別

Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日
Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名
Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量

Workbooks("データ物質試薬管理.xls").Close savechanges:=True
MsgBox "登録しました。"
End If
サーチ行 = i
Exit For
'End If
Next i     'i を追加 ******

If サーチ行 = 0 Then
MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。"
End If

End If '← この行は、不要  *****

If TextBox21.Value = "" Then '使用量
MsgBox "使用日を入力してください。"
End If
ComboBox3.SetFocus
End Sub

投稿日時 - 2007-05-27 08:31:55

ANo.1

どういう風にうまくいかないですか?

> If サーチ行 = 0 Then
> MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。"
> End If
>
> End If

ここで、If と End If の数が合わなくなっているように見えます。

投稿日時 - 2007-05-27 08:27:06

補足

説明が悪くてすみません。

If TextBox33.Value = "" Then
  MsgBox "使用量を入力してください。"・・・・(1)

Else
----------------------------------------------ここから(2)
  If TextBox11 <> "" Then
   TextBox26 = TextBox33 * TextBox11 / 100 '成分1
  End If
  If TextBox12 <> "" Then
   TextBox25 = TextBox33 * TextBox12 / 100 '成分2
  End If

  Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
  Sheets("shinki").Activate

  最終行 = (Range("B2").End(xlDown).Row) '商品名の行検索

  サーチ行 = 0
  For i = 2 To 最終行
  If ComboBox3.Value = Range("B" & i) Then
  Workbooks("データ物質試薬管理.xls").Close savechanges:=False '保存しない


  Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
  Sheets("kongou").Select
  Range("A65536").End(xlUp).Offset(1).Select
  行 = ActiveCell.Row
  列 = ActiveCell.Column

  Cells(行, 列) = UserForm11.TextBox16.Value 'CAS
  Cells(行, 列 + 1) = UserForm11.TextBox21.Value '使用日
  Cells(行, 列 + 2) = UserForm11.TextBox29.Value '使用者
  Cells(行, 列 + 4) = UserForm11.TextBox26.Value '成分1使用量
  Cells(行 + 2, 列) = UserForm11.TextBox18.Value 'CAS
  Cells(行 + 2, 列 + 1) = UserForm11.TextBox21.Value '使用日
  Cells(行 + 2, 列 + 2) = UserForm11.TextBox29.Value '使用者
  Cells(行 + 2, 列 + 4) = UserForm11.TextBox24.Value '成分3使用量
  Cells(行 + 2, 列 + 5) = UserForm11.TextBox32.Value '種類
  Cells(行 + 2, 列 + 6) = UserForm11.TextBox34.Value '単位
  Cells(行 + 2, 列 + 7) = UserForm11.ComboBox3.Value '商品名

  Workbooks("データ物質試薬管理.xls").Close savechanges:=True

  'showhinに在庫管理する
  Workbooks.Open Filename:=ThisWorkbook.Path & "\データ物質試薬管理.xls"
  Sheets("showhin").Select
  Range("A65536").End(xlUp).Offset(1).Select

  行 = ActiveCell.Row
  列 = ActiveCell.Column
  Cells(行, 列) = UserForm11.TextBox2.Value '品名コード
  Cells(行, 列 + 1) = UserForm11.ComboBox3.Value '商品名
  Cells(行, 列 + 4) = UserForm11.TextBox34.Value '単位
  Cells(行, 列 + 5) = UserForm11.TextBox32.Value '種別
  Cells(行, 列 + 6) = UserForm11.TextBox21.Value '使用日
  Cells(行, 列 + 7) = UserForm11.TextBox29.Value '使用者名
  Cells(行, 列 + 9) = UserForm11.TextBox33.Value '使用量
  Workbooks("データ物質試薬管理.xls").Close savechanges:=True
  MsgBox "登録しました。"
  End If
  サーチ行 = i
  Exit For
  Next
   If サーチ行 = 0 Then
   MsgBox ComboBox3.Value & "商品は登録されておりません。" & Chr(10) & "「新規商品登録」ボタンから入力してください。"
   End If
------------------------------------------ここまで(2)
End If

上記のテキストボック33が空白だったら、
メッセージを"使用量を入力"をだして登録しない----(1)
そうでなかったら、
-----ここから(2)
shinkiシート商品名があれば
計算して、シートのshowhinとkongouに入力しなさい。
shinkiシートに商品がなければ
メッセージをだして登録をやめる。
と言うの作ったつもりなのですが
テキストボックス33が空白でも登録されてしまいます。
うまくいきません。
何度もすみませんがよろしくお願いいたします。

投稿日時 - 2007-05-27 21:21:28

あなたにオススメの質問