■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#16505-0変数の文字列に、他の変数を使うには?たらこ2000-11-24(金) 10:25
     #16506-0RE#16505:変数の文字列に、他の変数を使うには?匿名165062000-11-24(金) 10:34
     #16507-0RE#16505:変数の文字列に、他の変数を使うには?魔界の仮面弁士2000-11-24(金) 10:53
     #16514-0RE#16507:変数の文字列に、他の変数を使うには?たらこ2000-11-24(金) 12:47
     #16516-0RE#16514:変数の文字列に、他の変数を使うには?LESIA2000-11-24(金) 13:07
     #16517-0RE#16514:変数の文字列に、他の変数を使うには?魔界の仮面弁士2000-11-24(金) 13:09
     #16518-0RE#16517:変数の文字列に、他の変数を使うには?たらこ2000-11-24(金) 13:16
     #16519-0RE#16514:変数の文字列に、他の変数を使うには?匿名165192000-11-24(金) 13:18
     #16522-0RE#16519:変数の文字列に、他の変数を使うには?たらこ2000-11-24(金) 13:35
     #16524-0RE#16522:変数の文字列に、他の変数を使うには?魔界の仮面弁士2000-11-24(金) 14:08
#16505-0
変数の文字列に、他の変数を使うには?
質問させていただきます。

Dim Str1 As String 
Dim Str2 As String  
Dim Str3 As String  
Dim Str4 As String 

と4つの変数が有ってこれをループで廻したい、という場合,Str の次の 1, 2, 3, 4 の部分に
カウンタ変数を使うことはできないでしょうか? 配列にすればできるのですが、配列は使えない
状況なのです。

変な質問ですが、お願いします。
#16506-0
RE#16505:変数の文字列に、他の変数を使うには?
> Dim Str1 As String 
> Dim Str2 As String  
> Dim Str3 As String  
> Dim Str4 As String 
> 
> と4つの変数が有ってこれをループで廻したい、という場合,Str の次の 1, 2, 3, 4 の部分に
> カウンタ変数を使うことはできないでしょうか? 配列にすればできるのですが、配列は使えない
> 状況なのです。

こんなのはだめ?

Dim Str1 As String
Dim Str2 As String
Dim Str3 As String
Dim Str4 As String
Dim i As Integer

For i = 1 To 4
    Select Case i
    Case 1
        Str1 = ""
    Case 2
        Str2 = ""
    Case 3
        Str3 = ""
    Case 4
        Str4 = ""
    End Select
Next i
#16507-0
RE#16505:変数の文字列に、他の変数を使うには?
> 配列にすればできるのですが、配列は使えない状況なのです。

