Mid関数のエラー”プロシージャの呼び出し、または引数が不正です”

解決


リップ  2003-12-24 07:49:56  No: 81104

下記のようにMid関数を使って記述します。

dim i as integer,j as integer,varZ as variant
i=1,j=9

strData="abcdefghijklmnopqrstuvwxyz"

varZ = Mid(strData, i + 7, j - (i + 7))

これで実行すると、
「実行時エラー5
プロシージャの呼び出し、または引数が不正です」

というエラーが出てしまいます。このエラーが解決できなくて悩んでいます。Mid関数はバリアント型で値を返すということで、varZもバリアント型で
宣言しています。構文も間違ってないと思うんですけど・・・
初歩的な問題かもしれませんが教えていただけませんでしょうか?


魔界の仮面弁士  2003-12-24 08:52:50  No: 81105

折角コードを載せるなら、コピーしてそのまま試せるような、
再現性のあるコードを書いた方が、的確な回答を得やすいですよ。

# 今回のコードですと、「i=1,j=9」の行でいきなりエラーになるでしょうし。

> このエラーが解決できなくて悩んでいます
Mid関数の第2引数か第3引数に、『0以下の数』が渡されていませんか?


りっぷ  2003-12-24 22:41:59  No: 81106

Public Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData As String

Dim a As Integer, b As Integer

Winsock.GetData strData '受信データをstrdataに格納する

Dim i As Integer, j As Integer, k As Integer

i = 0
a = 0
b = 0

Do Until a = Null
   
   Do While a = 0
   i = i + 1
   a = InStr(i, strData, "H")
   Loop
   
   
   j = i + 1
   b = InStr(j, strData, "H")
   Do While b = 0
   j = j + 1
   b = InStr(j, strData, "H")
   
   If b = Null Then Exit Do
   
   
   Loop
   
   For k = 1 To 9
   

         If Mid(strData, i + 1, 2) = "0" & k Then
   
          Select Case Mid(strData, i + 3, 4)
      
           Case "kibo"
           hanbaigaisha(k).Kibo = Mid(strData, i + 7, j - (i + 7)) 'ここでエラーがでてしまいます!!

           Case "info"
           hanbaigaisha(k).Info = Mid(strData, i + 7, j - (i + 7))
           Case "keir"
           hanbaigaisha(k).Keiretsu = Mid(strData, i + 7, j - (i + 7))
           Case "dist"
           hanbaigaisha(k).Dist = Mid(strData, i + 7, j - (i + 7))
           Case "mzai"
           hanbaigaisha(k).Max_zaiko = Mid(strData, i + 7, j - (i + 7))
           Case "zcos"
           hanbaigaisha(k).Zaiko_cost = Mid(strData, i + 7, j - (i + 7))
           Case "mrie"
           hanbaigaisha(k).Min_rieki = Mid(strData, i + 7, j - (i + 7))
           Case "ijih"
           hanbaigaisha(k).Ijihi = Mid(strData, i + 7, j - (i + 7))
           
          End Select
         End If
   
     Next
     
     i = j
     a = InStr(i, strData, "H")
     
    
Loop

End Sub

Mid関数の引数にはちゃんと0以上が入っていると思います。


魔界の仮面弁士  2003-12-24 23:40:50  No: 81107

> Mid関数の引数にはちゃんと0以上が入っていると思います。

言葉尻をとらえるようで気が引けますが、『思う』だけではなく、
それぞれの変数の値を、きちんと『確認』してみてください。

まず、
   Dim ZZ As String
   ZZ = Mid("abc", 0, 1)
ですとか、あるいは、
   ZZ = Mid("abc", 2, -1)
を実行すると、今回の質問にあるエラー内容
  『プロシージャの呼び出し、または引数が不正です。』
が発生する事はわかりますよね。

ですから、まずはエラーの原因が
    「Midの第2引数に、0以下の値を渡していないか」
    「Midの第3引数に、0未満の値を渡していないか」
などといった点から確認していきましょう。

WinSockから、実際にどのようなデータが返されているのかは知りませんが、
たとえば、変数 strData の内容が "H01kiboH" という文字列だった場合、
「j - (i + 7)」が 0 未満の値になりますので、今回のエラーに遭遇する事になりますよね。
(どんな文字列が渡されてもエラーにならないよう、処理を見直してみてください)

それから…。

> Do Until a = Null
今回、a は Integer型ですから、a が Null になる事はありません。
(Integer型の変数には、Null値を格納できないのです)

a が Variant型であれば Null が返される事もありえますが、その場合でも
「a = Null」のような『Null値との比較』は、絶対に True にはなりませんので、
この処理は、いわゆる「無限ループ」の状態になってしまいますよ。

> If b = Null Then Exit Do
この行も先ほどと同様です。b が Integer である以上、Nullにはなりませんし、
「b = Null」という条件が True になる事はないため、変数 b の値が
何であったとしても、その後に続く「Exit Do」は処理されません。

# ソースを見る限り、他にも幾つか気になる点はありますが、とりあえずはここまで。


りっぷ  2003-12-25 01:45:40  No: 81108

無限ループのところは直しました。ご指摘ありがとうございます。
>たとえば、変数 strData の内容が "H01kiboH" という文字列だった場合、
「j - (i + 7)」が 0 未満の値になりますので、今回のエラーに遭遇する事になりますよね。
確認したんですけど、やっぱり0以上になると思うんですが・・・
文字列にはi+7番目にデータ(たとえば規模)の数値が入っていて、j番目は次のHが入っているのでj>i+7になると思うのですがどうでしょうか?
下に訂正したコードを書きました。

Public Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
'strDataには”H01kibo3H02kibo5H03kibo1H04kibo2H05kibo3H.....H09kibo2”が入る

