こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Mid関数(2)

VB6.0でタイピングソフトを作成しています。KeyPressの入力判定で、入力された文字とLabel1に表示されている文字が一緒なら、その文字を消すという処理なんですが、

Private Sub Form_KeyPress(KeyAscii As Integer)
Label1.Caption = "taipingu"

If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
Dim ss As String
ss = Label1.Caption
Mid(ss, z, 1) = " "
Label1.Caption = ss
z = z + 1
End if

というやり方を教えていただいてやってみたのですが、
「If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then」の部分で
「プロシージャの呼び出し、または引数が不正です」
というエラーが出てしまいます。しかも、このエラーが出ずに実行がうまくいくときもあります。
何故このエラーが出るのか、分かる方お願いします。

投稿日時 - 2007-05-16 11:46:56

QNo.3004344

すぐに回答ほしいです

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

プロジェクトの参照で、「参照不可」のものがあると
Mid関数やFormat関数等がエラーになる場合があります。
この場合、「参照不可」の項目を参照しなおすと直ります。

投稿日時 - 2007-05-16 20:44:33

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

z 以外に容疑者はいないと思いますが‥
if 文の前に、例えば z=z のような式を置き、if 文でブレーク(一時停止)させて、そのつど z や keyascii をチェックしてみては?

また、余計なおせっかいですが、なぜ typing でなく taipingu なのでしょう?

投稿日時 - 2007-05-17 13:17:58

ANo.5

こんばんは
No.2です。
最終文字(8文字目)を処理した後に加算しているので、Z = 9 になると思います。ですが
If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
では 9文字目 の検査をしてもエラーは発生しませんでした。
何故エラーになるのか私にもわからなくなりました。お役に立てず申し訳ないです。

投稿日時 - 2007-05-16 23:19:58

ANo.3

こんにちは
z = z + 1
で z の値が Label1.Caption = "taipingu" の長さを超えてしまったのではありませんか?

投稿日時 - 2007-05-16 14:23:12

補足

zの値を適当に貼り付けたラベルの表示させてみたら、
(今の場合"taipingu")

z = 8でした。
いろいろ変えて試したところ、zがLabel1.Captionに書かれている文字列を超えることはありませんでした。

投稿日時 - 2007-05-16 17:27:30

Private Sub Form_Load()
  Me.Label1.Caption = "typing"
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
  Me.Label1.Caption = Replace(Me.Label1.Caption, Chr(KeyAscii), "_")
End Sub

と、1行で事足りるかと思いますが・・・。

Private Sub Form_KeyPress(KeyAscii As Integer)
    Dim I As Integer
    Dim L As Integer
    Dim C As String
    Dim S As String

    S = Label1.Caption
    C = Chr(KeyAscii)
    L = Len(S)
    For I = 1 To L
        If Mid(S, I, 1) = C Then
            Mid(S, I, 1) = " "
        End If
    Next I
    Label1.Caption = S
End Sub

多分、このような回答だったんではないでしょうか?

投稿日時 - 2007-05-16 12:56:19

補足

すいません・・・。少し書き足りないコードがありました。
Private Sub Form_KeyPress(KeyAscii As Integer)
Label1.Caption = "taipingu"

If Mid(Label1.Caption, z, 1) = Chr(KeyAscii) Then
Dim ss As String
ss = Label1.Caption
Mid(ss, z, 1) = " "
Label1.Caption = ss
z = z + 1

Else
Label2.Caption = "違う文字です"
End if
でした。

書いていただいたコードの2つ目のような処理をまさにやりたいのです。
ただ、「Me.Label1.Caption = Replace(Me.Label1.Caption, Chr(KeyAscii), "_")」
の処理をif文を使って私の書いたコードに組み込むにはどうやったらいいのでしょう・・・?

投稿日時 - 2007-05-16 13:14:22

ANo.1

zの初期化は行ってますか?
zは0からではなく1から開始させる必要があるのはわかりますよね?
タイピングを始める前のタイミングのイベントで初期化を行っていないように思えます。載せてあるソース以外の部分の設計ミスでは?

投稿日時 - 2007-05-16 12:19:23

補足

zはform_Load時に1に初期化しています。
このエラーが出るまでの処理には間違いはない様に思います。

投稿日時 - 2007-05-16 13:07:39

あなたにオススメの質問