ユーザー構造体の操作方法について

このQ&Aのポイント
  • ユーザー構造体の操作方法について教えてください。
  • Type TESTを使用してユーザー構造体を作成し、文字列の代入方法について教えてください。
  • 一般的な文字列の代入方法とは異なる、ユーザー構造体の文字列の代入方法を教えてください。
回答を見る
  • ベストアンサー

ユーザー構造体

以下のようなことはできないのでしょうか? Type TEST strData1 as String * 1 strData2 as String * 1 strData3 as String * 2 End Type Function BATCH() Dim Wk1 as String Dim Wk2 as TEST Wk1="TEST" Wk2=Wk1 * Wk2.strData1にT * Wk2.strData1にE * Wk2.strData1にSTが代入されるようなイメージ * 一般的はWk2.strData1=Mid(Wk1,1,1)とかですよね。 End Function どなたかわかる方ご教授してください。

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

こういうやり方であれば、出来るみたいです。VB6まで対応です。 Type TEST  strData1 as String * 1  strData2 as String * 1  strData3 as String * 2 End Type Type TEST2  strData1 as String * 4 End Type dim Wk1 as TEST2 dim Wk2 as TEST Wk1.strData1 ="TEST" LSET WK2 = WK1 以前(バージョンの古かったころ)、ヘルプの何処かで「このようなやり方も出来るが言語仕様外の方法であり、将来的に保障されるものではない」といった記述を読んだような記憶があります。 試しにVB.Netでも試してみましたが、出来ませんでした。 ってことで、素直にMidでやるのがベストのような気がします。

ta_sachiko
質問者

お礼

回答ありがとうございます。 私の環境を記載しなかったこと大変申し訳ないです。 VB6での環境なのですが、ご指摘どおりユーザー構造体をひとつ作成し、同じ型同士をLSETで代入することで同様のことを行うことができました。大変ありがとうございました。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

Type SAMPLE d1 As String * 1 d2 As String * 2 d3 As String * 1 End Type '----- Sub test01() Dim wk1 As SAMPLE 'wk1.d1 = "a" 'wk1.d2 = "12" 'wk1.d3 = "W" wk1 = "test" '-----(X) MsgBox wk1.d1 MsgBox wk1.d2 MsgBox wk1.d3 End Sub 上記でコメント(’)を外すやり方はOKですが、 上記のままだと、上記(x)のところでエラーが出ます。 VBのユーザー定義型では、メンバの構造を無視して(越えて)、値を入れることは出来なさそうです。 値の代入は個々のメンバごとにすると言う、面倒くさい ことです。 ReDefineや共用体の考えが取り入れられている言語なら メンバ全体を別の名前付けして、一括で代入し、各メンバで取り出せると思いますが。 ただ入出力エリアとして、ファイルから読み込む時は、 Get #1,SANPLEが可能なような説明がある個所がありましたが,(RECDEF-RECENDが出きたある種のBASICを思い出しますが)未テストです。

ta_sachiko
質問者

お礼

やはり無理ですか。 ランダムファイルアクセス等ではできるので もしかしたらと思ったのですが、集団変数を設定 できると便利ですよね。参考になりました。

