dポイントプレゼントキャンペーン実施中!

初心者です。
フォームを作成し、シートにデータ入力したり、シートを検索して該当するレコードをフォームに取得する、というマクロを作成しております。

シートのデータをフォーム上のコントロールに取得する際、Listboxに取得したいセルの値が空欄だと、「実行時エラー380 Text(Value)プロパティを設定できません。プロパティの値が無効です。」となり、止まってしまいます。

これを回避する方法を教えて頂けませんでしょうか。
セルのデータは文字列です。

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

  • Qchan1962様 ご回答有難うございます。

    Dim y As Range
    Dim r As Long
    Range("C1")= UserForm1.TextBoxID.Text
    Set y =WorkSheets("test").Columns(1).Find(what:=Range("C1").Value, lookat:=xlWhole)
    r =y.Row
    If Not y Is Nothing Then
    TextBoxW.Value = WorkSheets("an").Cells(r,"A")
    ListBoxQ.Value = WorkSheets("an").Cells(r,"B")

    リストボックスにはフォーム起動時に.AddItem""でリストを読み込む。
    デバックの箇所にマウスを合わせると、ListBoxQ.Value = "" と出てきます。
    宜しくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2020/04/15 07:02
  • Qchan1962様、 めぐみん_様
    ご回答をありがとうございました。

    Qchan1962様から頂いた、NO.7の回答の通り、
    On Error…のコードで今回は解決いたしました。
    ありがとうございました。

      補足日時:2020/04/17 19:21

A 回答 (7件)

読解力が無く申し訳ないです。



エラー処理と言う事ですか。
ListBoxQはその時、空白にしたいのでしょうか?

取敢えず、エラーの対応は、
On Error Resume Next  ’エラーを無視して次の行へ
On Error GoTo ラベル  ’エラー発生時ラベル迄スキップする

ラベル:
Err.Clear  ’エラー情報をクリアー
などですかね。

>リストボックスにはフォーム起動時に.AddItem""でリストを読み込む。(ListIndex = 0なら)
ListBoxQはエラー時、空白にしたい。
On Error Resume Next
ListBoxQ.Text = WorkSheets("an").Cells(r,"B")
 If Err.Number = 380 Then
  ListBoxQ.ListIndex = 0
 End If
Err.Clear

他には、
ListBoxQ.Text(Value) =  をあきらめ

  For i = 0 To ListBoxQ.ListCount - 1
   If ListBoxQ.List(i) = WorkSheets("an").Cells(r,"B") Then
    ListBoxQ.ListIndex = i
   End If
  Next i

>コントロール全部をIf文に組み込まないとダメなんでしょうか100超えるのですが…。
一機ではないでしょうから、処理時間は不問かな??

オブジェクト名を引数にしてファンクションなどで組むのはどうでしょう。。
    • good
    • 0
この回答へのお礼

Qchan1962様

何度も本当にありがとうございます。
文字列であれば読み込めるのに、なぜ””はダメなのか、ということに
引っかかってしまって、エラー処理をすればよいということに思い至りませんでした。
If Err.Number = 380 Then
  ListBoxQ.ListIndex = 0  …こういうこともできるのかと。
たいへん勉強になりました。 作業している場所が別なので、今すぐに確認ができないのですが
ご教示いただいた内容でやってみます。

お礼日時:2020/04/16 19:28

>リストボックスに表示したいと思っています。


選択すると言う意味ですか?

? リストボックスのItemには、すでにWorkSheets("an").Cells(r,"B")の値は登録されているのでしょうか?
登録されていないなら、実行時エラー380 (ListBoxQ.Text=)

登録されていれば、選択されます。

表示が選択の意味でないのなら、.Value=で設定は出来ないと思いますが、定かではありません。
    • good
    • 0
この回答へのお礼

Qchan1962様 何度もありがとうございます。

