Excel VBA質問箱 IV

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

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


274 / 13645 ツリー ←次へ | 前へ→

【81182】キー値と属性の組の集合を良い感じに変数にしたい りった 20/2/29(土) 10:07 質問[未読]
【81184】Re:キー値と属性の組の集合を良い感じに変... マナ 20/3/1(日) 9:07 発言[未読]
【81231】Re:キー値と属性の組の集合を良い感じに変... りった 20/3/14(土) 13:58 お礼[未読]
【81232】Re:キー値と属性の組の集合を良い感じに変... hatena 20/3/17(火) 20:11 回答[未読]
【81233】Re:キー値と属性の組の集合を良い感じに変... hatena 20/3/17(火) 21:20 回答[未読]

【81182】キー値と属性の組の集合を良い感じに変数...
質問  りった  - 20/2/29(土) 10:07 -

引用なし
パスワード
   キー値と属性の組の集合を変数として保持し、キー値で該当する組を取り出したいのですが何かうまく書くこと出来ますでしょうか?

実際に作るものとは異なりますが、具体例としては下記です。
 下記のようなテーブルが有って
  キャラ名,HP,攻撃力,守備力,スキル名
  ガイ,200,90,50,"兜割り"
  トム,300,30,90,"鉄壁の守り"
  サラ,100,90,10,"エクスプロージョン"
 下記のようなイメージで使いたいです。
  xxx("ガイ").hp
  xxx("トム").attack
  xxx("サラ").defence


属性の数だけコレクションを作れば、キー値で取り出すことは出来ますが、変数がバラバラになってる感じが嫌いです。(妥協できなくも無いですが)
Dim colHP As Collection
Dim colAttack As Collection
Dim colDefence As Collection
Set colHP = New Collection
Set colAttack = New Collection
Set colDefence = New Collection

typeの配列にすれば、変数にまとまりはありますが、キー値で取り出すのに手間がかかります。

なにかいい方法ありますでしょうか?
「多分無い。○○で妥協すべし」等の回答でも有りがたいです。

【81184】Re:キー値と属性の組の集合を良い感じに...
発言  マナ  - 20/3/1(日) 9:07 -

引用なし
パスワード
   ▼りった さん:

こんなことですか?
現状がわかっていないので、同じことかもしれません。

Sub test()
  Dim キャラ As New Collection
  
  キャラ.Add New Collection, "トム"
  キャラ("トム").Add 100, "攻撃力"
  キャラ("トム").Add 50, "守備力"
   
  MsgBox キャラ("トム")("守備力")
  
End Sub

【81231】Re:キー値と属性の組の集合を良い感じに...
お礼  りった  - 20/3/14(土) 13:58 -

引用なし
パスワード
   なるほど! ありがとうございます。

【81232】Re:キー値と属性の組の集合を良い感じに...
回答  hatena  - 20/3/17(火) 20:11 -

引用なし
パスワード
   TypeがCollectionに格納出来たらいいのですが、TypeはCollectionに格納できないという制限があります。

代わりにクラスを使えばどうでしょうか。
クラスモジュールを新規作成して、名前を Chara とします。
下記のコードを記述します。

Option Explicit

Public Name As String
Public HP As Long
Public Attack As Long
Public Defence As Long
Public Skill As String


---
使用例

Public Sub test()
  Dim colChara As Collection
  Set colChara = New Collection
    
  Dim C As Chara
  Set C = New Chara
  With C
    .Name = "ガイ"
    .HP = 200
    .Attack = 90
    .Defence = 50
    .Skill = "兜割り"
  End With
  colChara.Add C, "ガイ"
  
  Set C = New Chara
  With C
    .Name = "トム"
    .HP = 300
    .Attack = 30
    .Defence = 90
    .Skill = "鉄壁の守り"
  End With
  colChara.Add C, "トム"
  
  Debug.Print colChara("ガイ").HP
  Debug.Print colChara("トム").Defence

End Sub


クラスではパブリック変数を宣言してますが、プロパティを使ったりメソッドを追加したりするとより使いやすくできます。

【81233】Re:キー値と属性の組の集合を良い感じに...
回答  hatena  - 20/3/17(火) 21:20 -

引用なし
パスワード
   例えば、キャラのプロパティを設定して、コレクションに登録する部分のコードが面倒なので、シンプルに1行にしたいというときは、クラスモジュールに下記のようにメソッドを追加します。

クラスモジュール Chara
--------------------
Option Explicit

Public Name As String
Public HP As Long
Public AttacK As Long
Public Defence As Long
Public Skill As String

Public Sub Init(aCol As Collection, aName As String, aHP As Long, aAttacK As Long, aDefence As Long, aSkill As String)
  Name = aName
  HP = aHP
  AttacK = aAttacK
  Defence = aDefence
  Skill = aSkill
  aCol.Add Me, Name
End Sub
-------------------

そうすると前回の回答の使用例のコードは下記のようになります。

Public Sub test1()
  Dim colChara As Collection
  Set colChara = New Collection
  
  Dim C As Chara
  
  Set C = New Chara
  C.Init colChara, "ガイ", 200, 90, 50, "兜割り"
  
  Set C = New Chara
  C.Init colChara, "トム", 300, 30, 90, "鉄壁の守り"
  
  
  Debug.Print colChara("ガイ").HP
  Debug.Print colChara("トム").Defence

End Sub

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