Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2109 / 13645 ツリー ←次へ | 前へ→

【69883】ユーザーフォーム検索 更新について hono1215 11/9/17(土) 7:22 質問[未読]
【69884】Re:ユーザーフォーム検索 更新について ichinose 11/9/17(土) 9:33 発言[未読]
【69886】Re:ユーザーフォーム検索 更新について hono1215 11/9/17(土) 14:34 発言[未読]
【69887】Re:ユーザーフォーム検索 更新について ichinose 11/9/17(土) 22:30 発言[未読]
【69891】Re:ユーザーフォーム検索 更新について hono1215 11/9/20(火) 15:45 お礼[未読]

【69883】ユーザーフォーム検索 更新について
質問  hono1215  - 11/9/17(土) 7:22 -

引用なし
パスワード
   どなたか御教授下さい。

下記記述で、ユーザーフォームから検索。
該当データをユーザーフォーム上に呼び出しています。
ここから、呼び出したデータを修正。元のセルに更新保存を行いたいのですが、可能でしょうか?

Private Sub CommandButton2_Click()
Dim SearchKey As String
Dim SearchArea As Range
Dim FoundCell As Range
Dim ws As Worksheet, fndflg As Boolean
'検索語入力
SearchKey = Application.InputBox( _
Prompt:="LotNo,を入力して下さい。", Type:=2)
If SearchKey = "" Or SearchKey = "False" Then
Exit Sub
End If
'検索処理
'検索範囲
fndflg = False
For Each ws In Worksheets
If ws.Name Like "*P*" Then
Set SearchArea = ws.Range(ws.Range("d5"), ws.Range("d5").End(xlDown))
Set FoundCell = SearchArea.Find( _
What:=SearchKey, _
SearchOrder:=xlByRows, _
MatchCase:=False)
'見つかった場合の処理
If Not FoundCell Is Nothing Then

fndflg = True
Exit For
End If
End If
Next
If fndflg = True Then
MsgBox FoundCell.Address
UserForm1.TextBox3.Value = FoundCell.Value
UserForm1.TextBox1.Value = FoundCell.Offset(0, -3).Value
UserForm1.TextBox2.Value = FoundCell.Offset(0, -2).Value
UserForm1.TextBox4.Value = FoundCell.Offset(0, 1).Value
UserForm1.TextBox5.Value = FoundCell.Offset(0, 4).Value
UserForm1.ComboBox2.Value = ws.Name
Else
MsgBox "該当は存在しません。", vbCritical
End If
Set SearchArea = Nothing
Set FoundCell = Nothing

End Sub

説明が不十分かと思いますが、宜しく御願い致します。
尚、このマクロは教えて頂いたもので、当方で少し変更を加えたものです。
マクロに付いては、ほぼ初心者ですので、御理解と御教授の程、宜しく御願い致します。

【69884】Re:ユーザーフォーム検索 更新について
発言  ichinose  - 11/9/17(土) 9:33 -

引用なし
パスワード
   ▼hono1215 さん:
おはようございます。

>下記記述で、ユーザーフォームから検索。
>該当データをユーザーフォーム上に呼び出しています。
>ここから、呼び出したデータを修正。元のセルに更新保存を行いたいのですが、可能でしょうか?

提示されたコード内で、ユーザーに検索文字列を入力させ、
その文字列で特定シートの指定セル範囲を検索していますね?
そこで見つかったセルを又は、そのセルのアドレスをデータ修正後まで
保持しておけば、元セルデータを戻すことは可能です。
検索して見つかったセルは、FoundCellという変数に入っていますね?
この変数は、プロシジャーレベル宣言された変数ですから、
CommandButton2_Clickというプロシジャーの実行が終了すれば、変数そのものが
無くなってしまいます。
プロシジャーの実行が終了しても値を保持するには、この変数を
モジュールレベルで宣言することです。

では、モジュールレベルで変数を宣言するとは、どうすればよいか?


>
>Private Sub CommandButton2_Click()
>Dim SearchKey As String
>Dim SearchArea As Range
Dim FoundCell As Range  'これをこのモジュールに1行目に宣言する
          'プロシジャーの1行目ではなく、モジュールの1行目です