Dim a As Integer, b As Integer
Dim check As String

Winsock.GetData strData '受信データをstrdataに格納する

Text1.Text = strData 'test用

Dim i As Integer, j As Integer, k As Integer

i = 0
a = 0
b = 0

Do Until check = "Fin"

   
   Do While a = 0 'Hが見つからない間
   i = i + 1 'i番目の隣にずらす
   a = InStr(i, strData, "H") 'i番目にHがあるかどうか
   Loop
   
   
   j = i + 1 'Hのある場所の隣
   
   Do While b = 0 '次のHを探す。Hが見つからない間
   
   b = InStr(j, strData, "H") 'j番目にHがあるかどうか
   j = j + 1 'j番目を隣にずらす
   
   If Mid(strData, j, 3) = "Fin" Then Exit Do 'j番目から3文字がFinならば処理を抜ける
   
   
   Loop
   
   For k = 1 To 9
   

         If Mid(strData, i + 1, 2) = "0" & k Then
   
          Select Case Mid(strData, i + 3, 4) '何のデータなのかを調べる
      
           Case "kibo"
           hanbaigaisha(k).Kibo = Mid(strData, i + 7, j - (i + 7)) 'i+7番目から次のHがあるj番目の手前までの文字列
           Case "info"
           hanbaigaisha(k).Info = Mid(strData, i + 7, j - (i + 7))
           Case "keir"
           hanbaigaisha(k).Keiretsu = Mid(strData, i + 7, j - (i + 7))
           Case "dist"
           hanbaigaisha(k).Dist = Mid(strData, i + 7, j - (i + 7))
           Case "mzai"
           hanbaigaisha(k).Max_zaiko = Mid(strData, i + 7, j - (i + 7))
           Case "zcos"
           hanbaigaisha(k).Zaiko_cost = Mid(strData, i + 7, j - (i + 7))
           Case "mrie"
           hanbaigaisha(k).Min_rieki = Mid(strData, i + 7, j - (i + 7))
           Case "ijih"
           hanbaigaisha(k).Ijihi = Mid(strData, i + 7, j - (i + 7))
           
          End Select
         End If
   
     Next
     
     
     If Mid(strData, j, 3) = "Fin" Then Exit Do 'j番目から3文字がFinならば処理を抜ける
     i = j
     check = Mid(strData, i, 3) 'i番目の隣から3文字を抜き出す。Finを見つけるため。
     
    
Loop

End Sub


ぽち  2003-12-25 02:03:53  No: 81109

> dim i as integer,j as integer,varZ as variant
> i=1,j=9
> strData="abcdefghijklmnopqrstuvwxyz"
> varZ = Mid(strData, i + 7, j - (i + 7))
> これで実行すると、
> 「実行時エラー5
> プロシージャの呼び出し、または引数が不正です」

エラーが発生した時に、処理が
varZ = Mid(strData, i + 7, j - (i + 7))
で止まった状態になると思うので、
その時の第2引数と第3引数の値を見れば良いのでは?


りっぷ  2003-12-25 02:46:01  No: 81110

値を見ることができました。
iは1、jは3になってました。。
第3引数が−5になるので当然エラーが出るわけです!

でも、なんでjが3になるのかわかりません。
「次のHを探す」ときにjの数え上げがうまくいってないのでしょうか?

もう少し考えて見ます。


長谷川  2003-12-25 02:57:48  No: 81111

Instr関数のヘルプを参照してみるといいかもしれません。


りっぷ  2003-12-25 12:44:41  No: 81112

解決しました!!InStr関数の使い方を間違えていました!
みなさんどうもです^^
以下に訂正後のソースを書きます^^

Public Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
'strDataには”H01kibo3H02kibo5H03kibo1H04kibo2H05kibo3H.....H09kibo2”が入る

Dim a As Integer, b As Integer, c As Integer, k As Integer

Dim check As String

Winsock.GetData strData '受信データをstrdataに格納する

Text1.Text = strData 'test用

a = 1
b = 0
c = 0

Do Until check = "Fin"
   
   a = InStr(a, strData, "H") 'a番目以降のどこにHがあるかをaに返す
   
   b = InStr(a + 1, strData, "H") 'Hの隣(a+1番目)以降のどこにHがあるかをbに返す
   '次のHの場所がbに入っている
   
   If b = 0 Then '次のHが見つからないとき
   b = InStr(a + 1, strData, "END") 'エンドがある場所を返す
   check = "Fin"
   End If
     
   For k = 1 To 9
   
                'a(Hが入っている場所)からb(次のHが入っている場所)までのデータ群を解析
         
         If Mid(strData, a + 1, 2) = "0" & k Then
        
   
          Select Case Mid(strData, a + 3, 4) '何のデータなのかを調べる
      
           Case "kibo"
           hanbaigaisha(k).Kibo = Mid(strData, a + 7, b - (a + 7))
           Case "info"
           hanbaigaisha(k).Info = Mid(strData, a + 7, b - (a + 7))
           Case "keir"
           hanbaigaisha(k).Keiretsu = Mid(strData, a + 7, b - (a + 7))
           Case "dist"
           hanbaigaisha(k).Dist = Mid(strData, a + 7, b - (a + 7))
           Case "mzai"
           hanbaigaisha(k).Max_zaiko = Mid(strData, a + 7, b - (a + 7))
           Case "zcos"
           hanbaigaisha(k).Zaiko_cost = Mid(strData, a + 7, b - (a + 7))
           Case "mrie"
           hanbaigaisha(k).Min_rieki = Mid(strData, a + 7, b - (a + 7))
           Case "ijih"
           hanbaigaisha(k).Ijihi = Mid(strData, a + 7, b - (a + 7))
           
          End Select
          
         End If
   
     Next
     
     a = b
    
Loop

End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加