【無料配信♪】Renta !全タテコミ作品第1話

EXCEL2010にて、VBAでプログラミングしております。

クラスモジュールを用いてクラスを自分で作成して、
作成したクラスを標準モジュール内で使用するのは普通ですが、

クラスモジュールを用いてクラスを自分で作成して、
作成したクラスを、更に別のクラスモジュールの中に記述することは可能ですか?

このようなクラスの中に別のクラスが入っている状態(クラスの入れ子)で、
まともに動くものでしょうか?

詳しい方、御教授よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

動きます。


標準モジュール内で標準モジュールを利用することも可能ですし、
クラスは標準モジュール内で利用することが当たり前や前提ということはありません。

但し、標準モジュールと違うところは、クラスが一旦破棄されれば、クラス内で利用している
クラスも操作できなくなるという点です。
(デストラクタで内部のクラスは解放すべきだし、改めてインスタンス化するなどの必要が出てくる)
それだと困るなら、内部で利用するものは、スタティックなクラスとして作るなど、考えが
必要です。(いわゆるシングルトンな設計でクラスを作るなど)
    • good
    • 0
この回答へのお礼

早速の御回答、
どうも有り難うございます。

>>但し、標準モジュールと違うところは、クラスが一旦破棄されれば・・・
以降のくだりは、
今の私の知識(技量?)では、少々難しく
すぐに理解は出来ないのですが、
情報収集して
勉強してみようと思います。

お礼日時:2014/05/22 20:05

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

QVBAでfor文の中で、continueしたい

お世話になります。
VBAのfor文の中で、ある条件に合致したら、for の先頭に戻りたいのですが、
方法が分かりません。

VB.net 等の「 Continue For」に当たるものは、VBAに
ないのでしょうか?

何卒宜しくお願いします。

Aベストアンサー

Continue For は昔の VB6 までに物には実装されていませんね VB6 使いの私は知らなかった

for の先頭に戻りたいのではなく、 Next の直前に飛びたいのですよね?
幸いにも VBA には Goto ステートメントがありますので

Sub Sample1()
For i = 1 To 10
If 意除外条件 Then GoTo Next_no_mae

通常の総理

Next_no_mae:

Next i

End Sub

じゃダメですか?
これなら For の直後に飛ぶ事も可能ですが

もしくはこれぐらいしか対処方法はないのでは?
Sub Sample2()

For i = 1 To 10
If 除外条件 Then
Else
通常の総理
End If
Next i

End Sub

Qクラスに配列を渡す方法

こんにちは、VB.NET初心者です。
メインプログラムからクラスに配列を渡したいのですが、どうやって渡せばいいのかわかりません。
一応、いろいろなサイトやMSDNを覗いたのですが、よく分かりませんでした。
よろしければ、教えてください。環境はVB2005です。

下記のは現在書いているソースなのですが、この場合エラーがでます。

メインプログラム
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
 Dim abc() as integer
 ’配列に何かを入れる処理を記述
 ’何個の要素が入るかはわかりません。通るときによって変わります。
 Dim 123 As New clsAAA
 123.ABC = abc

 123.処理1()
End Sub


clsAAA
Private pABC() As Integer

Public Property ABC() As Integer
 Get
  Return pABC
 End Get
  Set(ByVal value As Integer)
  pABC = value
 End Set
End Property

こんにちは、VB.NET初心者です。
メインプログラムからクラスに配列を渡したいのですが、どうやって渡せばいいのかわかりません。
一応、いろいろなサイトやMSDNを覗いたのですが、よく分かりませんでした。
よろしければ、教えてください。環境はVB2005です。

下記のは現在書いているソースなのですが、この場合エラーがでます。

メインプログラム
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
 Dim abc() as integer
 ’配列に...続きを読む

Aベストアンサー

Public Property ABC() As Integer() ←ココ
 Get
  Return pABC
 End Get
  Set(ByVal value() As Integer) ←ココ
  pABC = value
 End Set
End Property

配列を渡すのにプロパテイが配列になってないのでエラーになります。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QVBAで配列引数を値渡しできない理由

