[[20200921102921]] 『EXCEL VBAでユーザーフォームを作成中です』(たかさん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『EXCEL VBAでユーザーフォームを作成中です』(たかさん)

独学で勉強しながら作成を行っていましたが行き詰ってしまったので質問します

・情報を表示させるフォーム

・検索フォーム

この2つを作成しておりまして。

検索フォームで検索を行い、結果をダブルクリックをするとフォームに反映されるものなのですが

検索の結果表示(リストボックス)には

【行番号】と【氏名】が現状表示されています。

ですが本来の希望は行番号ではなくユーザーナンバーをリストボックスに表示をさせたいのです。

そこでVBAを編集しようと思ったのですが

下記コードの←修正必要?の部分をユーザーナンバー記載されているWorksheets(データ").Cells(wRow, 1)

に2か所変更すると確かにリストボックス上はユーザーナンバーが表示されるのですが

ダブルクリックをしても情報が表示されません。


Private Sub SetListBox() '← リストに表示する処理追加

Dim wRow As Long

Dim wLstRow As Long

Me.検索候補.Clear

wLstRow = 0

For wRow = 2 To Worksheets("データ").Range("A1").CurrentRegion.Rows.Count

If Me.サーチ = "" Then

Me.検索候補.AddItem

Me.検索候補.List(wLstRow, 0) = wRow←修正必要?

Me.検索候補.List(wLstRow, 1) = Worksheets("データ").Cells(wRow, 2)

wLstRow = wLstRow + 1

Else

If InStr(1, Worksheets("データ").Cells(wRow, 2), Me.サーチ, vbTextCompare) > 0 Then

Me.検索候補.AddItem

Me.検索候補.List(wLstRow, 0) = wRow←修正必要?

Me.検索候補.List(wLstRow, 0) = Worksheets(データ").Cells(wRow, 2)

wLstRow = wLstRow + 1

End If

End If

Next

End Sub


簡単ですがこちらで解決策がお分かりの方いらっしゃいましたらご教示いただけませんでしょうか

< 使用 Excel:Office365、使用 OS:Windows10 >


>ダブルクリックをしても情報が表示されません。

何をダブルクリックするのですか。
どこに、情報表示するのですか。

行番号の場合は、ダブルクリックで表示できるのですか?

(マナ) 2020/09/21(月) 11:08


投稿がかぶりましたがそのまま。

ちょっと見づらかったのでコードを整理しました

    Private Sub SetListBox() '← リストに表示する処理追加
        Dim wRow As Long
        Dim wLstRow As Long

        Me.検索候補.Clear
        wLstRow = 0

        For wRow = 2 To Worksheets("データ").Range("A1").CurrentRegion.Rows.Count
            If Me.サーチ = "" Or InStr(1, Worksheets("データ").Cells(wRow, 2), Me.サーチ, vbTextCompare) > 0 Then
                Me.検索候補.AddItem
                Me.検索候補.List(wLstRow, 0) = wRow '←修正必要?
                Me.検索候補.List(wLstRow, 1) = Worksheets("データ").Cells(wRow, 2)
                wLstRow = wLstRow + 1
            End If
        Next
    End Sub

そのうえで、「ダブルクリックをしても情報が表示されません。」とのことですが、ダブルクリックした際の処理はどのように書いているのでしょうか?
その部分を提示できませんか?

※見やすさを優先して条件を「or」で繋げましたが、処理速度を優先するならもとに戻してください。(僅差でしょうけど)

(もこな2) 2020/09/21(月) 11:11


Private Sub 検索候補_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    rtnNo = Me.検索候補.Text      
    Unload Me     

ダブルクリックの部分です★
(たかさん) 2020/09/21(月) 11:55


リストボックスのダブルクリックに関しまして補足いたします
現状

Private Sub 検索候補_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
rtnNo = Me.検索候補.Text
Unload Me
こちらが入力されています

検索フォームというのが

テキストボックスに名前を入力するとしたのリストボックスに
行番号と名前が表示されます
上記の状態の場合、リスト内をダブルクリックすると
別のユーザーフォームに名前以外の情報が任意のテキストボックスに表示されます

これを
ユーザーナンバーと名前をリストボックスに表示するように質問本文の赤字のみを編集した場合
リストボックスにはユーザーナンバーと名前が表示されるがそれをダブルクリックしても
フォームには情報が反映されない状態になっています。
(たかさん) 2020/09/21(月) 11:57


なぜ、検索結果を表示させるのに
リストボックスを経由するのでしょうか。

(マナ) 2020/09/21(月) 13:00


マナ様
空白の場合すべてのユーザーNoと氏名が表示され
その中から閲覧したいユーザーを選ぶことができると思い採用しました
(たかさん) 2020/09/21(月) 13:13

では、再度

行番号の場合は、ダブルクリックで表示できるのですか?

(マナ) 2020/09/21(月) 13:19


はい、表示ができます
(たかさん) 2020/09/21(月) 13:23

ならば、こうするだけでは

 >wRow←修正必要?
  ↓
 Worksheets("データ").Cells(wRow, 1)

(マナ) 2020/09/21(月) 13:30


やはり表示ができません。

本当にややこしくて申し訳ないのですがこの検索フォームに行くまでには

1情報表示のフォーム(結果を反映するフォーム)

このフォーム内に(検索)ボタンをセットしており
フォーム内には


Private Sub 検索_Click()

    検索フォーム.Show vbModal     
    If rtnNo > 1 Then

        With Worksheets("データ")
            Me.コード = .Cells(rtnNo, 1)
            Me.個人名 = .Cells(rtnNo, 2)
            Me.内容A = .Cells(rtnNo, 3)
            Me.内容B = .Cells(rtnNo, 4)
            Me.内容C = .Cells(rtnNo, 5)
            Me.内容D = .Cells(rtnNo, 6)
        End With
    End If
End Sub


これが記載されております

2検索フォーム
ここには先般ご相談の


  Private Sub SetListBox() '← リストに表示する処理追加
        Dim wRow As Long
        Dim wLstRow As Long
        Me.検索候補.Clear
        wLstRow = 0
        For wRow = 2 To Worksheets("データ").Range("A1").CurrentRegion.Rows.Count
            If Me.サーチ = "" Or InStr(1, Worksheets("データ").Cells(wRow, 2), Me.サーチ, vbTextCompare) > 0 Then
                Me.検索候補.AddItem
                Me.検索候補.List(wLstRow, 0) = wRow '←修正必要?
                Me.検索候補.List(wLstRow, 1) = Worksheets("データ").Cells(wRow, 2)
                wLstRow = wLstRow + 1
            End If
        Next
    End Sub


Private Sub 検索候補_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
rtnNo = Me.検索候補.Text
Unload Me


こちらが記載されております。

元来このVBAはネット上のテンプレートを改変して作成してきました。
今もいろいろな修正などを加えながら行っていたところ情報表示のフォームにこの内容が記載されているのが問題だったりするのでしょうか

本当にたびたびご相談になり恐れ入りますが、なにとぞよろしくお願い申し上げます

(たかさん) 2020/09/21(月) 14:00


変更しても、リストボックスに、行番号が表示され
ユーザーナンバーが表示されないということですか

(マナ) 2020/09/21(月) 14:09


>上記の状態の場合、リスト内をダブルクリックすると
>別のユーザーフォームに名前以外の情報が任意のテキストボックスに表示されます
>ダブルクリックしてもフォームには情報が反映されない状態になっています。

 ダブルクリックイベントで変数rtnNoに行番号が代入され、
 変数rtnNoをもとにデータベースから取得し、別のユーザーフォームに
 表示しているからでは?
 と予想します。

(tkit) 2020/09/21(月) 14:32


編集がかぶりましたが、そのまま、

2つのユーザーフォームの構成がよくわかりません。

とりあえず、「rtnNo」とはなんですか?オブジェクトならそのタイプを、変数ならどこのモジュールで定義(宣言)しているか教えてください。

(もこな2) 2020/09/21(月) 14:35


tkitさんの、予想通りだと思います。

(マナ) 2020/09/21(月) 14:37


個々の部分に関してはテンプレートのそのままに使用をしております。
本当に知識不足で申し訳ございません

修正をしようとする場合どのような情報をお送りすればよいでしょうか。。。

(たかさん) 2020/09/21(月) 14:41


問題は2つですよね

>変更しても、リストボックスに、行番号が表示され
>ユーザーナンバーが表示されないということですか

これはどうでもよいのですか。

(マナ) 2020/09/21(月) 14:44


※自己責任でお願いします。

1番簡単な方法は、コードの変更はせず、
データベースの行番号にユーザーナンバーをコピーすれば
いけるのでは。
ただし、ユーザーナンバーに重複する番号があると
正常動作しません。

(tkit) 2020/09/21(月) 14:46


問題は2つですよね
>変更しても、リストボックスに、行番号が表示され
>ユーザーナンバーが表示されないということですか
これはどうでもよいのですか。

回答いたします
変更を行うと、リストボックスにはユーザーナンバーが表示されます
しかしダブルクリックをすると反応がありません。

また、rtnNoに関しては
標準モジュール内に
Public rtnNo As Long

の記載と
検索フォームに

Private Sub 検索フォーム_Initialize() '← フォームを表示した時の処理追加

    rtnNo = 0      '← フォーム間のデータ受け渡し用変更の初期化
    Call SetListBox      '← リストボックスに表示する処理を実行(下部に処理記述)
End Sub

の記載があります
(たかさん) 2020/09/21(月) 14:49


>変更を行うと、リストボックスにはユーザーナンバーが表示されます
>しかしダブルクリックをすると反応がありません。

では、そう説明してください。

rtnNo = 検索候補.ListIndex + 1

(マナ) 2020/09/21(月) 14:51


>rtnNo = 検索候補.ListIndex + 1

これだめでした。
リストボックスを3列にして、1列目を非表示にするのがよいです。
こういうことです

Me.検索候補.List(wLstRow, 0) = wRow
Me.検索候補.List(wLstRow, 1) = Worksheets("データ").Cells(wRow, 1)
Me.検索候補.List(wLstRow, 2) = Worksheets("データ").Cells(wRow, 2)

(マナ) 2020/09/21(月) 15:03


リストボックスのプロパティ
ColumnCountを2→3に変更し

Private Sub SetListBox() '← リストに表示する処理追加

  Dim wRow As Long
  Dim wLstRow As Long

  Me.検索候補.Clear

  wLstRow = 0

  For wRow = 2 To Worksheets("データ").Range("A1").CurrentRegion.Rows.Count
            If Me.サーチ = "" Or InStr(1, Worksheets("データ").Cells(wRow, 2), Me.サーチ, vbTextCompare) > 0 Then
               Me.検索候補.List(wLstRow, 0) = wRow
               Me.検索候補.List(wLstRow, 1) = Worksheets("データ").Cells(wRow, 2)
               Me.検索候補.List(wLstRow, 2) = Worksheets("データ").Cells(wRow, 3)
                wLstRow = wLstRow + 1
            End If
        Next
    End Sub

このように変更しましたが

実行時エラー 381
List プロパティを設定できません。
プロパティの配列のインデックスが無効です

と表示されます
(たかさん) 2020/09/21(月) 15:15


Me.検索候補.AddItem

を消してしまった?

(マナ) 2020/09/21(月) 15:23


皆様
この度はたたフォローいただきまして誠にありがとうございました。
今回の部分に関しましては無事完成いたしました。

今後とも過去ログなどで学ばせていただきます。
今後ともよろしくお願いいたします
(たかさん) 2020/09/21(月) 15:43


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.