下記のように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もバリアント型で
宣言しています。構文も間違ってないと思うんですけど・・・
初歩的な問題かもしれませんが教えていただけませんでしょうか?
折角コードを載せるなら、コピーしてそのまま試せるような、
再現性のあるコードを書いた方が、的確な回答を得やすいですよ。
# 今回のコードですと、「i=1,j=9」の行でいきなりエラーになるでしょうし。
> このエラーが解決できなくて悩んでいます
Mid関数の第2引数か第3引数に、『0以下の数』が渡されていませんか?
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以上が入っていると思います。
> 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」は処理されません。
# ソースを見る限り、他にも幾つか気になる点はありますが、とりあえずはここまで。
無限ループのところは直しました。ご指摘ありがとうございます。
>たとえば、変数 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
> 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引数の値を見れば良いのでは?
値を見ることができました。
iは1、jは3になってました。。
第3引数が−5になるので当然エラーが出るわけです!
でも、なんでjが3になるのかわかりません。
「次のHを探す」ときにjの数え上げがうまくいってないのでしょうか?
もう少し考えて見ます。
Instr関数のヘルプを参照してみるといいかもしれません。
解決しました!!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
ツイート | ![]() |