Sub TestB(ByVal MyArray() As Integer)

のようにして、
配列引数をByValで渡そうとすると
エラーが出てしまいます。

http://vba.doorblog.jp/archives/51291826.html

このページにあるように
variantとして渡せば
エラーは出ないのですが
byrefとして扱われてしまいます。

なぜVBAでは配列を値渡しすることができないのでしょうか?
何が問題なのでしょうか?

Aベストアンサー

VBで配列を引数で渡す場合、先頭のアドレス(住所)を渡しています。
(C言語のポインター)
その為、サブルーチンの引数の型は、その「アドレスを表す変数」が値渡しか参照渡しかを表すことであって、配列の中身を値渡しか参照渡しかを指定している訳ではありません。
つまり、
Sub TestB(Byref MyArray() As Integer)
※MyArray変数がByref
Sub TestB(Byval MyArray As Variant)
※MyArray変数がByval

詳しくは、以下のサイトを参考にしてみてください。
https://msdn.microsoft.com/ja-jp/library/eek064h4.aspx

QエクセルのVBAでオブジェクトの配列変数は使えますか?

VBですとオブジェクトの配列変数というか、コピーしたときに自動的に配列になってしまいますが、エクセルのVBAの場合でオブジェクトの配列変数は使えますか?
なにをしたいかというと、ボタンが多すぎて一つ一つにプログラム定義は面倒、そこで配列にしてまわすことにしたいのですが、エクセルで可能でしょうか。
どなたかお願いします。

Aベストアンサー

こんにちは。maruru01です。
コレクションというものがあります。複数のオブジェクトをコレクションにまとめ、インデックス値で識別出来ます。
以下に例を示します。
フォームにテキストコントロールが10個(Text1~Text10)あるとします。

***宣言部に***
Private myCollect As New Collection

***例えばフォームのInitializeイベントに
  With myCollect
    .Add Item: = Text1
    .Add Item: = Text2
      :    :
    .Add Item: = Text10
  End With

とコレクションを作成します。
そしたら、下のようにインデックス値でコントロールを識別出来ます。

'Cells(1, 1)~Cells(1, 10)にText1~Text10の値を順にセットする
For i = 1 To 10
  Cells(1, i) = myCollect(i).Value
Next i

では。

こんにちは。maruru01です。
コレクションというものがあります。複数のオブジェクトをコレクションにまとめ、インデックス値で識別出来ます。
以下に例を示します。
フォームにテキストコントロールが10個(Text1~Text10)あるとします。

***宣言部に***
Private myCollect As New Collection

***例えばフォームのInitializeイベントに
  With myCollect
    .Add Item: = Text1
    .Add Item: = Text2
      :    :
    .Add Item: = Text10
  End With

とコ...続きを読む

Q定数配列の書き方

VB6で定数を定義する場合は次の通りです。

  Const strTest As String = "TEST"

では、定数配列を定義する場合はどのように書けばいいのでしょう?

  Const astrTest() As String = Array("A", "B", "C")      '→NG
  Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG

いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。

どのように書けばいいのでしょうか?

それとも定数を配列で定義するのは無理なんでしょうか?

Aベストアンサー

残念ですが、VBでご希望のことをすることはできません。

Q他言語で言うcontinue文

他言語で言うcontinue文に相当する命令はVBに用意されているのでしょうか?

continue文とはループ中の後続の処理をやめループの先頭に戻るという命令です。

なんか探したけど無かったもので…。どんな言語にも用意されてそうな基本的な命令なので質問してみました。

バージョンは
Winエクセル2002 SP3
VBA Retail:6.4.8869, Version:9969
です。基本エンジンはVB6です。

よろしくお願いします。

Aベストアンサー

> continue文の解説でも、貴方のご指摘の動作(ループの先頭に戻る)はしているようには思えません。

ループの最後へジャンプという感じですね。
VBなら、Nextへ飛ばすのと同じです。

For i = 1 To 5
    If i = 3 Then goto Next_i
    Debug.Print i
Next_i:
Next i

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング