Excel VBA質問箱 IV

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

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


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

【74956】クラスモジュール内のユーザ定義型変数について KJ 13/10/31(木) 17:37 質問[未読]
【74957】Re:クラスモジュール内のユーザ定義型変数... γ 13/10/31(木) 21:42 発言[未読]
【74958】Re:クラスモジュール内のユーザ定義型変数... Abyss 13/11/1(金) 1:32 発言[未読]
【74979】Re:クラスモジュール内のユーザ定義型変数... KJ 13/11/5(火) 9:24 お礼[未読]
【74978】Re:クラスモジュール内のユーザ定義型変数... KJ 13/11/5(火) 9:06 お礼[未読]

【74956】クラスモジュール内のユーザ定義型変数に...
質問  KJ  - 13/10/31(木) 17:37 -

引用なし
パスワード
   はじめまして。

現在、あるデータを(ある種の)ツリー構造にするため、
Excel2007のVBAでコーディングをしているのですが、
どうしても実現できないので、意見をお借りしたいと思い、
投稿させていただきました。

構築したいデータ構造とは、
各ノードに対して、左と右の要素をもち
親ノード(以下Rootとする)に対して
左の要素には、ユーザ定義型で準備した変数に、
右の要素には、Rootと同じ構造をもつか、データがない状態、
ということを行いたいのです。

また、データの追加は、新規のデータを左の要素にもち、
これまでのツリーを右の要素(子要素)にもつ、新たな


現在のコードを簡略化させたコードが以下になります

================ 標準モジュール Module1 =====================
Public Type SomeType
  num As Long
  chars As String
End Type

================ クラスモジュール Class1 ====================
Dim typeValue As SomeType

Dim childObj As Class1

Dim depth As Long

Private Sub Class_Initialize()
  depth = 0
  With typeValue
    .num = 0
    .chars = ""
  End With
End Sub

Public Function createNestObj(childValue As SomeType) As Class1
  
  Dim newValue As New Class1
  
  With newValue
    
    With .typeValue
      .num = childValue.num + 1
      .chars = childValue.chars & "a"
    End With
    .depth = Me.depth - 1
    Set .childObj = Me
    
  End With
  
End Function

========================= 以上 ==========================

このようにしたときに、
  With .typeValue
の箇所で、コンパイルエラー
「メソッドまたはデータ メンバが見つかりません」
が発生してしまいます。
宣言のDimをPrivateにしても同じコンパイルエラーが発生し、
また、Publicにすると
「定数、〜〜、ユーザー定義型および〜〜はオブジェクトモジュールのパブリックメンバとしては使用できません。」
と出てしまいます。


具体的なイメージとしては、
1+1+1+1

(1+(1+(1+(1_$))))
としたいです。
(+と_は2つの子要素をもつノード、$は要素なし:Nothing、
カッコ1組で1つのオブジェクト、"1"には実際には複数の情報をもっている)

現在でもクラスモジュールの数が多く、ごちゃごちゃしてきているのと、
(標準モジュールの量はまだすっきりしています、)
計算速度が求められる処理なので、
2つのクラスモジュールを費やして実現することはできるだけ避けたいです。
(基本はJava使いなので、まだJavaとのクラスの違いに馴染めずにいます。)

改善・改善策でなくとも、全然違うアプローチからでもよいですので、
意見をいただけたらと思います。

よろしくお願いいたします

【74957】Re:クラスモジュール内のユーザ定義型変...
発言  γ  - 13/10/31(木) 21:42 -

引用なし
パスワード
   SomeType もClassにしてしまったらどうでしょうか。

【74958】Re:クラスモジュール内のユーザ定義型変...
発言  Abyss  - 13/11/1(金) 1:32 -

引用なし
パスワード
   ご説明のイメージがよく浮かびませんが、
文法としてのクラスは、Propertyを使って
以下のようにすれば良いと思います。

'----<クラスモジュール>----
Private mTypeValue As SomeType

Public childObj As Class1
Public depth As Long

Private Sub Class_Initialize()
  ' 無意味
  'depth = 0
  'With typeValue
  '  .num = 0
  '  .chars = ""
  'End With
End Sub

Public Property Let typeValue(RHS As SomeType)
  mTypeValue = RHS