>Dim ws As Worksheet, fndflg As Boolean
>'検索語入力
>SearchKey = Application.InputBox( _
>Prompt:="LotNo,を入力して下さい。", Type:=2)
>If SearchKey = "" Or SearchKey = "False" Then
>Exit Sub
>End If
>'検索処理
>'検索範囲
>fndflg = False
>For Each ws In Worksheets
>If ws.Name Like "*P*" Then
>Set SearchArea = ws.Range(ws.Range("d5"), ws.Range("d5").End(xlDown))
>Set FoundCell = SearchArea.Find( _
>What:=SearchKey, _
>SearchOrder:=xlByRows, _
>MatchCase:=False)
>'見つかった場合の処理
>If Not FoundCell Is Nothing Then
>
>fndflg = True
>Exit For
>End If
>End If
>Next
>If fndflg = True Then
>MsgBox FoundCell.Address
>UserForm1.TextBox3.Value = FoundCell.Value
>UserForm1.TextBox1.Value = FoundCell.Offset(0, -3).Value
>UserForm1.TextBox2.Value = FoundCell.Offset(0, -2).Value
>UserForm1.TextBox4.Value = FoundCell.Offset(0, 1).Value
>UserForm1.TextBox5.Value = FoundCell.Offset(0, 4).Value
>UserForm1.ComboBox2.Value = ws.Name
>Else
>MsgBox "該当は存在しません。", vbCritical
>End If
>Set SearchArea = Nothing
>Set FoundCell = Nothing
>
>End Sub

このようにすると、戻すセルは、FoundCellにあるのですから、
後は考えてください。

【69886】Re:ユーザーフォーム検索 更新について
発言  hono1215  - 11/9/17(土) 14:34 -

引用なし
パスワード
   ▼ichinose さん:
早速の御教授ありがとう御座います。
>モジュールレベルで宣言
は調べて理解できました。
その後、更新ボタンをユーザーフォームに配置しました
更新する際の記述が解らないのですが、少し自分で調べてみます。

Private Sub CommandButton3_Click()
Value = UserForm1.TextBox3.Value
FoundCell.Offset(0, -3).Value = UserForm1.TextBox1.Value
FoundCell.Offset(0, -2).Value = UserForm1.TextBox2.Value
FoundCell.Offset(0, 1).Value = UserForm1.TextBox4.Value
FoundCell.Offset(0, 4).Value = UserForm1.TextBox5.Value
End Sub

これではエラーがでるので、お門違いな事をやっているのでしょう…


>▼hono1215 さん:
>おはようございます。
>
>>下記記述で、ユーザーフォームから検索。
>>該当データをユーザーフォーム上に呼び出しています。
>>ここから、呼び出したデータを修正。元のセルに更新保存を行いたいのですが、可能でしょうか?
>
>提示されたコード内で、ユーザーに検索文字列を入力させ、
>その文字列で特定シートの指定セル範囲を検索していますね?
>そこで見つかったセルを又は、そのセルのアドレスをデータ修正後まで
>保持しておけば、元セルデータを戻すことは可能です。
>検索して見つかったセルは、FoundCellという変数に入っていますね?
>この変数は、プロシジャーレベル宣言された変数ですから、
>CommandButton2_Clickというプロシジャーの実行が終了すれば、変数そのものが
>無くなってしまいます。
>プロシジャーの実行が終了しても値を保持するには、この変数を
>モジュールレベルで宣言することです。
>
>では、モジュールレベルで変数を宣言するとは、どうすればよいか?
>
>
>>
>>Private Sub CommandButton2_Click()
>>Dim SearchKey As String
>>Dim SearchArea As Range
>Dim FoundCell As Range  'これをこのモジュールに1行目に宣言する
>          'プロシジャーの1行目ではなく、モジュールの1行目です
>>Dim ws As Worksheet, fndflg As Boolean
>>'検索語入力
>>SearchKey = Application.InputBox( _
>>Prompt:="LotNo,を入力して下さい。", Type:=2)
>>If SearchKey = "" Or SearchKey = "False" Then
>>Exit Sub
>>End If
>>'検索処理
>>'検索範囲
>>fndflg = False
>>For Each ws In Worksheets
>>If ws.Name Like "*P*" Then
>>Set SearchArea = ws.Range(ws.Range("d5"), ws.Range("d5").End(xlDown))
>>Set FoundCell = SearchArea.Find( _
>>What:=SearchKey, _
>>SearchOrder:=xlByRows, _
>>MatchCase:=False)
>>'見つかった場合の処理
>>If Not FoundCell Is Nothing Then
>>
>>fndflg = True
>>Exit For
>>End If
>>End If
>>Next
>>If fndflg = True Then
>>MsgBox FoundCell.Address
>>UserForm1.TextBox3.Value = FoundCell.Value
>>UserForm1.TextBox1.Value = FoundCell.Offset(0, -3).Value
>>UserForm1.TextBox2.Value = FoundCell.Offset(0, -2).Value
>>UserForm1.TextBox4.Value = FoundCell.Offset(0, 1).Value
>>UserForm1.TextBox5.Value = FoundCell.Offset(0, 4).Value
>>UserForm1.ComboBox2.Value = ws.Name
>>Else
>>MsgBox "該当は存在しません。", vbCritical
>>End If
>>Set SearchArea = Nothing
>>Set FoundCell = Nothing
>>
>>End Sub
>
>このようにすると、戻すセルは、FoundCellにあるのですから、
>後は考えてください。

【69887】Re:ユーザーフォーム検索 更新について
発言  ichinose  - 11/9/17(土) 22:30 -

引用なし
パスワード
   ▼hono1215 さん:
>▼ichinose さん:
>早速の御教授ありがとう御座います。
>>モジュールレベルで宣言
>は調べて理解できました。
>その後、更新ボタンをユーザーフォームに配置しました
>更新する際の記述が解らないのですが、少し自分で調べてみます。
>
>Private Sub CommandButton3_Click()
Value = UserForm1.TextBox3.Value  'これの意味は、わかりませんが
>FoundCell.Offset(0, -3).Value = UserForm1.TextBox1.Value
>FoundCell.Offset(0, -2).Value = UserForm1.TextBox2.Value
>FoundCell.Offset(0, 1).Value = UserForm1.TextBox4.Value
>FoundCell.Offset(0, 4).Value = UserForm1.TextBox5.Value
>End Sub
>
>これではエラーがでるので、お門違いな事をやっているのでしょう
お門違いではないですが、まず、エラーがどの行でどんな内容のエラーが表示されるのか
記述してください。


>>>
>>>Private Sub CommandButton2_Click()
>>>Dim SearchKey As String
>>>Dim SearchArea As Range
>>Dim FoundCell As Range  'これをこのモジュールに1行目に宣言する
>>          'プロシジャーの1行目ではなく、モジュールの1行目です
>>>Dim ws As Worksheet, fndflg As Boolean
>>>'検索語入力
>>>SearchKey = Application.InputBox( _
>>>Prompt:="LotNo,を入力して下さい。", Type:=2)
>>>If SearchKey = "" Or SearchKey = "False" Then
>>>Exit Sub
>>>End If
>>>'検索処理
>>>'検索範囲
>>>fndflg = False
>>>For Each ws In Worksheets
>>>If ws.Name Like "*P*" Then
>>>Set SearchArea = ws.Range(ws.Range("d5"), ws.Range("d5").End(xlDown))
>>>Set FoundCell = SearchArea.Find( _
>>>What:=SearchKey, _
>>>SearchOrder:=xlByRows, _
>>>MatchCase:=False)
>>>'見つかった場合の処理
>>>If Not FoundCell Is Nothing Then
>>>
>>>fndflg = True
>>>Exit For
>>>End If
>>>End If
>>>Next
>>>If fndflg = True Then
>>>MsgBox FoundCell.Address
>>>UserForm1.TextBox3.Value = FoundCell.Value
>>>UserForm1.TextBox1.Value = FoundCell.Offset(0, -3).Value
>>>UserForm1.TextBox2.Value = FoundCell.Offset(0, -2).Value
>>>UserForm1.TextBox4.Value = FoundCell.Offset(0, 1).Value
>>>UserForm1.TextBox5.Value = FoundCell.Offset(0, 4).Value
>>>UserForm1.ComboBox2.Value = ws.Name
>>>Else
>>>MsgBox "該当は存在しません。", vbCritical
>>>End If
>>>Set SearchArea = Nothing
Set FoundCell = Nothing  'ここで初期化していますから、この行も削除しないと
             'モジュールレベルに変数を宣言してもセルのデータが
             '保持されません

>>>
>>>End Sub

【69891】Re:ユーザーフォーム検索 更新について
お礼  hono1215  - 11/9/20(火) 15:45 -

引用なし
パスワード
   ▼ichinose さん:
色々教えて頂きありがとう御座います。
なんとか、自分の望んだ通りにマクロが動いてくれました。
また何かありましたら、宜しく御願い致します。
>▼hono1215 さん:
>>▼ichinose さん:
>>早速の御教授ありがとう御座います。
>>>モジュールレベルで宣言
>>は調べて理解できました。
>>その後、更新ボタンをユーザーフォームに配置しました
>>更新する際の記述が解らないのですが、少し自分で調べてみます。
>>
>>Private Sub CommandButton3_Click()
>Value = UserForm1.TextBox3.Value  'これの意味は、わかりませんが
>>FoundCell.Offset(0, -3).Value = UserForm1.TextBox1.Value
>>FoundCell.Offset(0, -2).Value = UserForm1.TextBox2.Value
>>FoundCell.Offset(0, 1).Value = UserForm1.TextBox4.Value
>>FoundCell.Offset(0, 4).Value = UserForm1.TextBox5.Value
>>End Sub
>>
>>これではエラーがでるので、お門違いな事をやっているのでしょう
>お門違いではないですが、まず、エラーがどの行でどんな内容のエラーが表示されるのか
>記述してください。
>
>
>>>>
>>>>Private Sub CommandButton2_Click()
>>>>Dim SearchKey As String
>>>>Dim SearchArea As Range
>>>Dim FoundCell As Range  'これをこのモジュールに1行目に宣言する
>>>          'プロシジャーの1行目ではなく、モジュールの1行目です
>>>>Dim ws As Worksheet, fndflg As Boolean
>>>>'検索語入力
>>>>SearchKey = Application.InputBox( _
>>>>Prompt:="LotNo,を入力して下さい。", Type:=2)
>>>>If SearchKey = "" Or SearchKey = "False" Then
>>>>Exit Sub
>>>>End If
>>>>'検索処理
>>>>'検索範囲
>>>>fndflg = False
>>>>For Each ws In Worksheets
>>>>If ws.Name Like "*P*" Then
>>>>Set SearchArea = ws.Range(ws.Range("d5"), ws.Range("d5").End(xlDown))
>>>>Set FoundCell = SearchArea.Find( _
>>>>What:=SearchKey, _
>>>>SearchOrder:=xlByRows, _
>>>>MatchCase:=False)
>>>>'見つかった場合の処理
>>>>If Not FoundCell Is Nothing Then
>>>>
>>>>fndflg = True
>>>>Exit For
>>>>End If
>>>>End If
>>>>Next
>>>>If fndflg = True Then
>>>>MsgBox FoundCell.Address
>>>>UserForm1.TextBox3.Value = FoundCell.Value
>>>>UserForm1.TextBox1.Value = FoundCell.Offset(0, -3).Value
>>>>UserForm1.TextBox2.Value = FoundCell.Offset(0, -2).Value
>>>>UserForm1.TextBox4.Value = FoundCell.Offset(0, 1).Value
>>>>UserForm1.TextBox5.Value = FoundCell.Offset(0, 4).Value
>>>>UserForm1.ComboBox2.Value = ws.Name
>>>>Else
>>>>MsgBox "該当は存在しません。", vbCritical
>>>>End If
>>>>Set SearchArea = Nothing
>Set FoundCell = Nothing  'ここで初期化していますから、この行も削除しないと
>             'モジュールレベルに変数を宣言してもセルのデータが
>             '保持されません
>
>>>>
>>>>End Sub

2109 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free