どういう状況でしょう? (^^;
とりあえず、配列が駄目なら、CollectionやDictionaryを使うという手もありますが。


> と4つの変数が有ってこれをループで廻したい、という場合,
> Str の次の 1, 2, 3, 4 の部分にカウンタ変数を使うことはできないでしょうか?

CallByName関数を使うとか。
'-------------
Option Explicit

Public Str1 As String
Public Str2 As String
Public Str3 As String
Public Str4 As String

Private Sub Command1_Click()
    On Local Error Resume Next
    MsgBox CallByName(Me, "Str" & Text1.Text, VbGet)
    If Err.Number <> 0 Then
        MsgBox "1〜4の数値を指定してください。"
    End If
End Sub

Private Sub Command2_Click()
    On Local Error Resume Next
    CallByName Me, "Str" & Text1.Text, VbLet, Text2.Text
    If Err.Number = 0 Then
        MsgBox "Str" & Text1.Text & "に、以下の値を設定しました。" & vbCrLf & _
               "[" & Text2.Text & "]"
        Text2.Text = ""
    Else
        MsgBox "1〜4の数値を指定してください。"
    End If
End Sub

Private Sub Form_Load()
    Text1.Text = "2"
    Text2.Text = ""
    Str1 = "ABC"
    Str2 = "DEF"
    Str3 = "GHI"
    Str4 = "JKL"
    Command1.Caption = "値取得"
    Command2.Caption = "値設定"
End Sub
#16514-0
RE#16507:変数の文字列に、他の変数を使うには?
> > 配列にすればできるのですが、配列は使えない状況なのです。
> 
> どういう状況でしょう? (^^;

そう言われると、困るんですが・・。要するに、ひとに頼まれたんですが、そのひとが、
「配列はなぁ、使いたないねん」と、ゆうてますんで。そういう状況です。(^^;

> CallByName関数を使うとか。

これです! これで行きたいのですが、

> Public Str1 As String

をプライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
ところで落ちますよね。

>     MsgBox CallByName(Me, "Str" & Text1.Text, VbGet)

どんなオブジェクトを指定すればいいのでしょうか?

重ね重ねすいませんが。
#16516-0
RE#16514:変数の文字列に、他の変数を使うには?
> > Public Str1 As String
> 
> をプライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
> ところで落ちますよね。
> 
> >     MsgBox CallByName(Me, "Str" & Text1.Text, VbGet)
> 
> どんなオブジェクトを指定すればいいのでしょうか?

Publicで宣言するとだめなんですか?(^^;
#16517-0
RE#16514:変数の文字列に、他の変数を使うには?
>>> 配列にすればできるのですが、配列は使えない状況なのです。
>> どういう状況でしょう? (^^;
> そう言われると、困るんですが・・。要するに、ひとに頼まれたんですが、そのひとが、
> 「配列はなぁ、使いたないねん」と、ゆうてますんで。そういう状況です。(^^;
# 使いたないねん…? 使いたくない、って意味かな?

>> Public Str1 As String
> をプライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
> ところで落ちますよね。
プライベート変数を、Public Propertyで公開すればOKです。
プロシージャ内変数の場合は、スクリプトコントロールを利用してやれば良いです。

# こんな作業をするぐらいなら、配列を使った方がずっと楽だし、わかりやすいと思うんだけど。(^_^;)


>>     MsgBox CallByName(Me, "Str" & Text1.Text, VbGet)
> どんなオブジェクトを指定すればいいのでしょうか?
「Object型変数にSetできる物」であれば、何でも指定できます。

クラス、フォーム、コレクション、Appオブジェクト、Controlオブジェクト、
ActiveXコントロール、標準コントロール、ユーザーコントロールなどなど……。
#16518-0
RE#16517:変数の文字列に、他の変数を使うには?
> > 「配列はなぁ、使いたないねん」と、ゆうてますんで。そういう状況です。(^^;
> # 使いたないねん…? 使いたくない、って意味かな?

そうでした。

> >> Public Str1 As String
> > をプライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
> > ところで落ちますよね。
> プライベート変数を、Public Propertyで公開すればOKです。
> プロシージャ内変数の場合は、スクリプトコントロールを利用してやれば良いです。
> 
> # こんな作業をするぐらいなら、配列を使った方がずっと楽だし、わかりやすいと思うんだけど。(^_^;)

そうですね。ほんとそうです。
 
> >>     MsgBox CallByName(Me, "Str" & Text1.Text, VbGet)
> > どんなオブジェクトを指定すればいいのでしょうか?
> 「Object型変数にSetできる物」であれば、何でも指定できます。
> 
> クラス、フォーム、コレクション、Appオブジェクト、Controlオブジェクト、
> ActiveXコントロール、標準コントロール、ユーザーコントロールなどなど……。

わかりました。お手数かけましたが、この機会にCallByName学べてよかったです。

ありがとうございました。
#16519-0
RE#16514:変数の文字列に、他の変数を使うには?
> そう言われると、困るんですが・・。要するに、ひとに頼まれたんですが、そのひとが、
> 「配列はなぁ、使いたないねん」と、ゆうてますんで。そういう状況です。(^^;

「何で配列がいやなん?」って聞いて自分が納得できるように説明してもらうことの方が先決のような
気がしますが...

少なくとも私なら「使いたないねん」って言われても「だから何なん?」って言うてるやろうし。(^^;

> > CallByName関数を使うとか。
> 
> これです! これで行きたいのですが、

いや、やめた方が・・・。
というのも

> > Public Str1 As String

は、フォーム内にPublicプロシージャを定義したことと同義になって
そのプロシージャを操作するという意味で CallByNameが登場したわけです。

ですので
> プライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
> ところで落ちますよね。

は当然のことでして(「できない」ということです)、CallByNameを使いたいからという理由で
参照範囲を広げるというのも本末転倒なことかと思います。

それならまだ、コレクションを使った方がマシのような気もしますが、それ以前に配列を拒絶する
理由が「その程度」ならそっちを整理する方が先だろうと思わずにいられないわけです。
#16522-0
RE#16519:変数の文字列に、他の変数を使うには?
匿名16519さん、浅はかな認識をしっっっかと、指摘してくださいまして、ありがとうございました。
たしかに、CallByName関数の認識自体まちがってました。変数をぶつ切りにしてもいけまっせ、
のための関数でなく、あくまでプロシージャを操作するためのものである、と。

逆にいうと、変数はぶつ切りにしたらあかんのですね。たとえば、レコードセットのフィールドで
URIAGE1、URIAGE2、URIAGE3などとあるばあい、

Dim lIndex as Long
Dim RsWork as Recordset

For lIndex = 1 To 3
    Debug.Print  RsWork.Fields("URIAGE" & lIndex).Value
Next

などとすることが可能ですが、こういう要領で変数を扱うわけにはいかなかったのですね。



> > > CallByName関数を使うとか。
> > 
> > これです! これで行きたいのですが、
> 
> > > Public Str1 As String
> 
> は、フォーム内にPublicプロシージャを定義したことと同義になって
> そのプロシージャを操作するという意味で CallByNameが登場したわけです。
> 
> ですので
> > プライベートで宣言、あるいはプロシージャ内でDim宣言すると、下記のMeのオブジェクト指定の
> > ところで落ちますよね。
> 
> は当然のことでして(「できない」ということです)、CallByNameを使いたいからという理由で
> 参照範囲を広げるというのも本末転倒なことかと思います。
#16524-0
RE#16522:変数の文字列に、他の変数を使うには?
>     Debug.Print  RsWork.Fields("URIAGE" & lIndex).Value
> などとすることが可能ですが、こういう要領で変数を扱うわけにはいかなかったのですね。

それをやりたければ、最初に書いたように「コレクション」を使えばよいのです。(^_^;)
# 実際、上記は「Fieldsコレクション」を利用していますよね。

例えば、こんな感じ。
    Dim C As New Collection
    Dim S As String
    
    C.Add 1234, "Uriage1"
    C.Add 2345, "Uriage2"
    C.Add 7777, "Uriage3"
    
    S = InputBox("1, 2, 3の何れかを指定", , "2")
    If S Like "[123]" Then
        MsgBox C("Uriage" & S), vbInformation, S
    Else
        MsgBox "指定に誤りがあります", vbExclamation
    End If
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)