MID関数とMID$関数の違いがわからないのですが・・・

解決


みやっち  2002-09-13 20:48:52  No: 104948

はじめまして。みやっちです。
MID関数とMID$関数の違いがわかりません。
どちらを使っても同じ処理をするような気がするんですが・・・

↓サンプルソースです。

'***************************************************************
'*  関数名:文字列置換(ReplaceStr)
'*  引  数:置換対象文字列(ByVal w_objstr As String)
'*          置換前文字列(ByVal w_findstr As String)
'*          置換後文字列(ByVal w_repstr As String)
'*  戻り値:置換後文字列(String)
'*  機  能:置換対象文字列の置換前文字列を置換後文字列に置換する
'***************************************************************
Public Function ReplaceStr(ByVal w_objstr As String, ByVal w_findstr _
As String, ByVal w_repstr As String) As String

Dim w_ins             As Long           '検索位置

' 戻り値に置換対象文字列をセットする
ReplaceStr = w_objstr
' 検索位置を初期化する
w_ins = 1
' ループを開始する
Do
   ' 置換前文字列を検索する
   w_ins = InStr(w_ins, ReplaceStr, w_findstr)
   ' 置換前文字列が見つからない場合
   If w_ins = 0 Then Exit Do
   ' 置換前文字列を置換後文字列に置換する
   ReplaceStr = Mid(ReplaceStr, 1, w_ins - 1) & w_repstr & Mid( _
       ReplaceStr, w_ins + Len(w_findstr), Len(ReplaceStr) - w_ins + _
       Len(w_findstr) - 1)
   ' 次の検索位置を設定する
   w_ins = w_ins + Len(w_repstr)
Loop

End Function

↑このソースでMID$関数を使っても同じように動きます。
違いがわかりません。
分かる方、教えて下さい。
よろしくお願いします。


oku  2002-09-13 21:22:22  No: 104949

違いは,ずばり帰ってくる形式が違うんです.
MIDではバリアントで、MID$では文字列型(String)で帰ってきます.

もちろんMID$の方がメモリを食わないんで,
でかいアプリ作成の時は,MID$を使ってます.

ヘルプにちゃんと載っていたと思います.
「関数からの文字列の取得」だったかな?


みやっち  2002-09-13 22:22:48  No: 104950

ありがとうございます。

ヘルプにはこれ↓しか書いていなかったのでよくわかりませんでした。

型宣言文字などを使って、明示的にデータ型を指定しなかったときは、
変数のデータ型は、既定のバリアント型 (Variant) になります。
ただし、Deftype ステートメントの対象となっているときはその既定のデータ型になります。

MID$を使うと文字列型(String)になるんですね。
ついでにメモリを食わないんですか勉強になりました。

ところでDeftype ステートメントの対象になっているというのは
 AS 〜
で宣言されている関数や変数という解釈でいいんでしょうか?
よろしくお願いします。


Say  2002-09-14 00:14:54  No: 104951

>ところでDeftype ステートメントの対象になっているというのは
> AS 〜
>で宣言されている関数や変数という解釈でいいんでしょうか?

自分でテストしてみてはいかがですか?

Option Explicit
DefInt A

Private Function aa1()
    
End Function

Private Function aa2#()
    
End Function

Private Function aa3() As Long
    
End Function

Private Function bb1()
    
End Function
Private Sub Command1_Click()
    Dim a1
    Dim a2#
    Dim a3 As Long
    Dim b1
    Dim strMsg As String
    
    strMsg = "a1 = " & VarType(a1) & vbCrLf
    strMsg = strMsg & "a2  = " & VarType(a2) & vbCrLf
    strMsg = strMsg & "a3  = " & VarType(a3) & vbCrLf
    strMsg = strMsg & "b1  = " & VarType(b1) & vbCrLf
    
    strMsg = strMsg & "aa1 = " & VarType(aa1) & vbCrLf
    strMsg = strMsg & "aa2 = " & VarType(aa2) & vbCrLf
    strMsg = strMsg & "aa3 = " & VarType(aa3) & vbCrLf
    strMsg = strMsg & "bb1 = " & VarType(bb1)
    
    MsgBox strMsg

End Sub


みやっち  2002-09-14 01:49:30  No: 104952

Sayさんわかりやすいソースありがとうございます。
早速テストしてみました。

>ところでDeftype ステートメントの対象になっているというのは
> AS 〜
>で宣言されている関数や変数という解釈でいいんでしょうか?

私の考え方は違っていましたね。
Def〜と言うのがいくつかあるなんて知りませんでした。
かなり勉強になりました。

でも、これを使うメリットってあるんでしょうか?
普通に関数、変数の型宣言をしておけば良いような気がするんですが?
分かる方教えて下さい。


YuO  2002-09-14 02:11:19  No: 104953

> でも、これを使うメリットってあるんでしょうか?

基本的にないでしょうね。
Integer型を多用している場合とかに,Dim foo As IntegerのAs Integerを省略できる程度で……。
基本的にはN88-Basicとか,その頃からの名残だと思います。
#DEF FNは消えたのにね。


みやっち  2002-09-14 22:19:59  No: 104954

ありがとうございます。
メリットは無いんですね。
わかりました。


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

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






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