【初月無料キャンペーン中】gooドクター

OSは、XP
Excelは、2003 を使用しています。
ユーザーフォームで、ListBoxの行数取得のところが上手く行かずに困っています。
**************
Private Sub btnSalesDelete_Click()
'lstinfoにおいて、どの行も選択されていなければ、終了
If lstInfo.ListIndex = -1 Then Exit Sub

Dim res As Integer
Dim Msg As String, Title As String
Msg = "伝票番号:" & lstInfo.Value & " を削除します。よろしいですか?"
Title = "確認"
res = MsgBox(Msg, vbYesNo + vbExclamation + vbDefaultButton2, Title)
If res = vbNo Then Exit Sub

'シート「売上基本情報」の該当行の「削除」列に1を代入
Dim TargetRow As Integer
TargetRow = lstInfo.Value + 1
Worksheets("売上基本情報").Cells(TargetRow, 5).Value = 1

'シート「売上明細」の該当行の「削除」列に1を代入
Dim c As Integer
c = lstInfoMeisai.ListCount '明細行の行数をcに代入
Dim i As Integer
Dim r As Integer
For i = 0 To c - 1
r = lstInfoMeisai.List(i, 0) '←←←ここで実行エラー13 型が一致しません になります。
Worksheets("売上明細").Cells(r + 1, 15).Value = 1
Next
'lstinfoから、行を削除
lstInfo.RemoveItem lstInfo.ListIndex
'lstinfomeisaiのリストをクリア
lstInfoMeisai.Clear
End Sub
*****************
上記で実行すると、lstInfoのListCountと同じ数字を、lstInfoMeisaiの方にも代入されます。

実際、lstInfoMeisaiのListCountが 12、lstInfoのListCountが 3 の場合、
rが4になった時、実際にはそのListCountにがデータがないので、””を返してしまい、
実行エラー13 型が一致しません とデバックになってしまいます。

説明が上手くなくて申し訳ありませんが、どなたか修正の仕方を教えていただけないでしょうか?
よろしくお願い致します。

gooドクター

A 回答 (3件)

#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
    • good
    • 0
この回答へのお礼

ANo1へのお礼の文で間違いがありました。

教えて下さったステートメントにすると、
私がしたかったこと=該当のデータの指定のセルに"1"を入れる
が、ちゃんと処理されていました。

>lstInfoMeisaiの方にデータが乗って来ない様になり
ではなく、

'lstinfoから、行を削除
lstInfo.RemoveItem lstInfo.ListIndex
'lstinfomeisaiのリストをクリア
lstInfoMeisai.Clear

が実行されて、ListBoxのデータがクリアされた、という事でした。

と、言うことは 
実行エラーも出ていないですし、
MsgBox "要確認 " を表示しない様にすれば、
私のしかった事が完了すると言うことですね。

色々とややこしい書き方になってしまいましたが、
教えて下さってありがとうございました。

お礼日時:2012/10/10 16:33

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ではできません。
    • good
    • 0
この回答へのお礼

WindFaller様

ご回答頂きましてありがとうございます。
元データの方が虚実入り交じってまして、
表に出しても問題ないデータにしなければならず、
イメージを載せられなくて申し訳ありません。

書いて下さったステートメントを実行してみたのですが、
>'シート「売上基本情報」の該当行の「削除」列に1を代入
は出来ていますが、
>'シート「売上明細」の該当行の「削除」列に1を代入
が出来ていない結果になってしまいました。

Valは文字列の数字を、数字の数字として見なすものですよね?
(ちょっと説明が下手すぎてすみません。)

やはり元のデータをしっかり整備する事が大事かなと感じてます。
合間に作業しているのでなかなかすぐには出来ないのですが、
もう少し元データの整理も考えます。

ご回答頂いた事、感謝致します。
ありがとうございました。

お礼日時:2012/10/11 10:57

こんにちは


> 実行エラー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を設定する段階でチェックする方がベターです。


///
とりあえずの所見としては、行数取得の際のトラブルである可能性は低く、
単に元になるデータの不正が原因である可能性が高いようです。
確かめてみてください。
    • good
    • 0
この回答へのお礼

cj_mover様

ご回答頂き、ありがとうございます。
早速 ANo2に書いて頂いたステートメントに変えて実行してみたところ、
要確認 のメッセージボックスが表示され、
lstInfoMeisaiの方にデータが乗って来ない様になり、
実行エラーも出ませんでした。

ご指摘の通り、数字に見えて数字ではないことが原因ですね。

何日も考えて分からなかったので、原因が判明してすごく嬉しいです。
本当にありがとうございました。

元のデータの方をきちんと数字になるように修正します。

お礼日時:2012/10/10 15:54

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

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

gooドクター

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

人気Q&Aランキング