• ベストアンサー

プログラムの記述方法について

プログラム初心者です。 よろしくお願いいたします。 数個の変数を構造体で定義し、そのメンバ名を 順に実行させたいのですができますでしょうか? type koumoku a1 as string a2 as string a3 as string End type Sub main() koumoku.a1="egg" koumoku.a2="book" koumoku.a3="ohasi" Dim syori as string syori = koumoku.a1 ※ここでeggを用いた処理を実施   syori = koumoku.a2 ※ここでbookを用いた処理を実施 syori = koumoku.a3 ※ここでohasiを用いた処理を実施 End sub 上記で実施している構造体のメンバ(a1~a3)は 繰り返し処理するので、繰り返し文にしたいと 思っていますが、そのような考えは間違っているでしょうか? 実際には、a1~a10など増やしたいと思っています。 また、不完全なコーディングですが誤りがあればご指摘いただきたく 何卒よろしくお願いいたします。

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

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

将来的に数を増やすのであれば構造体を使うより 配列を使用した方が便利です。 Dim koumoku(2) As String Dim shori As String Dim n As Integer koumoku(0)="egg" koumoku(1)="book" koumoku(2)="ohasi" For n = 0 To 2   shori = koumoku(n)   ※ここでshoriを用いた処理を実施 Next n

nosense
質問者

お礼

ご回答ありがとうございます。 確かに配列を使ったほうが便利ですね。 ありがとうございます。 稚拙なコードで誠に申し訳ありません。 なんかと半分ぐらい?出来上がりました。 構造体を使用している理由ですが、 他の関数でも使用するため、パブリックで定義してます。 ただ、下記のようにpublicで定義するとエラーが出るため プライベートにしています。 なぜエラーになるのでしょうか? さらに、d(2)の配列を他の関数に渡したい場合どのように すればよいでしょうか? 沢山質問して申し訳ありませんがよろしくお願いいたします。 Private Type list a(2) As String b(2) As integer End Type   Public con As String Public rd As String Sub test() Dim c As list c.a(0) = "egg" c.a(1) = "book" c.a(2) = "ohasi" c.b(0) = 1 c.b(1) = 2 c.b(2) = 3 Dim d(2) As String Dim I As Integer For I = 0 To 2 con = c.a(I)   Do rd = call kounyu() If rd = "No" Then Call wait() Else con = c.b(I) End If Loop While (1) d(I) = rd Next I End Sub Sub test2() Dim cq As list cq.a(0) = "coffee" cq.a(1) = "peper" cq.a(2) = "okoto" For I = 0 To 2 con = cq.a(I)   Do rd = call kounyu() If rd = "No" Then Call wait() Else Exit Do End If Loop While (1) d(I) = rd Next I End Sub

nosense
質問者

補足

ところどころ、最初と記述が変わってしまいました。 申し訳ありません。 分かりにくくなってしまいましたが よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.1

type koumoku a1 as string a2 as string a3 as string End type これは型の定義だけで、koumokuは型名で変数ではありません。 これを使うには改めて、この型の変数を定義する必要があります。 Sub main() Dim koum As koumoku Dim syori As String koum.a1 = "egg" koum.a2 = "book" koum.a3 = "ohasi" syori = koum.a1 MsgBox koum.a1 syori = koum.a2 MsgBox koum.a2 syori = koum.a3 MsgBox koum.a3 End Sub とか。

nosense
質問者

お礼

ご回答ありがとうございます。 すみません。 間違えておりました。 ありがとうございます。

nosense
質問者

補足