質問の内容がわかりづらく、ご迷惑をおかけしております。
リストボックスのItemには、フォーム起動時に””のほか、いくつかの文字列が登録されています。
質問にも書いた通り、該当のセルが空欄だとエラーになりなりますが、
登録されている文字列が入っていれば、その文字列が表示されます。
空欄だとエラーになるのを回避したいと思っています。

お礼日時:2020/04/16 16:04

実行時エラー380に対しての回答ではありませんが、



>Listboxに取得したいセルの値

ListBoxQ.Value ? これってListBoxQの選択された値を取得したい時のプロパティでは?
TextBoxW.Value=のようには出来ないのではと?

ListBoxQ.AddItem WorkSheets("an").Cells(r,"B")

頓珍漢な回答ならごめんなさい。


siroppo様 スレッドお借りして申し訳ありません。
めぐみん_さんありがとうございます。
    • good
    • 0
この回答へのお礼

Qchan1962様 ありがとうございます。
せっかくご回答いただきましたが、
今回私が行いたかった事とは少し違うようです。
リストに追加したいのではなく、
リストボックスに表示したいと思っています。

お礼日時:2020/04/16 09:12

No.3です。



>Set y =WorkSheets("test").Columns(1).Find(what:=Range("C1").Value, lookat:=xlWhole)

Findメソッドのシートと

>r =y.Row
>If Not y Is Nothing Then
>TextBoxW.Value = WorkSheets("an").Cells(r,"A")

代入元のシートが違うのに行番号は同じで間違いはないのでしょうか?
あと検索値の

>Range("C1").Value

はアクティブシートになりますが、現在WorkSheets("test")がアクティブなのですか?
    • good
    • 0
この回答へのお礼

めぐみん様 ありがとうございます。
はい、検索をかけるtestシートと、anシート:アクティブシートは別です。
検索をかけるシートから番地(?)を採り、アクティブシートの同一番地のレコードを取得します。

お礼日時:2020/04/15 19:59

No.2です。



あ、コピペした訳じゃないんだね。

TextBoxW.Value = WorkSheets("an").Cells(r,"A")
ListBoxQ.Value = WorkSheets("an").Cells(r,"B")



With WorkSheets("an")
If .Cells(r,"A").Value <> "" And .Cells(r,"B").Value <> "" Then
TextBoxW.Value = .Cells(r,"A").Value
ListBoxQ.Value = .Cells(r,"B").Value
End If
End With

ではダメですかね?
    • good
    • 0
この回答へのお礼

めぐみん様 いつもありがとうございます。
ご教示のコード、ちょっと変形して
If .WorkSheets("an").Cells(r,"B").Value <> "" Then
ListBoxQ.Value = WorkSheets("an").Cells(r,"B").Value
End If
としてリストボックスの1つで試してみましたが、同じエラーが出ました。
コントロール全部をIf文に組み込まないとダメなんでしょうか100超えるのですが…。

お礼日時:2020/04/15 17:43

なんで Range("C1") の C だけ全角文字???

    • good
    • 0
この回答へのお礼

めぐみん様 こんにちは。こちらに打ち込む際に、全角で入力してしまったようです。すみません。

お礼日時:2020/04/15 11:55

ご質問の内容だけでは、実行時エラー380は、特定の難しいエラーかも知れません。



デバッグでエラーコード(関連項目を含む)を示された方が良いと思います。 
関連項目を含む:変数を使っていれば変数型など、セル値であれば文字数など
>セルの値が空欄だと
デバッグコード上での値?
エラーコードの右辺の値は""になっていますか?確認してみてはいかがでしょう。

Listboxに取得(登録)についても方法が分かりますので
ListBox1.AddItem Cells(i, 1) 
ListBox1.RowSource = "Sheet1!A2:A4"
ListBox1.List = Range("A2:A4").Value
ListBox1.List = Array
ListBox1.List(.ListCount - 1, 1) = ~.Text
など、、どの方法?


取り敢えず
この回答への補足あり
    • good
    • 0

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

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


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