ここから本文です

Helpnanodaさん burstgalay1002です。いつもお世話になっています。

bur********さん

2018/2/510:57:08

Helpnanodaさん

burstgalay1002です。いつもお世話になっています。

先日、VBAでのユザーフォームの処理受け渡しをご教授して頂いたのですが
発展系を行おうとしたところ、闇の中に入ってしまい…

再度、ご教授頂けると助かります。
やりたいことは
ユザーフォーム2のテキストボックスで”Y”/”N”/その他の入力で処理を分けるもので
”Y”…ユーザーフォーム1のデータをSheet”入出庫履歴”に転記
”N”…ユーザーフォーム1のデータをすべてクリアして初期状態に戻す
(フォーカスをtxt担当者へ)
その他…再入力状態(受け付けない)

<コード記載>
◎ユーザーフォーム1(最後の部分)
Private Sub txt数量_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode <> 13 Then Exit Sub
UserForm2.Show
End Sub

◎ユーザーフォーム2
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode <> 13 Then Exit Sub

Dim lastRow As Long
With UserForm1

'''-------確定"Y"の処理------
If UserForm2.TextBox1.Value = "Y" Then
'''-------管理者なら入庫に記入------
If txt担当者.Value = "管理者" Then
With Worksheets("入出庫履歴")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lastRow, 1) = Me.txt日付.Text ← ※※※ エラー
.Cells(lastRow, 2) = Me.txt品名.Text
.Cells(lastRow, 3) = Me.txt分類.Text
.Cells(lastRow, 4) = Me.txt数量.Text
.Cells(lastRow, 7) = Me.txt発注点.Text
.Cells(lastRow, 8) = Me.txt担当者.Text
.Cells(lastRow, 9) = Me.txt保管場所.Text
End With
Dim Ctrl As Control
For Each Ctrl In Controls
If TypeName(Ctrl) = "TextBox" Then _
Ctrl.Value = ""
Next Ctrl
Workbooks("備品管理.xlsm").Save
.txt担当者.SetFocus ← ※※※ エラー
'''-------管理者以外なら出庫に記入------
Else
With Worksheets("入出庫履歴")
lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
.Cells(lastRow, 1) = Me.txt日付.Text ← ※※※ エラー
.Cells(lastRow, 2) = Me.txt品名.Text
.Cells(lastRow, 3) = Me.txt分類.Text
.Cells(lastRow, 5) = Me.txt数量.Text
.Cells(lastRow, 7) = Me.txt発注点.Text
.Cells(lastRow, 8) = Me.txt担当者.Text
.Cells(lastRow, 9) = Me.txt保管場所.Text
End With
'Dim Ctrl As Control
For Each Ctrl In Controls
If TypeName(Ctrl) = "TextBox" Then _
Ctrl.Value = ""
Next Ctrl
Workbooks("備品管理システム.xlsm").Save
.txt担当者.SetFocus ← ※※※ エラー
End If
Unload UserForm2
'''-------確定"N"の処理------
ElseIf UserForm2.TextBox1.Value = "N" Then
.txt日付.Value = ""
.txt担当者.Value = ""
.txt品名.Value = ""
.txt分類.Value = ""
.txt単価.Value = ""
.txt発注点.Value = ""
.txt保管場所.Value = ""
.txt在庫数.Value = ""
.txt数量.Value = ""
.Image1.Picture = LoadPicture("")
. txt確定.Value = ""
Dim WSH As Object
Set WSH = CreateObject("Wscript.Shell")
WSH.Popup "キャンセルしました", 2, "確認", vbExclamation
Set WSH = Nothing
.txt担当者.SetFocus ← ※※※ エラー
Unload UserForm2
'''-------確定"Y"or"N"以外は入力できない------
Else
UserForm2.TextBox1.Value = ""
UserForm2.TextBox1.SetFocus
End If
End With
Application.ScreenUpdating = True
End Sub


情報を転記する処理コードはユーザーフォーム2で処理する前(ユーザーフォーム1で処理)の状態で記載してあります。
ここからどう変えればエラーが出ず、実行できるようにすることができますでしょうか?
また処理終了後にフォーカスをtxt担当者に戻したいのですが
どこで実行すればよろしいでしょうか?
(コードが整理されてなく見づらく申し訳ありません)

閲覧数:
46
回答数:
1
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

hel********さん

2018/2/511:37:30

Withステートメントの使い方が間違っています。

With Userform1
・・・
With Worksheets("入出庫履歴")
・・・

のようになっていますよね。
With からEnd With の中にWithをかけるのは、親のWithから引き継げるときだけです。

例えば、
With Cells(1,1)
With .font
.ColorIndex = 3
.Bold = true
End With
.Interior.ColorIndex=10
End With

中のWithにオブジェクトには . が付いていますよね。
Userform1だけWithを使わないで、エラーのあった場所にUserform1を対象にしてみてはどうですか?

こちらにはデータがないので検証できませんので、コードミスだけのみです。

  • 質問者

    bur********さん

    2018/2/513:06:45

    ご回答ありがとうございます。

    なるほどWithの書き方がまずいわけですか。
    理屈では理解できてるのですが、実際には…??です。

    >Userform1だけWithを使わないで、エラーのあった場所に
    >Userform1を対象にしてみてはどうですか?

    Dim lastRow As Long
    With UserForm1   ←  ここを消す

    '''-------確定"Y"の処理------
    If UserForm2.TextBox1.Value = "Y" Then  ←UserForm2.消す
    '''-------管理者なら入庫に記入------
    If txt担当者.Value = "管理者" Then ←ここへの記載が分からない
    With Worksheets("入出庫履歴")  ←ここへの記載が分からない
    lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
    .Cells(lastRow, 1) = Me.txt日付.Text

    .Cells(lastRow, 9) = Me.txt保管場所.Text
    End With

    こんな感じの認識で合っておりますでしょうか?
    エラーのあった場所にUserform1を対象にする方法が
    良く分からないのですが…

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2018/2/6 17:30:03

いろいろご教授ありがとうございました。

最後の.SetFocusのエラーは

バリアント型に代入すると回避できるようですが、、、
理由はなぞです。
(あくまで実行エラー'424'に対する処置をしたところうまくいきました)

Dim a As Variant

Set a = UserForm1.txt担当者

a.SetFocus

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる