現在エクセルのユーザーフォームを勉強中です。職員データとメモの二つのシートがあります。職員データシート上で職員コード番号で検索し検索画面を閉じるとデータを表示するユーザーフォームが表示されるように作成しました。ここまでは出来ました。これを、コード番号の検索でメモシートの職員番号も検索し該当する番号があれば行番号を取得(変数名:メモRow)無ければカーソルを最終行に移動。データ表示フォームに職員のデータとその職員のメモデータを表示するように、メモを書きたいときはメモ表示ボックスに記入。記入したデータをメモシートにも記入できるようにしたい。
出来ないこと
(1)職員データシートの検索画面でメモシートを同時に検索したい
(2)メモシートの行番号を変数に格納したい
(3)該当番号がなければ最終行にカーソルを移動したい
(4)職員データのフォームに記入したデータをメモシートに反映させたい
わかる方どうぞ教えてください。
こんな風に作りました
Private Sub 初期化_Click()
Unload UserForm検索
UserForm検索.次へ.Enabled = False
UserForm検索.Label1.Caption = "検索値を入れて検索ボタンを押してください。"
UserForm検索.Show vbModeless
End Sub
Private Sub 検索_Click()
Dim 検索値 As String '変数を宣言。
On Error GoTo errhandler
検索値 = TextBox1.Value
If 検索値 = "" Then
MsgBox "検索する語句を入れてください。"
TextBox1.SetFocus 'TextBox1にカーソルを移動。
Else
Cells.Find(What:=検索値, After:=ActiveCell, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False).Activate
検索.Enabled = False
次へ.Enabled = True
Label1.Caption = "次をさがすには「次へ」ボタンを押してください。" 'Label1のメッセージを変える。
errhandler: '
Select Case Err.Number
Case 91
MsgBox "その検索値は存在しません。"
End Select '
End If
End Sub
Private Sub 次へ_Click()
Cells.FindNext(After:=ActiveCell).Activate
End Sub
Private Sub 閉じる_Click()
Unload Me
DATA.Show
End Sub
以上検索画面
※別シートの検索は可能ですか?
以下は表示画面(DATA)
Option Explicit
Private myRow As Long
Private Sub btm検索_Click()
Unload Me 'DATAフォームを非表示に。
UserForm検索.Show '検索フォームを表示
End Sub
Private Sub btm前_Click() '前へボタン
myRow = myRow - 1
GetData
End Sub
Private Sub btnCancel_Click()
'終了を確認する
If MsgBox("終了しますか?", vbYesNo, "確認") = vbYes Then
Unload Me
End If
End Sub
Private Sub btn次_Click() '次へボタン
myRow = myRow + 1
GetData
End Sub
※以下はデータ表示コマンドが続きます最後に
Me.tab3資格1.Value = ActiveSheet.Cells(myRow, 111).Value
Me.tab3資格2.Value = ActiveSheet.Cells(myRow, 114).Value
Me.tab4メモ.Value = Worksheets("メモ").Cells(メモRow, 3).Value
↑
表示できない、具体的に行数を入れると表示する!
End Sub
※変数:メモRowをどこで宣言すれば?
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ご提示のコードを拝見しましたが、
フォームの詳細・目的の解釈しきれなかった部分もございます。
勝手な解釈を踏まえて作成しましたので、目的の動作になっていないかもしれませんが。
ご提示のコードをベースに一連の動作をするものを作成してみました。
参考になればと思います。
>※以下はデータ表示コマンドが続きます最後に
>Me.tab3資格1.Value ~ .Cells(メモRow, 3).Value
テキストボックスで表示されているのでしょうか?
詳細が分からなかったので後の項目追加、見た目重視で
勝手ながらリストビューコントロールを使用して作成しました。
■(1)処理の流れ
「UserForm検索」フォームの表示
↓
検索値による職員シート、メモシートの検索
|
|・「次へ」で同じ検索値で他のセルへ対象が移る
↓
「閉じる」で「DATA」フォームの表示
|
|・検索された職員シートのデータがリストビューに表示
|・データを選択して「F2」キーで職員コードを変更可能
| (変更後、データリストを更新し、メモシートを再検索)
|・「検索」で「UserForm検索」へ戻る
|・「前へ」で「職員データ」の1行上のデータを表示
|・「次へ」で「職員データ」の1行下のデータを表示
|・「×」又は「キャンセル」で終了確認ダイアログの表示
↓
「メモに書込み」ボタンをクリック
|
|―→「メモ」シートに見つからない場合
| ・「職員データ」:見つかった行のメモを変更
| ・「メモ」:最終行に職員コード、氏名、メモを追加
↓
「メモ」シートに見つかった場合
・「職員データ」:見つかった行のメモを変更
・「メモ」:見つかった行のメモを変更
■(2)前提条件
動作の前提条件として以下のようになっている必要があります。
・シート名は「職員データ」「メモ」とする
(標準モジュールのSettingプロシージャで設定可能)
・両シートとも、1行目は項目名が入っている
・両シートとも、A列「職員コード」B列「氏名」C列「メモ」となっている
・「職員データ」のDG列(111列目)「資格1」DJ列(114列目)「資格2」とする
(この項目は増減することが出来ます。コード内のコメント参照)
・「メモ」に存在し、「職員データ」に存在しない「職員コード」は考慮していません
■(3)ユーザーフォームの作成
添付画像のような配置で「UserForm検索」と「DATA」フォームを作ります。
リストビューの追加方法は下記URLを参考に願います。
http://officetanaka.net/Excel/vba/listview/index …
上記ページの下部リンクより以下を参照してListView1をDATAフォームへ配置してください。
1.ListViewコントロールの組み込み
2.ListViewコントロールの配置
■(4)標準モジュールの挿入
VBEの挿入→標準モジュールから標準モジュールを挿入してください。
■(5)VBAコードの貼付
コードを全て記述すると文字数オーバとなるため、
クラウド(Doropbox)にアップロードしています。
(この提示方法が問題であれば数回の回答に分けてコードを投稿致します)
(1)標準モジュールに以下のコードを貼付
https://www.dropbox.com/s/qtl24d87bm730tf/Module …
(2)「UserForm1」に以下のコードを貼付
https://www.dropbox.com/s/pzzvjejhhgd7dgv/UserFo …
(3)「DATA」に以下のコードを貼付
https://www.dropbox.com/s/ppsnsn1g01lpges/DATA.t …
■(6)実行
標準モジュールの「search_form_view」を実行してください。
検索フォームが表示されるので、上記「■(1)処理の流れ」にそって
操作願います。
No.2
- 回答日時:
ご提示の(1)~(4)に対する回答を主としておりましたので、
目的の動作とそぐわない結果になっていました事お詫び申し上げます。
>(1)職員データ・メモ 両方のシートに職員番号がある場合。
>検索画面を閉じるとメモシート上にデータフォームが表示され
>肝心の職員のデータが表示されない。
→Worksheets("職員データ").Activateを追加
ご提示の修正方法で良いと思います。
>(2)職員データにあってメモシートにない場合
>検索フォームの閉じるをクリックすると実行時エラー'1004'
こちらでは再現できませんでした。
両シートとも、A列1~10行目に文字列で001~010の通し番号をいれた
データのうちメモシートの数行だけ削除したデータでテストしています。
お手数ですが同じ状態のデータで再度エラーが発生するか確認願います。
>カーソルは最終の職員番号の位置に有り
>→iカーソルはメモシートの最終の職員番号の下
Cells(Rows.Count, "A").End(xlUp).Offset(0, 1).Select
とすることで最終行1行下を選択することが出来ます。
>ii閉じるボタンを押すと職員データシートに移り
>メモ以外の職員のデータは表示したい
おそらくDATAフォームの動作とおもわれますが、
こちらは詳細な作成を行っておらずNo1のようにメモRowの共有と、
値の設定方法についてのみの説明としておりました。
文字数制限により、次の投稿にてご提示の捕捉とご質問内容を
合わせたフォームを作成したものを投稿致します。
>iii当月のメモ内容をメモシートに書き込みたい。
>職員コード・氏名(これは職員データにあります)・メモ
>を最終行に書き込みたい
「職員データ」「メモ」シート共に存在する場合は
両方のメモデータを入力ボックスの値で置き換え、
「メモ」シートに職員コードが見つからなければ
入力ボックスの値をメモの値としてメモシートの最終行+1行へ
職員コード、氏名、メモを追加するということでしょうか?
以上を踏まえて作成してみましたので、コードを次に投稿致します。
動作状態は添付画像のような形になります。
No.1
- 回答日時:
ユーザーフォームの仕様がなかったため、
質問文・コードから適当に想定しています。
(ユーザーフォーム「DATA」は適当)
添付画像のような流れで、各モジュールに記述するコードを
下記「■(1)~(3)」に記載しています。
・各プロシージャの頭には「▽」で説明をコメントしています
・新規で追加したコードには説明のコメントを入れています
ご提示の問題に対する回答としては以下のようになります。
>(1)職員データシートの検索画面でメモシートを同時に検索したい
→ ■(2)を参照:▼「メモ」シートをアクティブにして検索
>(2)メモシートの行番号を変数に格納したい
→ ■(1)を参照:Public メモRow As Long
→ ■(2)を参照:メモRow = 検索セル.Row
>(3)該当番号がなければ最終行にカーソルを移動したい
→ ■(2)を参照:Cells(Rows.Count, "A").End(xlUp).Select
>(4)職員データのフォームに記入したデータをメモシートに反映させたい
→ ■(3)を参照
不明な点があれば補足願います。
■(1)新規に標準モジュールを挿入して記述
'▽ユーザーフォーム間で共通の広域変数を宣言
Public メモRow As Long
■(2)ユーザーフォーム「UserForm検索」へ記述
Private myRow As Long
'▽新しくテキストボックスに入力されたらボタン状態をリセット
Private Sub TextBox1_Change()
検索.Enabled = True
次へ.Enabled = False
End Sub
'▽Unloadさせず、値とボタン状態をリセット
Private Sub 初期化_Click()
With Me
.次へ.Enabled = False
.Label1.Caption = "検索値を入れて検索ボタンを押してください。"
.TextBox1.Value = ""
End With
End Sub
'▽On Errorを使わず検索結果を判定、メモシートも検索して変数に代入
Private Sub 検索_Click()
Dim 検索値 As String '変数を宣言。
Dim 検索セル As Range '検索結果のセルを代入するセル変数
検索値 = TextBox1.Value
If 検索値 = "" Then
MsgBox "検索する語句を入れてください。"
TextBox1.SetFocus 'TextBox1にカーソルを移動。
Else
'▼「職員データ」シートをアクティブにして検索
Worksheets("職員データ").Activate
Set 検索セル = Cells.Find(What:=検索値, After:=Selection, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False)
'検索で見つかれば選択、見つからなければerrhandlerへ移動
If 検索セル Is Nothing Then GoSub errhandler Else 検索セル.Select
'▼「メモ」シートをアクティブにして検索
Worksheets("メモ").Activate
Set 検索セル = Cells.Find(What:=検索値, After:=Selection, LookIn:=xlValues, LookAt:= _
xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False)
'検索で見つかれば選択、見つからなければerrhandlerへ移動
If 検索セル Is Nothing Then
メモRow = 0 '見つからなかったらメモRowを0にする
GoSub errhandler
Else
検索セル.Select
メモRow = 検索セル.Row '変数に行番号を代入
End If
検索.Enabled = False
次へ.Enabled = True
Label1.Caption = "次をさがすには「次へ」ボタンを押してください。" 'Label1のメッセージを変える。
End If
Exit Sub 'プロシージャを終了
'▼見つからない場合の処理
errhandler:
MsgBox """" & ActiveSheet.Name & """シートにその検索値は存在しません。"
'最終行を選択
Cells(Rows.Count, "A").End(xlUp).Select
Return '呼び出し元へ戻る
End Sub
'▽『検索_Click』とほぼ同じなのでコメント省略
Private Sub 次へ_Click()
Dim 検索セル As Range
Worksheets("職員データ").Activate
Set 検索セル = Cells.FindNext(After:=Selection)
If 検索セル Is Nothing Then GoSub errhandler Else 検索セル.Select
Worksheets("メモ").Activate
Set 検索セル = Cells.FindNext(After:=Selection)
If 検索セル Is Nothing Then
GoSub errhandler
メモRow = 0
Else
検索セル.Select
メモRow = 検索セル.Row
End If
Exit Sub
errhandler:
MsgBox """" & ActiveSheet.Name & """シートにその検索値は存在しません。"
Cells(Rows.Count, "A").End(xlUp).Select
Return
End Sub
'▽DATAフォームのLoadが無かったので追加
Private Sub 閉じる_Click()
Unload Me
Load DATA
DATA.Show
End Sub
■(3)ユーザーフォーム「DATA」へ記述
'▽DATAフォームは適当に作成しました。
' (機能としては以下の仕様)
'【1】メモRowの値をLabel1に表示させる
'【2】「メモ」シートの検索行に文字を入力する
'【1】ラベルにメモRow(広域変数)を表示する
Private Sub メモRowを表示_Click()
Me.Label1.Caption = メモRow
End Sub
'【2】「メモ」シートの検索行に文字を出力する
Private Sub 入力して終了_Click()
If メモRow = 0 Then Exit Sub 'メモRowが0なら終了
'「メモ」シートの検索行のB列にテキストボックスの内容を入力
Worksheets("メモ").Cells(メモRow, "B").Value = Me.TextBox1.Value
Unload Me
End Sub
この回答への補足
早速、詳しいご教示ありがとうございます。
このユーザーフォームを作るのにインターネットで色々調べつぎはぎして数ヶ月がかりで作成しましたが、質問をしてすぐに返事を頂き、ただただ驚嘆しております!!
検索して表示するところまで作成しました。上手くいかないところがあります。
(1)職員データ・メモ 両方のシートに職員番号がある場合。
検索画面を閉じるとメモシート上にデータフォームが表示され肝心の職員のデータが表 示されない
'▽DATAフォームのLoadが無かったので追加
Private Sub 閉じる_Click()
Unload Me
Worksheets("職員データ").Activate ←この行を追加すると職員データシートに表示
Load DATA されるようになりました。
DATA.Show
End Sub
(2)職員データにあってメモシートにない場合
検索フォームの閉じるをクリックすると
実行時エラー'1004':
アプリケーション定義またはオブジェクト定義エラーです 。
とメッセージが有りデバッグ を押すと
検索画面のコードが表示され
'▽DATAフォームのLoadが無かったので追加
Private Sub 閉じる_Click()
Unload Me
Worksheets("職員データ").Activate
Load DATA ←この行が黄色く反転しています。
DATA.Show
End Sub
と表示されます
※検索フォームを閉じる前は
メモシート上で
"メモ"フォームにその検索値は存在しません。のお知らせが有り
OKを押すと
検索画面は表示されていて
カーソルは最終の職員番号の位置に有り
この検索画面の閉じるボタンを押すと上記のようになります。
※私としてはこのとき
iカーソルはメモシートの最終の職員番号の下(新しく職員番号・氏名・メモを書きたいため)
ii閉じるボタンを押すと職員データシートに移りメモ以外の職員のデータは表示したい
ここはまだ教えていただいた所を試していませんが
iii当月のメモ内容をメモシートに書き込みたい。職員コード・氏名(これは職員データにあります)・メモを最終行に書き込みたい
職員データは毎月総務課で作成し、私は給与計算の時このデータを参考にしております。当月間違いがあって次月にメモとして残したい時や、総務課で作成するデータ以外の事もデータとして残しておきたいのでこのようにメモシートを独立して作りました。メモシートはA:職員コード B:氏名 C:メモ です。ちょうど今、やっと9月の給与計算が終了し今度は月末の処理が始まります。このエクセルのシートが上手く動くようになれば自分の仕事がこの上なくスムースに進むと思います。どうぞよろしくご教示くださいますようお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) ユーザーフォームの表示を追加したい 2 2023/03/26 23:18
- Excel(エクセル) 指定文字列が該当するA列をアクティブセルにするには 3 2022/08/17 13:18
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Access(アクセス) Accessでセレクタをダブルクリックで別フォームで詳細表示 3 2022/12/20 10:36
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
-
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
Excel VBAのユーザーフォームでVLOOKUP
Visual Basic(VBA)
-
-
4
エクセルVBAで、条件に一致するセルへ移動
Excel(エクセル)
-
5
エクセルで検索結果をユーザーフォームに表示したいのですが
Excel(エクセル)
-
6
エクセルVBA ユーザーフォームのTextBoxを日付にしたい
Excel(エクセル)
-
7
別のシートから値を取得するとき
Visual Basic(VBA)
-
8
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
9
Excelにて、ユーザーフォームで、日付けの範囲を指定し、検索しデーターを抽出し 別シートへ転記した
Excel(エクセル)
-
10
Excelマクロ ユーザーフォーム使い 該当データー(行)データ検索 抽出 別シートへ転記
Excel(エクセル)
-
11
エクセルのユーザーフォームでVLOOKUPと同じ機能をするには?
Excel(エクセル)
-
12
ユーザーフォームへのデータ入力を繰り返す方法
Visual Basic(VBA)
-
13
エクセルVBAでテキストボックスに入力があった場合のみ、ワークシートに転記したい
Visual Basic(VBA)
-
14
ExcelのComboboxでマウスのスクロールを有効にしたい
Excel(エクセル)
-
15
Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について
Visual Basic(VBA)
-
16
【Excel VBA】ユーザーフォームで選択した複数条件に一致するデータ行を削除
Excel(エクセル)
-
17
エクセルVBA「リストボックスで選択した値をテキストボックスで変更してシート上セルに反映したい」
Excel(エクセル)
-
18
エクセル VBA ユーザーフォーム リストボックスで選択した値をテキストボックスに自動表示
Visual Basic(VBA)
-
19
VBA。リストボックスの値を別のユーザーフォームのテキストボックスに反映したい。
Access(アクセス)
-
20
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルファイルのシート毎の容量
-
Excelでシートの違うデータでグ...
-
複数シートからデータを拾って...
-
シート削除して同名シート追加...
-
トランジスタの選び方
-
excelの不要な行の削除ができな...
-
EXCELで2つのファイルから重複...
-
エクセルで名簿を50音で切り分ける
-
エクセルVBAで、特定文字から始...
-
EXCEL 複数行のデータを1行にま...
-
Googleスプレッドシートフィル...
-
オートフィルタで抽出したデー...
-
他のシートの一番下の行データ...
-
電子部品のデータシートの探し方
-
Excelで日付変更ごとに、自動的...
-
EXCELのシートの保護機能につい...
-
(VBAにて)日付でデータを抽出す...
-
時間帯の重複を除いた集計について
-
【Excel】マクロでグラフ系列に...
-
ファンモータが作動しない。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルファイルのシート毎の容量
-
複数シートからデータを拾って...
-
Excelでシートの違うデータでグ...
-
シート削除して同名シート追加...
-
excelの不要な行の削除ができな...
-
Excelで日付変更ごとに、自動的...
-
VBAで CTRL+HOMEの位置へ移動...
-
トランジスタの選び方
-
EXCELで2つのファイルから重複...
-
EXCEL 複数行のデータを1行にま...
-
他のシートの一番下の行データ...
-
オートフィルタで抽出したデー...
-
エクセルのカメラ機能について
-
(VBAにて)日付でデータを抽出す...
-
エクセルで名簿を50音で切り分ける
-
別々のシートの表をピボットテ...
-
Excel 売上管理シートに入力し...
-
Excelマクロ 差分抽出の方法が...
-
EXCEL の表を一行ずつシートに...
-
エクセルVBAで、特定文字から始...
おすすめ情報