- ベストアンサー
リストボックスから値取得時のエラー
- リストボックスから値を取得する際にエラーが発生しています。型が一致しないため、修正方法を教えていただきたいです。
- ユーザーフォームでリストボックスから値を取得する際にエラーが発生しています。具体的な修正方法を教えていただけますか?
- リストボックスから値を取得するときに型が一致しないエラーが出てしまいます。どのように修正すればよいでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1の蛇足的追加です。 あと、気になる感じがしたので 直接リストボックスから代入すればなくなる部分だと思いますが Dim lastrow As Long ですので Dim 行番号 As Integer これもLongにしておかないとlastrowの値がIntegerを超えていて選択したものの位置がIntegerを超えた場合、オーバーフローになると思います。 また 行番号 = ActiveCell.Row ですが、Active〇〇としているために動作がおかしくなっているパターンをたまに見かけますので、Active〇〇(ActiveSheetなど)はできるだけ避けた方がいいと思われます。 コードを簡単にすると .Range(略).Select 行番号 = ActiveCell.Row というパターンだと思いますが 直接 行番号 = .Range(略).Row としていたほうがコードの改編などでSelectと行番号代入の間にActiveCellが他に移るようなことになったとしても行番号は意図した値を保てます。
その他の回答 (2)
- kon555
- ベストアンサー率51% (1848/3569)
コード面の回答は既についているので、ちょっと違う角度からのアドバイスです。 質問文の内容からすると自分ないし自部署程度で使う業務ツールのように思えますが、特に強い理由がないなら、入力画面としてユーザーフォームを作るより、入力用のシートを作り、その内容を転記する形の方が簡単ですよ。 正直なところ、Excel業務の自動化や簡略化というツールを作る上でユーザーフォームには見栄え以上のメリットはなく、後々のメンテナンスや改造などを考えるとシートを活用した方が便利です。 課題として取り組むならいいのですが、実務としてならば、ユーザーフォームにしろその他の動作にしろ『本当にこれは必要か?』『多少妥協したら簡単に実装できないか?』という部分は考えておいた方がいいですよ。
お礼
返信遅くなりすみません。 いろいろとアドバイスありがとうございます。 何気にユーザーフォームにこだわっていましたが、よく考えるとシートでも十分ですよね。 今後、作成する際は考えて作成したいと思います。 ありがとうございました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
> .Range(.Cells(検索表示リストボックス.List(検索表示リストボックス.ListIndex, 0) + 1, 1), .Cells(検索表示リストボックス.List(検索表示リストボックス.ListIndex, 0) + 1, 4)).Select 検索表示リストボックス.List(検索表示リストボックス.ListIndex, 0) は選択された値を返します。 A山さんを選択したら返るのは「A山」ですので .Range(.Cells("A山" + 1, 1), .Cells("A山" + 1, 4)).Select としたことになりますから、「型が一致しません」となります。 エラーが出た場合、変数や返値のあるプロパティなどの値を MsgBox や Debug.Print で確認してみてもいいかもしれません。 検索表示リストボックス.ListIndex とすれば位置が数値で返りますが、リストでの位置ですのでセル位置にはあいません。 シートからとらなくても、直接 氏名.Text = 検索表示リストボックス.List(検索表示リストボックス.ListIndex, 0) 会社名.Text = 検索表示リストボックス.List(検索表示リストボックス.ListIndex, 1) でいいのではないでしょうか。 また、最初の方にある myData = .Range(.Cells(1, 4), .Cells(Rows.Count, 1).End(xlUp)).Value lastrow = .Cells(Rows.Count, 1).End(xlUp).Row ですが、myDataはデータのある最終行までのデータを格納しておけばいいと思いますので lastrow = .Cells(Rows.Count, 1).End(xlUp).Row myData = .Range(.Cells(1, 4), .Cells(lastrow, 1)).Value でいいような気もします。
お礼
返信遅くなりすみません。 回答ありがとうございます。 リストボックスから直接とればよかったんですよね 以前、教えてもらったコードを再利用して作成していたので、リストボックスから直接ということを頭から抜けていました・・・ そのほかいろいろとアドバイスいただきありがとうございます。もっともっと勉強が頑張りたいと思います。