関連するQ&A

  • 構造体のコピー

    VB6ですが、構造体のコピーは正しくできるのでしょうか type a test1(0 to 5) as byte test2 as integer test3 as string end type dim b1 as a dim c1 as a b1.test = 2 c1 = b1 私はここで、c1.test2が0だった

  • VB2008: 構造体に関するMSDNの解釈について!

    ' ================== ' 構造体変数の代入 ' ================== Module theTEST   Private Structure TEST4     Dim MembersCount As Integer     Dim Member1 As String     Dim Member2 As String   End Structure   Sub Main()     Dim T4_1 As TEST4     Dim T4_2 As TEST4     T4_1.MembersCount = 1     T4_1.Member1 = "T4_1:Member1"     T4_1.Member2 = "T4_1:Member2"     T4_2 = T4_1     Debug.Print(T4_2.MembersCount.ToString)     Debug.Print(T4_2.Member1)     Debug.Print(T4_2.Member2)   End Sub End Module [イミディエイト ウインドウ] 1 T4_1:Member1 T4_1:Member2 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 (http://msdn.microsoft.com/ja-jp/library/18ytyskd(VS.80).aspx) このMSDNライブラリの説明によると、 [イミディエイト ウインドウ] 0 T4_1:Member1 T4_1:Member2 という結果を得るというのが私の予測。 もしかしたら、MSDNライブラリの説明の舌足らず。 >構造体の要素が値型であらば値がコピーされますが、文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、データへのポインタがコピーされます。 ということでしょうか?

  • ファイル入力のデータを構造体に入れる方法

    VB.net(XP:VS2008のみフルインストール)にて テキストファイルから入力したデータを構造体st_testに入れたいと考えているのですが、実現できません。 どなたか、お力添えをお願いします。 テキストファイルは、事前に構造体(st_test)に値を入れ、 単純にFileOpen→OutPutしています。 (","や" "などでメンバ毎に分割等はしておりません。) 構造体 ---------------------- Public Structure st_test <VBFixedArray(63), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim A() As Byte Dim B As Integer <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Dim N() As Byte <VBFixedArray((7), (11)), MarshalAs(UnmanagedType.ByValArray, SizeConst:=(72))> _ Dim S(,) As Byte <VBFixedArray(11), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _ Dim U() As Integer End Structure ---------------------- 実現しようとしている個所 ---------------------- Dim t As String Dim temp(2) as st_test FileOpen(1, "test1.txt", OpenMode.Input) Input(FileNum, t) '''temp(0) = CType(CType(t, Object), st_test)...? temp(0) = CType(t, st_test) | FileOpen(1, "test2.txt", OpenMode.Input) Input(FileNum, t) temp(1) = CType(t, st_test) ---------------------- 上記の様に処理を行えば簡単にできるのかと安易な発想でいましたが、 CTypeの処理で'String'の値を'st_test'に変換できません。 旨のエラーになり、うまく実現することができません。 そもそもString型のデータをst_testにキャストすることが不可能なのでしょうか? それともただ、実現方法がカスなのでしょうか? 実際の構造体のサイズは4000Byteを超え(メンバ数も多いです。。。) 一つ一つ入力していくことが現実的に不可能なため ファイルよりInputすることしか思いついておりません。 test1.txtの中身を秀丸で開いてみました。 参考になれば・・・。 改行はなく、"福岡"の後等にそれぞれ空白があります。 -------------------------- 福岡 . A1 14 15 16 17 18 19 XX XX XX XX XX XX -------------------------- 宜しくお願いします。

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class

  • CSVから構造体へ代入

    お世話になります。 Private Type TestRecord Col1 As String * 255 Col2 As String * 255 Col3 As String * 255 End Type Sub ボタン1_Click() Dim FName As String Dim FileNo As Integer Dim LineData As String Dim TestRec() As TestRecord FileNo = FreeFile '選択したファイル名の取得 FName = Application.GetOpenFilename("CSV ファイル (*.CSV),*.CSV") If FName = "False" Then Exit Sub End If Open FName For Input As #FileNo Do Until EOF(FileNo) i = i + 1 Line Input #FileNo, LineData ReDim TestRec(i) TestRec() = Split(LineData, ",") Debug.Print buf Loop Close #FileNo End Sub ファイルの中身 "テストID1","テスト姓1","テスト名1" "テストID2","テスト姓2","テスト名2" 以上のコードを実行するとTestRec() =~の部分で型が一致しません とエラーが出てしまいます。 よき解決方法があれば教えてください。宜しくお願いします。

  • 【VBA】入れ子のユーザー定義型

    閲覧ありがとうございます。 入れ子になってるユーザー定義型(構造体)に、値を代入する処理を抽象化したいのですが、上手くできません。 色々間違っているかもしれませんが、やりたいことのイメージは下のような感じです。 Private Type id kind As String memberId As String End Type Private Type items kind As String name As String id As id End Type sub main() (省略) Dim tmp As Variant tmp = jsonのレスポンスが1行ずつ配列で入ってる Dim items() As items items() = loading(tmp) (省略) End Sub Private Function loading(ByVal tmp As Variant) Dim pair() As Variant pair = Split(tmp, ":") Dim head As String Dim items() As items  If 末尾が"{"だったら、 If pair(0) = "{" then head = "items(0)" else if pair(1) = "{" then head = head & pair(1) Else head.pair(0) = pair(1) ←pair(0)は名前、pair(1)は値がそれぞれ入っている endif loading = items() End Function 説明が下手すぎてすみません。 実際は、もっとたくさん入れ子になっている為、抽象化できないと非常に困ります。 答えられそうだけど質問の意味をもう少しきちんと…ということであれば努力しますので、なんとか、よろしくお願いいたします。

  • 構造体 多段階配列について

    Private Structure test Dim a As Integer Dim b As String Dim c as String End Structure Dim a() As test = New test(2) {} Dim b() As test = New test(2) {} Dim c()() As test c = New test()() {a, b} Dim temp() as integer cは多段階配列で、 例えば、c(0)のメンバaのデータをすべて取り出したい 時はどうすればよろしいのでしょうか? //気持ち的にはこのようにしたいのですが、 できません。 temp = c(0).a どなたか、わかるかた、教えてください。 よろしくお願いします。

  • VBA 構造体の値参照

    いつもお世話になっています。 Access VBAにて構造体を作成し、その値をループで渡したいのですが、ご存知の方おられましたら、お助けください。 (例) Private Type HD_REC ID as string * 2 Name as string * 10 Lev as string * 50 End Type Function SetData() Dim rs As RecordSet Set rs = CurrentDB.OpenRecordSet("XXXXXXXX") While Not rs.EOF rs.Fields(i) = 'ここに構造体のID,Name,Levを渡したいのです。 i=i+1 Wend End Function よろしくお願いします。

  • VisualBasic2010 関数の呼び出し

    VisualBasic2010を利用してシステム開発を行っているのですが、 特定の条件に従いFUNCTIONを呼び出したいと考えております。 呼び出すFUNCTIONが多数存在するため、FUNCTION名を変数で 保持しておき、呼出し時にその変数を利用して呼び出せないかと 思案しております。  ★呼出し側 Dim wk as integer   wk = TEST_A()   wk = TEST_B()  ※上記の「TEST_A()」「TEST_B()」を変数を利用して   wk = HENSU()のように呼び出せないかと考えております。 Private Function TEST_A() As Integer Return 0 End Function Private Function TEST_B() As Integer Return 1 End Function 分る方がいらっしゃいましたらご教授頂けますと幸いです。

  • コマンドプロンプトで実行したら・・・

    Function SpaceDelete(dt As String) As String Dim tmp As String Dim Aftr As String Dim i As Integer For i = 1 To Len(dt) tmp = Mid(dt, i, 1) If tmp <> " " And tmp <> " " Then Aftr = Aftr & tmp End If Next i SpaceDelete = Aftr End Function test.vbs(1,25) Microsoft VBScript コンパイル エラー: ')'がありません。とエラーがでます。 どこが問題かわかりません。 どなたか教えて頂けないでしょうか。 宜しくお願いします。

専門家に質問してみよう