• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA ListBoxの行数取得の件)

Excel VBA ListBoxの行数取得の件

このQ&Aのポイント
  • Excel VBAを使用してListBoxの行数を取得する方法について困っています。
  • 具体的には、ユーザーフォームでListBoxの行数取得が上手く行かずにエラーが発生しています。
  • エラーの内容は、「実行エラー13 型が一致しません」と表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

#1です。失礼、間違えました。訂正をお願いします。 簡単な対処法として For i = 0 To c - 1   If IsNumeric(lstInfoMeisai.List(i, 0)) Then     r = lstInfoMeisai.List(i, 0)     Worksheets("売上明細").Cells(r + 1, 15).Value = 1   Else     MsgBox "要確認 " & lstMeisai.List(i, 0)     ' その他に必要な処理があれば、、、   End If Next

6338-tm
質問者

お礼

ANo1へのお礼の文で間違いがありました。 教えて下さったステートメントにすると、 私がしたかったこと=該当のデータの指定のセルに"1"を入れる が、ちゃんと処理されていました。 >lstInfoMeisaiの方にデータが乗って来ない様になり ではなく、 'lstinfoから、行を削除 lstInfo.RemoveItem lstInfo.ListIndex 'lstinfomeisaiのリストをクリア lstInfoMeisai.Clear が実行されて、ListBoxのデータがクリアされた、という事でした。 と、言うことは  実行エラーも出ていないですし、 MsgBox "要確認 " を表示しない様にすれば、 私のしかった事が完了すると言うことですね。 色々とややこしい書き方になってしまいましたが、 教えて下さってありがとうございました。

その他の回答 (2)

回答No.3

2つのListBox に何が出ているのか、かなり不安な部分があります。片方のlstInfoには、行数が出るのでしょうか?lstInfoMeisaiの役割が見えていないから、今のところ分かる範囲での処理です。Imageがあると分かりやすかったです。 手っ取り早く直すなら、 ×Dim r As Integer → Dim r As Variant  For i = 0 To c - 1     r = lstInfoMeisai.List(i, 0)     r = Val(r) '←     If r > 0 Then     Worksheets("売上明細").Cells(r + 1, 15).Value = 1     End If  Next 古い人ですと、Val では邪道だと思う人がいるかと思いますが、当面の処置です。しかし、cLngではできません。

6338-tm
質問者

お礼

WindFaller様 ご回答頂きましてありがとうございます。 元データの方が虚実入り交じってまして、 表に出しても問題ないデータにしなければならず、 イメージを載せられなくて申し訳ありません。 書いて下さったステートメントを実行してみたのですが、 >'シート「売上基本情報」の該当行の「削除」列に1を代入 は出来ていますが、 >'シート「売上明細」の該当行の「削除」列に1を代入 が出来ていない結果になってしまいました。 Valは文字列の数字を、数字の数字として見なすものですよね? (ちょっと説明が下手すぎてすみません。) やはり元のデータをしっかり整備する事が大事かなと感じてます。 合間に作業しているのでなかなかすぐには出来ないのですが、 もう少し元データの整理も考えます。 ご回答頂いた事、感謝致します。 ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは > 実行エラー13 型が一致しません ということだと、エラーの意味としては  Dim r As Integer  r = "OO1" ' オーオーイチ  r = "ll2" ' エルエルニ  r = " " ' 空白に見えるけど実はスペースが!  r = "" ' 空白に見えるけど実は長さ0の文字列(空文字)が! などのように Integer型の変数に、文字列を代入しようとすれば普通にエラーになる ってことだと思います。 簡単な対処法として   If IsNumeric(lstMeisai.List(i, 0)) Then     r = lstMeisai.List(i, 0)     ' For...従来の処理   Else     MsgBox "要確認 " & lstMeisai.List(i, 0)     ' その他に必要な処理があれば、、、   End If のように分岐するなどの方法があります。 #これ↑で十分かどうか、の判断は必要な情報を唯一知る質問者さんにしかできませんけれども。 他に検討したほうがよいこととして ・元データの不正を直す。   数値であるべき列に文字列がないかジャンプ機能で確かめて、、、とか ・不正なデータ入力を防ぐ対策を施す。   入力規則を活用するとか ・コードの中でデータの不正をきちんとチェックする。   一旦Variant型で受けて、   数値であるかどうか、または、データ型が何であるか、規定外の数値でないか、   チェックした上で条件分岐して、Long型に変換するとか。  本来はListBoxのListを設定する段階でチェックする方がベターです。 /// とりあえずの所見としては、行数取得の際のトラブルである可能性は低く、 単に元になるデータの不正が原因である可能性が高いようです。 確かめてみてください。

6338-tm
質問者

お礼

cj_mover様 ご回答頂き、ありがとうございます。 早速 ANo2に書いて頂いたステートメントに変えて実行してみたところ、 要確認 のメッセージボックスが表示され、 lstInfoMeisaiの方にデータが乗って来ない様になり、 実行エラーも出ませんでした。 ご指摘の通り、数字に見えて数字ではないことが原因ですね。 何日も考えて分からなかったので、原因が判明してすごく嬉しいです。 本当にありがとうございました。 元のデータの方をきちんと数字になるように修正します。

関連するQ&A