#1、#2の回答者様へ すみません。早とちりしてるかもしれませんが、 構造体を使用する理由って、複数の関数に使用するため じゃないですね。 いろんな変数をまとめたい場合という意味では、 カウンタに使用している変数などメンバに加えたほうが 良いということでしょうか? それとも、やはり個別に配列で使用したほうがよいのでしょうか? 構造体を使用するメリットが未だによく分からないです。。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • 構造体についてここが知りたい!(参照方法について)

    いつもお世話になっています、宜しくお願いします。 現在ACCESS2002、SQLサーバーで次のことを実現しようと思っています。 やっていることは 項目名が数字部分のみ違う要素を30個もつ構造体(構造体名:Kouzoutai) 下記のように用意します。 Type Kouzoutai  KOUMOKU1  KOUMOKU2  KOUMOKU3   ・   ・   ・  KOUMOKU29  KOUMOKU30 End Type この項目、KOUMOKU1~30でNULLのものには1を格納するという処理を 行いたいと思っています。 IF文を30個書いても良いのですが、あまりに冗長的なソースに なってしまうので、ループを使って行いたいと思っています。 例えばコントロール名などでは、ME("KOUMOKU" & CNT).VALUEというような 書き方で値が取得できるので、そのような感じで下記のように 記述したのですが、うまく動かず行き詰っています。 Dim CNT As integer CNT = 1 DO WHILE CNT <= 30  IF ISNULL(Kouzoutai.("KOUMOKU" & CNT) THEN   Kouzoutai.("KOUMOKU" & CNT) = 1  END IF  CNT = CNT + 1 LOOP 基本的なことを見落としているかもしれませんが、 何かお気づきの方が居られましたら、ご教授ください。 宜しくお願いいたします。

  • TYPE分の使い方で

    Visual Basic 6.0です。 バイナリーファイルを読むのに使用するため 下記のようなType宣言をしています。 今 KOUMOKU は String * 10で宣言しているのですが 読み込むファイルでいろいろあるので (*8,*6,*4など) たくさんのType分を作っているのですが 一つのType分で宣言できる方法はないでしょうか。 Type TYPEA KOUMOKU As String * 10 <-この10が任意で可変できないでしょうか NAMAE As String * 20 BUKA As String * 5 End Type

  • 構造型の宣言について

    VB6.0の標準モジュールにて、 Option Explicit Public Type typeData data() As Variant End Type Public arrData() As typeData と構造型の配列を宣言したのですが、 メインのフォーム内にて Public Sub syori(arrData() As typeData) ~ end sub と記述しても、 プライベートモジュール内で宣言した型は使えません、と出てしまいます。 構造型をサブルーチン内で使うことはできないのでしょうか? 分かる方がいらっしゃいましたら、ご教授のほどお願いいたします。

  • 構造体変数の参照方法について

    ----------------------------------- Private Type DATA str1 As String str2 As String End Type Dim A as DATA MsgBox A.str1 ----------------------------------- 構造体を参照するときはこのようなやり方がポピュラーだと思うのですが、 ---------- tmp="str1" A.tmp ---------- だとか ---------- A.item(1) ---------- など、別の参照方法はあるのでしょうか? よろしくお願いします。

  • 他のExcelブックのモジュールに構造体を渡すには

    Book1.xlsのaモジュールから構造体を引数としてBook2.xlsのbモジュールを呼び出したいのですが、Book1.xlsのVBEのツールメニューの参照設定でBook2.xlsを参照しましたが、Book1.xlsのaモジュールを実行するとCall b(t)のtの箇所で「ByRef 引数の型が一致しません」というコンパイルエラーになります。 他のブックのモジュールに構造体を渡すにはどのようにすればよいのでしょうか。 よろしくお願いしたます。(OS:WindowsXP Excel2003) ---Book1.xls--- Option Explicit Public Type TT  name As String End Type Sub a()  Dim t As TT  t.name = "ABC"  Call b(t) End Sub ---Book2.xls--- Option Explicit Public Type TT  name As String End Type Sub b(t As TT)  MsgBox t.name End Sub ---------------

  • 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) などの参照型である場合は、データへのポインタがコピーされます。 ということでしょうか?

  • 構造体配列の一部初期化!!!

    はじめまして@ 今、下のような構造体があるとします。 ----------------------------------------------- Type TableColumn  sName As String  sKana As String End Type Type a_2  C(100) as TableColumn End Type Type a_1  B(3) as a_2 End Type global A(5) as a_1 ----------------------------------------------- ちなみに図で表すとこんな感じです。 A(5) |-B(3)  |-C(100)   |-sName   |-sKana このとき、この構造体の配列を初期化するときは普通でしたら、  Erase A とやることによってすべての配列の中身が初期化されると思うのですが、 今回は一部を消去したいのです。 たとえば、A(0).B(0)以下の中身は初期化しないで、A(0).B(1)以下は初期化する、といった感じです。 何か良い方法がありましたらぜひご教授お願いいたします。 よろしくお願いします。

  • オブジェクト指向の新たな実装方法になるでしょうか?

    トレーディングカードゲームの開発ツール(以降TCGE)というものを作成していたのですが、 オブジェクト指向プログラミングとは考え方が違うと思えるものが出来ました。 考え方を纏めていたところもっと多くの活用が可能かと思い皆様の知恵をお借りしたく思っております。 ※過去にカオス指向(仮)として纏めてみようかと思ったのですが、 他言語等を把握しておらず違いをうまく表現できませんでした。 ●違うと思っている点は以下の通りです。 ・オブジェクトを「物体」と「処理」とに分かれている。 ・「物体」には、「物体」を追加・削除でき、木構造になっている。 ・「物体」には、「処理」を追加・削除でき、「物体」に追加された「処理」は「物体」以降を適用範囲とする。 ・「処理」には、”認識タイプ”が設定され、「物体」に追加された「処理」は”認識タイプ”を持つ「物体」のメソッドとして使用される。 ・「処理」には、優先順位が設定され、「物体」のメソッドを処理する際に、同メソッドの継承関係を構築します。 ●同じ点は以下の通りです。 ・オブジェクトどうしの処理のやり取りを行う。 ・継承関係を持ちません。 ●注意点 ・コーディング例は後ろに載せてあります。 ・TCGEの設定方法をそのままvb風のコーディングにしてあります。 ・まだまだ改善の余地があり、改善案はありますが質問を優先させたいので不備のあるままにしてあります。  例としては、関数を処理オブジェクトとして生成してありますがクラスにしたほうが隠蔽化等が出来て便利など。 ●質問内容としては以下の通りです。 ・言語等で同様の考え方の言語はありますでしょうか? ・「アスペクト指向」等でいう「横断」は実現できるでしょうか? ・コーディング例として必要なものが他にありますでしょうか? ・「物体」の木構造と「処理」の配置を考えるだけでシステムの構築が可能になると考えているのですが需要はあるでしょうか? ●コーディング例 <コーディング例1> function 自己紹介() as string:人(人,1)() '人(人,1)()の説明 '・括弧外の人は、この処理自体を表し、処理生成の1番目で指定します。 '・最初の括弧内の人は”認識タイプ”といわれるもので、処理を適用するかを操作します。この場合、人ならこの処理を行うことになります。 '・最初の括弧内の1は処理の優先順位になります。 '・最後の括弧内は1は処理を生成する際のパラメータになります。  return "人" End Function function 自己紹介() as string:歌える(歌える,1)()  return "歌える" & MyBase.自己紹介() '継承関係がないのにMyBaseがあります。 End Function function 自己紹介() as string:踊れる(踊れる,1)()  return "踊れる" & MyBase.自己紹介() End Function function 自己紹介() as string:アイドル(アイドル,1)()  return "アイドル" End Function Sub main()  ’オブジェクトを生成します  dim 歌って踊れるアイドル=ルート.物体生成(人) 'newでの生成はなく実体オブジェクトに生成追加します  '処理を追加します  dim 人処理=ルート.処理生成(人)  dim アイドル処理=ルート.処理生成(アイドル)  dim 踊れる処理=ルート.処理生成(踊れる)  dim 歌える処理=ルート.処理生成(歌える)  ’アイドルの成長をご覧ください  msgbox(歌って踊れるアイドル.自己紹介()) '「人」と返します。認識タイプは”人”だけです。  歌って踊れるアイドル.認識タイプ追加(アイドル)  msgbox(歌って踊れるアイドル.自己紹介()) '「アイドル」と返します。認識タイプは”人”と”アイドル”です。  歌って踊れるアイドル.認識タイプ追加(歌える)  msgbox(歌って踊れるアイドル.自己紹介()) '「歌えるアイドル」と返します。認識タイプは”人”と”アイドル”と”歌える”です。  歌って踊れるアイドル.認識タイプ追加(踊れる)  msgbox(歌って踊れるアイドル.自己紹介()) '「歌える踊れるアイドル」と返します。認識タイプは”人”と”アイドル”と”歌える”と”踊れる”です。  'おまけでアイドルを辞めさせてみます  歌って踊れるアイドル.認識タイプ削除(アイドル)  msgbox(歌って踊れるアイドル.自己紹介()) '「歌える踊れる人」と返します。認識タイプは”人”と”歌える”と”踊れる”です。 End Sub ・歌って踊れるアイドル.自己紹介()時の処理の流れ 認識タイプに”人”、”アイドル”、”歌える”、”踊れる”がある場合、 処理の順番は追加の逆順(”認識タイプ”の追加順ではありません)なので ”歌える”、”踊れる”、”アイドル”、”人”の順番になります。 <コーディング例2> function 国名() as string:国(国,1)(国名 as string)  return 内容 End Function function 挨拶() as string:挨拶A(人,1)(時間from as string,時間to as string,内容 as string)  if 時間from<= 現在時間 and 現在時間<=時間to then   return 内容  else   return MyBase.挨拶()  endif End Function function 挨拶() as string:挨拶B(人,2)(内容 as string)  '語尾追加  return MyBase.挨拶() & 内容 End Function Sub main()  ’オブジェクトを生成します  dim 日本=ルート.物体生成(国)  dim アメリカ=ルート.物体生成(国)  dim Aさん=日本.物体生成(人)  dim Bさん=日本.物体生成(人)  dim Cさん=日本.物体生成(人)  dim Dさん=アメリカ.物体生成(人)  '処理を追加します  dim 日本処理=日本.処理生成(国,日本)  dim アメリカ処理=アメリカ.処理生成(国名,アメリカ)  dim 挨拶処理1=ルート.処理生成(挨拶A,"0:00","6:00","good evening")  dim 挨拶処理2=ルート.処理生成(挨拶A,"6:00","10:00","good morning")  dim 挨拶処理3=ルート.処理生成(挨拶A,"10:00","19:00","good day")  dim 挨拶処理4=ルート.処理生成(挨拶A,"18:00","24:00","good evening")  dim 挨拶処理5=日本.処理生成(挨拶A,"0:00","6:00","こんばんわ")  dim 挨拶処理6=日本.処理生成(挨拶A,"6:00","10:00","おはよう")  dim 挨拶処理7=日本.処理生成(挨拶A,"10:00","19:00","こんにちわ")  dim 挨拶処理8=日本.処理生成(挨拶A,"18:00","24:00","こんばんわ")  dim 挨拶処理9=Bさん.処理生成(挨拶B,"ニャン")  msgbox(Aさん.挨拶()) '0~6時は「こんばんわ」、6~10時は「おはよう」、10~18時は「こんにちわ」、18~24時は「こんばんわ」  msgbox(Bさん.挨拶()) '0~6時は「こんばんわニャン」、6~10時は「おはようニャン」、10~18時は「こんにちわニャン」、18~24時は「こんばんわニャン」  msgbox(Cさん.挨拶()) '0~6時は「good evening」、6~10時は「good morning」、10~18時は「good day」、18~24時は「good evening」 End Sub ・オブジェクトと処理の木構造 ルート(挨拶処理1~4)   日本(挨拶処理5~8)     Aさん     Bさん(挨拶処理9)   アメリカ     Cさん ・Aさん.挨拶()時の処理の流れ 処理対象のメソッドは、木構造から挨拶処理1~挨拶処理8になります。 (日本処理は”認識タイプ”が異なるので対象になりません) 挨拶処理1~挨拶処理8の処理の優先順位で並べ替えると 挨拶処理8、挨拶処理7、・・・、挨拶処理1 の順番になります。 並び替えた順番で所謂「継承」を構成して処理しますので、 挨拶処理8を処理し、18:00~24:00の間なら"こんばんわ"を返し、 そうでない場合、挨拶処理7を処理し、10:00~19:00の間なら"こんにちわ"を・・・と処理されます。 以上よろしくお願いします。

  • プログラムについて

    初心者の質問ですみません。 関数の読み出しについてですが、 A1実施→X1となり、X1をa()に代入する。 これを数回ループする場合、aのデータを他の関数で読み出し 変数に代入したい場合どのような記述が良いでしょうか? sub test1() Dim i,X as integer Dim A(10) as integer Dim a(10) as integer For i = 0 to 10 X = A(i)+300 a(i)=X next i End sub sub test2() ※ここにどのように記載すればa(i)を読み出せますか? End sub