質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

1240閲覧

エクセルVBAで実装したスタックにrangeオブジェクトを格納したい

fu_3823

総合スコア81

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/08/01 07:33

VBAでスタックを実装しました。
そのスタックにRangeオブジェクトを格納したいのですが、うまくいきません。
スタックのpushとpopの部分は下記のように書きました。

VBA

1'Stack classモジュール 2 3Private arr() As Variant 4Private size As Long 5 6Private Sub Class_Initialize() 'コンストラクタ 7 ReDim arr(0) 8 size = 0 9End Sub 10 11Public Sub push(item As Variant) 12 size = UBound(arr) + 1 13 ReDim Preserve arr(size) 14 15 Dim valueType As Long 16 valueType = VarType(item) 17 18 Select Case valueType 19 Case vbObject, vbDataObject, vbUserDefinedType 20 Set arr(size) = item 21 Case Else 22 arr(size) = item 23 End Select 24End Sub 25 26Public Function pop() As Variant 27 If size = 0 Then 28 Err.Raise 1001, Description:="スタックは空です" 29 End If 30 31 Dim valueType As Long 32 valueType = VarType(arr(size)) 33 34 Select Case valueType 35 Case vbObject, vbDataObject, vbUserDefinedType 36 Set pop = arr(size) 37 Case Else 38 pop = arr(size) 39 End Select 40 41 size = size - 1 42 ReDim Preserve arr(size) 43End Function 44 45Function length() As Long 46 '省略 47End Function 48 49Public Function getStack() As Variant 50 '省略 51End Function 52

このStackオブジェクトに以下のようにRangeオブジェクトを格納しようとしました。

VBA

1Public stk As Stack 2 3Sub main() 4 5  Dim current As Range 6 7  Set stk = New Stack 8  Set current = Range("B3") 9  current.Select 10 stk.push current.Offset(0, 1) 11 current = stk.pop() 12 current.Select 13End Sub

これで、スタックに格納できているように見えるのですpopしたときに何も取り出せていないようです。
スタックの実装にある
valueType = VarType(arr(size))
の'valueType'の値が'0'になっていました。これは、スタックにpushされたオブジェクトは空ということだと思いますが、手詰まりでここからどうして良いかわかりません。
どこをどう直すと良いのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vann_2921

2021/08/01 08:09

rangeはオブジェクト型なのでvariant型には入れられないのではないでしょうか? 試しにvariant型の変数にrangeを代入してどのような値になるか確認してみてください。 おそらく暗黙の型変換が行われてrange.valueの値が入るのではないでしょうか? 上記コードのB3セルに何か適当な値を入れてみてもいいかもしれません。
fu_3823

2021/08/01 10:58

仰るとおりでした。 range.valueの値が入っています。 とすると、Stack.pushの引数にrangeオブジェクトを投げて、それ格納し、popなどで扱うにはどうするとよいのでしょう。Stack.pushの引数の型をrangeにしても同じでした。
guest

回答1

0

ベストアンサー

vba

1Set current = stk.pop()

投稿2021/08/01 11:50

jinoji

総合スコア4592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fu_3823

2021/08/01 12:11

基本的なことでした。でも、たぶん気がつけなかったと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問