End Property

Public Property Get typeValue() As SomeType
  typeValue = mTypeValue
End Property

' ↓↓ このメソッドって未完成品??

Public Function createNestObj(childValue As SomeType) As Class1

  Dim newValue As New Class1
  With newValue
    With .typeValue
      .num = childValue.num + 1
      .chars = childValue.chars & "a"
    End With
    .depth = Me.depth - 1
    Set .childObj = Me
  End With

End Function
'----------------

【74978】Re:クラスモジュール内のユーザ定義型変...
お礼  KJ  - 13/11/5(火) 9:06 -

引用なし
パスワード
   ▼γ さん:
>SomeType もClassにしてしまったらどうでしょうか。

レスが遅くなってしまい申し訳ございませんでした。

やはり、SomeTypeもクラスモジュールにしてしまったほうがいいのかもしれませんね。

VBAでは、(Javaでいう)パッケージの概念がないので、
xlsファイル内のクラスモジュールのファイルの整理ができないのが嫌でしたので、
どうにかユーザー定義型にできないものかと思っていましたが、
(標準モジュール内には1つのモジュール内に複数の定義型をもてますが、
クラスモジュールには1つしかクラスがもてないので、混乱しがちになったので。)

クラスモジュールであったらうまくいきそうなのはわかっていましたので、
クラスモジュールでコーディングする方向で進めていきたいと思います。

ありがとうございました。

【74979】Re:クラスモジュール内のユーザ定義型変...
お礼  KJ  - 13/11/5(火) 9:24 -

引用なし
パスワード
   ▼Abyss さん:

レスが遅くなってしまい、申し訳ございませんでした。

>ご説明のイメージがよく浮かびませんが、
>文法としてのクラスは、Propertyを使って
>以下のようにすれば良いと思います。
>
>'----<クラスモジュール>----
>Private mTypeValue As SomeType
>
>Public childObj As Class1
>Public depth As Long
>
>Private Sub Class_Initialize()
>  ' 無意味
>  'depth = 0
>  'With typeValue
>  '  .num = 0
>  '  .chars = ""
>  'End With
>End Sub
>
>Public Property Let typeValue(RHS As SomeType)
>  mTypeValue = RHS
>End Property
>
>Public Property Get typeValue() As SomeType
>  typeValue = mTypeValue
>End Property

実は、スレッドを立てた後に気付いたことですが、
ユーザー定義型内に、オブジェクト(クラスインスタンス)を含んでおりまして、
たとえば、
Public Type SomeType
  dim innerObj as Object
  dim depth as Long
End Type
などとしていて、一度はプロパティでの作成も試みたのですが、
withブロックを使用するとうまくいかないこともあり、
(もちろん、Setステートメントは使用していました。)
まずは1つ目の問題として、ご質問させていただいた次第です。
(上の文法が間違っているかもしれません。
休み明けで記憶が定かではない状態ですので、ご容赦ください。)

もう一度構造を見直し、
「きれいに見せようとする、整理された状態にする」ことより、
「まず動くもの」としてコーディングしていきたいと思います。


>
>' ↓↓ このメソッドって未完成品??
>
>Public Function createNestObj(childValue As SomeType) As Class1
>
>  Dim newValue As New Class1
>  With newValue
>    With .typeValue
>      .num = childValue.num + 1
>      .chars = childValue.chars & "a"
>    End With
>    .depth = Me.depth - 1
>    Set .childObj = Me
>  End With
>
>End Function
>'----------------
上記で記したものは、確かに未完成品です。

一応、社内業務内での躓きに関して、ご質問させていただきましたので、
(社内の周囲に、これらについて詳しい人がいなかったため)
同様の現象が生じる状況を再度作成させていただいた次第です。
(それに、他の箇所もコード量が多く、簡潔に質問させていただくにあたり、
このような処置が必要であったと考えたため、意味を正しく持たないコードで
質問させていただきました。)

結局は、ユーザー定義型を使用してきれいに(整理されているように)見せたい
一心で今回の質問をさせていただきましたので、
まずは(Typeを使用せずに)正常に動作するものを(多少見づらくても)作成し、
それから手直しの時間があれば、今回の問題についての再考察を
しようと思います。

貴重なお時間、ありがとうございました。

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