新生活を充実させるための「こだわり」を取材!!

はじめて質問させて頂きます。
書き方など至らぬ点があるかと思いますが、どうぞ宜しくお願い致します。
エクセルVBAユーザーフォーム上でやりたいことは下記です。
1.ユーザーフォーム上に配置したテキストボックスで、ワークシートのセル(行データ)を検索します。(ワークシートには、A1(NO)B1(氏名)・・・などのデータが複数入力されています。)
2.リストボックスに検索結果(候補)が表示されます。(NOと氏名が表示されます。重複した氏名もあります。)※部分一致で検索しているため同じ氏名など、リストボックスに複数候補が表示され、クリックして選択します。
3.ユーザーフォーム上に配置したラベルやテキストボックスにクリックした検索結果が表示されます。
ここまではできたのですが、この後、テキストボックスに表示された値を変更して、ワークシート上のセルに反映(上書き)させたいのですが、うまくいきません。
もう1点、ワークシート上の行データには空白セルがあります。(後で入力したいため)
この空白セルに、テキストボックスで氏名を検索後、リストボックスから取得した値と同じ行のセルに「チェックボックス」を使用して、「①や②」といった文字を入力させたいです。
ユーザーフォーム上の作業の流れをまとめると、テキストボックスで検索→リストボックスに候補表示→クリック→ラベルやテキストボックスに表示→検索結果が表示されたテキストボックスで編集→セルに反映させたい です。
ご教示どうか宜しくお願い致します。

質問者からの補足コメント

  • ご連絡ありがとうございます。申し訳ありません。押さえられておりません。
    フォーム上から、ワークシート上の列を検索し、該当する行のNOと氏名をリストボックスに表示、検索結果候補をクリック後、テキストボックスに表示しているだけです。このテキストボックスに表示された値が、ワークシート上のどのセルかはわかるのですが、表示されたテキストボックスの値とワークシート上セルを連動させることができません。
    ワークシート上のすべての行データをリストボックスに表示させて、クリックした行データからワークシート上のセルに反映(連動)させることはできたのですが、今回の内容ではリストボックスの検索結果(候補)をクリックするたびに、テキストボックスの値表示も変更されます。これと連動してワークシート上のセルがアクティブになればと考えているのですが、これがどうしてもできません。お力添え頂きたく宜しくお願い致します。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/07/20 00:39
教えて!goo グレード

A 回答 (3件)

No.1です。

補足コメント読みました。
「押さえられておりません」とのことですが、リストボックスに行Noと氏名が表示されていると云うことは、セルの位置を押さえていることになりませんか?

行が特定できるのであれば、次のようなコードで、セルとテキストボックスを関連付けすることができると思いますよ。

TextBox1.ControlSource = "Sheet2!B" & 行目

上記のコードは、Sheet2のB列の行目(例えば3行目の場合は、B3セル)をTextBox1と関連付けます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
リストボックスに表示された検索結果からのセル連動はできなかったのですが、
ワークシート上のすべての行データをリストボックスに表示させて、
試してみたところ教えて頂いたコードでセルと連動させることができました。
ありがとうございました。

お礼日時:2017/07/22 21:17

こんにちは。



読んでいて疑問に感じるのは、
1~3まで「ここまで出来た」という人が、リストボックスにした時点で、データを1次元にしたのですから、もうワークシートのデータの情報はValueしか残っていないのですから、そのままでは、もうワークシートのデータとして戻しようがありません。

別に、1~3の内容を否定するつもりはありませんが、そのプロセスのコードを見せていただけていないとすると、結局、こちらとしては、白紙に戻さざるを得ないのですし、製作依頼と何ら代わりなくなってしまいます。

印象としては、エクセルの VBAマクロとして全体的に凝りすぎているような気がします。

今回は、失礼に聞こえるかもしれませんが、ご質問者さんの「アイデア倒れ」だと思います。私自身、何度も経験していることですが。自分のテクニックが足らないままに、自分のイメージを具体化しようとすると、うまくいきません。本来は、その時点で、新しくやり直したほうがよいものができあがります。もちろん、越えられるべきものだという覚悟があるのでしたら、コードを見せるべきだと思います。

ただ、私は私自身で、最初から、トライしてみました。

'//Userform モジュール
Dim FndData() As Variant
Dim List_Indx As Long


Private Sub CommandButton1_Click()
Dim adr As String

 If TextBox2.Value <> FndData(0, List_Indx) Then
  adr = FndData(1, List_Indx)
  Range(adr).Value = TextBox2.Text
  TextBox2.Value = ""
  List_Indx = -1
 End If
 
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim i As Long
Dim adr As String
For i = 0 To ListBox1.ListCount
 If ListBox1.Selected(i) Then
  TextBox2.Text = ListBox1.List(i)
  List_Indx = i
  Exit For
 End If
Next
adr = FndData(1, i)
Range(adr).Select
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
 Dim FirstAddress As String
 Dim i As Long
 Dim c As Range
 If KeyCode <> 13 Then Exit Sub
 i = -1
 Erase FndData
 With Columns(2)
  If TextBox1.Text = "" Then Exit Sub
  Set c = .Find("*" & TextBox1.Text & "*", , xlValues, xlWhole, xlByColumns)
  If Not c Is Nothing Then
   FirstAddress = c.Address
   Do
    i = i + 1
    ReDim Preserve FndData(1, i)
    FndData(0, i) = c.Value
    FndData(1, i) = c.Address(0, 0)
    Set c = .FindNext(c)
   Loop While Not c Is Nothing And c.Address <> FirstAddress
  End If
 End With
 If i > 0 Then
  ListBox1.List = Application.Index(FndData, 1, 0)
 End If
End Sub


>リストボックスから取得した値と同じ行のセルに「チェックボックス」を使用して、「①や②」といった文字を入力させたいです。

ここまでできれば、後は、できるはずだと思います。
「エクセルVBA「リストボックスで選択した」の回答画像2
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
おっしゃる通り自分の勉強不足で「アイデア倒れ」を痛感しました。
ご回答を参考に、1から作り直したいと思います。
ありがとうございまいた。

お礼日時:2017/07/21 09:57

「ここまではできた」とのことですが、この時点で重要なのは、テキストボックスに表示されている値が、どのセルのものなのか押さえているか否かです。

それが押さえられていないのであれば、できたうちには入りません。その辺、どんな状況でしょうか?
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング