Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8898 / 13646 ツリー ←次へ | 前へ→

【30117】構造体配列の初期化 おぐら 05/10/19(水) 22:14 質問[未読]
【30119】Re:構造体配列の初期化 ichinose 05/10/19(水) 23:07 発言[未読]
【30120】Re:構造体配列の初期化 おぐら 05/10/19(水) 23:23 お礼[未読]
【30125】Re:構造体配列の初期化 Jaka 05/10/20(木) 9:43 発言[未読]
【30155】Re:構造体配列の初期化 bykin 05/10/20(木) 19:14 発言[未読]
【30162】Re:構造体配列の初期化 micnak 05/10/21(金) 5:17 発言[未読]
【30460】Re:構造体配列の初期化 おぐら 05/10/27(木) 22:27 お礼[未読]

【30117】構造体配列の初期化
質問  おぐら  - 05/10/19(水) 22:14 -

引用なし
パスワード
   初書き込みで質問で恐縮ですがまわりに聞ける人がいないので教えて下さい。

クイズ1問ごとのデータ(問題、回答、正当時のメッセージ等)の構造体を定義し、その配列を作成したのですが効率の良い初期化方法が解りません。
現状では初期化関数の中で「table(1).mondai = "・・・"」等としていますが、下記の点で納得いきません。

1.変更しないテーブルであるにもかかわらず、実行時に初期化している。
2.要素毎に要素番号を記述する必要がある。
3.要素毎にメンバ名を記述する必要がある。

うまい初期化方法があれば教えて下さい。
理想はこんな感じです。これを関数の外に書きたいです。
下記に近い書き方があればうれしいです。
table1 = ( ( "問題内容1" , "回答1" , "Msg1") , _
      ( "問題内容2" , "回答2" , "Msg2") )

補足:
・問題の内容をユーザ見せしたくないので、ワークシートには書きたくないです。
・そんな方法は聞いたこと無いということでしたらその旨回答お願いします。
・自分はCプログラマです。(回答の助けになるかと思い念のため記述)

【30119】Re:構造体配列の初期化
発言  ichinose  - 05/10/19(水) 23:07 -

引用なし
パスワード
   ▼おぐら さん:
こんばんは。

>初書き込みで質問で恐縮ですがまわりに聞ける人がいないので教えて下さい。
>
>クイズ1問ごとのデータ(問題、回答、正当時のメッセージ等)の構造体を定義し、その配列を作成したのですが効率の良い初期化方法が解りません。
>現状では初期化関数の中で「table(1).mondai = "・・・"」等としていますが、下記の点で納得いきません。
>
>1.変更しないテーブルであるにもかかわらず、実行時に初期化している。
 残念ながら、変数定義時に初期値を指定できる変数という概念がありません。


>2.要素毎に要素番号を記述する必要がある。

  配列ですからねえ
  
>3.要素毎にメンバ名を記述する必要がある。
  構造体(VBAでは、ユーザー定義型)ですからねえ
>
>うまい初期化方法があれば教えて下さい。
>理想はこんな感じです。これを関数の外に書きたいです。
>下記に近い書き方があればうれしいです。
>table1 = ( ( "問題内容1" , "回答1" , "Msg1") , _
>      ( "問題内容2" , "回答2" , "Msg2") )

ということで↑これは、厳しいかな・・・。


>補足:
>・問題の内容をユーザ見せしたくないので、ワークシートには書きたくないです。

シートを非表示(シートのVisibleプロパテイを2に設定)すれば、
ユーザー操作で表示は出来ません。
よって、シートに

問題内容1 回答1  Msg1
問題内容2 回答2  Msg2
問題内容3 回答3  Msg3
問題内容4 回答4  Msg4
問題内容5 回答5  Msg5
問題内容6 回答6  Msg6

等と事前に設定しておくとよいと思いますが、いかがですか?

【30120】Re:構造体配列の初期化
お礼  おぐら  - 05/10/19(水) 23:23 -

引用なし
パスワード
   ichinose さん、迅速かつ的確な回答ありがとうございます。
「無い」ということほど調べるのが難しいことは無く、回答頂き大変助かりました。

【30125】Re:構造体配列の初期化
発言  Jaka  - 05/10/20(木) 9:43 -

引用なし
パスワード
   こんにちは。

▼おぐら さん:
>関数の外に書きたいです。
全く内容を把握してません。ので、勘です。
外れたら無視してください。
これっ?

tb = [{"A1";"A2";"A3";"A4"}]
Range("A1:A4").Value = tb

tb = [{"C1","D1";"C2","D2";"C3","D3";"C4","D4";"C5","D5"}]
Range("C1:D5").Value = tb

tb = [{"F1","G1","H1";"F2","G2","H2";"F3","G3","H3";"F4","G4","H4"}]
Range("F1:H4").Value = tb

【30155】Re:構造体配列の初期化
発言  bykin  - 05/10/20(木) 19:14 -

引用なし
パスワード
   こんばんわ。

構造体(ユーザー定義型)やのうて、配列やったらあかんのかな?
↓こんなの

Sub test()
  Dim Buf As Variant
  
  Buf = Array(Array("Q1", "A1", "M1"), _
        Array("Q2", "A2", "M2"), _
        Array("Q3", "A3", "M3"))
  MsgBox Buf(0)(0)
  MsgBox Buf(0)(1)
  MsgBox Buf(0)(2)
  MsgBox Buf(1)(0)
  MsgBox Buf(1)(1)
  MsgBox Buf(1)(2)
  MsgBox Buf(2)(0)
  MsgBox Buf(2)(1)
  MsgBox Buf(2)(2)
End Sub

ご参考まで。
ほな。

【30162】Re:構造体配列の初期化
発言  micnak  - 05/10/21(金) 5:17 -

引用なし
パスワード
   VBAの記法としては、ご希望のものはありませんので、事前の策として作ってやるということで、

まず、Quizesという名前のモジュールを作って以下のようにします。
======
Option Explicit

Public Type Quiz
 mondai As String
 kaito As String
 message As String
End Type

Dim QTable() As Quiz
Dim Index As Long
Sub Init()
 Index = -1
End Sub

Sub Add(mondai As String, kaito As String, message As String)
 Dim q As Quiz
 q.mondai = mondai
 q.kaito = kaito
 q.message = message
 Index = Index + 1
 
 ReDim Preserve QTable(Index)
 QTable(UBound(QTable)) = q
 
End Sub

Function Item(Index As Long) As Quiz
 Item = QTable(Index)
End Function

Function Count() As Long
 Count = Index + 1
End Function

'==========ここまで

以下がその使用例のマクロです。

Sub testQ()

 Quizes.Init
 'この辺が初期値の設定コード
 Quizes.Add "問題1", "回答1", "メッセージ1"
 Quizes.Add "問題2", "回答2", "メッセージ2"
 Quizes.Add "問題3", "回答3", "メッセージ3"
 Quizes.Add "問題4", "回答4", "メッセージ4"
 Quizes.Add "問題5", "回答5", "メッセージ5"
 
 
 '設定した値の使い方。
 Dim i As Long
 For i = 0 To Quizes.Count - 1
  Dim q As Quiz
  q = Quizes.Item(i)
  Debug.Print i, q.mondai, q.kaito, q.message
 Next
End Sub

【30460】Re:構造体配列の初期化
お礼  おぐら  - 05/10/27(木) 22:27 -

引用なし
パスワード
   Jakaさん、bykinさん、minakさん返信ありがとうございました。

8898 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free