今だけ人気マンガ100円レンタル特集♪

VB6+SP5にて開発しております。
「クラス名.構造体名.変数名 = 値」といった感じで構造体をプロパティとして使用できればと考えているのですが、単純に構造体を定義しただけでは駄目なようです。実現は無理なのでしょうか?よろしくお願いします。

A 回答 (2件)

クラスの中に別のクラスなら入れられます。



''''''''''''''''''''
'Complexクラスモジュール

Public X As Double, Y As Double

Public Property Get Length() As Double
Length = (X ^ 2 + Y ^ 2) ^ 0.5
End Property

Public Property Get Arg() As Double
'角度
End Property

''''''''''''''''''''
'CompRectクラスモジュール

Public Z1 As New Complex
Public Z2 As New Complex

Public Property Get Size() As Double
Size = Abs((Z1.X - Z2.X) * (Z1.Y - Z2.Y))
End Property

''''''''''''''''''''
'標準モジュール

Public Rectangle As New CompRect

Sub Main()

Rectangle.Z1.X = 2
Rectangle.Z1.Y = 5
Rectangle.Z2.X = 5
Rectangle.Z2.Y = 8

Debug.Print Rectangle.Size

End Sub

単純に複素数平面上の長方形の大きさを出してくれるクラスです。
ちなみに、

クラス名.構造体名.変数名

は絶対ムリです。

クラス変数名.クラス変数名.変数名

ならOKです。
クラスモジュールはそれ自体が変数でないことを忘れないでください。
    • good
    • 1

クラスのPublicなプロパティにユーザ定義体(構造体)は使用出来ません。



これは、VBのクラスがオートメーション型と呼ばれているVariantに格納できる形式以外、メソッドやプロパティを公開できないためです。
    • good
    • 1

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

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

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

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

QVBで構造体の配列を関数に渡す方法?

構造体の配列のアドレスを関数に渡して使用したいのですが、どのようにしたら良いでしょうか?教えて下さい。

Aベストアンサー

例えば、こんな感じ
Type POINT
x As Integer
y As Integer
End Type

Sub testMain()
Dim a(3) As POINT
Dim i

a(0).x = 1: a(0).y = 10
a(1).x = 2: a(1).y = 20
a(2).x = 3: a(2).y = 30
a(3).x = 4: a(3).y = 40
Call times2(a) '2倍する
For i = 0 To UBound(a)
Debug.Print a(i).x; ","; a(i).y
Next

End Sub
Sub times2(ByRef a() As POINT)
Dim i
For i = 0 To UBound(a)
a(i).x = a(i).x * 2: a(i).y = a(i).y * 2
Next
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

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

QProperty Letについて

このようなステートメントがたくさんあります。
これはいったい何をしているのでしょうか?
Property Get と Property Setについても同様に分りません。
どなたか教えていただけないでしょうか。

Aベストアンサー

理解困難ですか?

些細な事でも、わからなかったら遠慮なく聞いてくださいね。

Property関係を熟知するVBプログラマは、ぼくの周りにも少ないです。
流れがわかっていても、どうやったら効果的/有効的になるかがわかってないのです。だから、そういう人はPropertyを使用しようともしません。
むやみやたらにPropertyを使用するのはお奨めしないけど、たくさんのサンプルプログラムを作成し、慣れない関数を多用し、研究する努力が必要だと思います。
Propertyを使用しなくても済む部分をPropertyを使用してみるとかするのもいいと思います。
作成した後、本当にPropertyは必要なのか、Propertyを使用することによって、プログラミング的に効果的であったかなどの検証をして学ぶと、より早く身に着くと思います。


むずかしい分野ですが、がんばってくださいね。

QEXCEL VBA でユーザー定義型データーをproperty get let を使って受け渡しをしたい

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょうか。
それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。

もしできるのであれば、サンプルコードを教えていただけると助かります。
よろしくお願いします。

-------------------
Class1
-------------------
Option Explicit

Private m_xx As X

Public Property Get xx() As X
xx = m_xx
End Property

Public Property Let xx(p As X)
m_xx = p
End Property

-------------------
Module1
-------------------
Option Explicit

Type X
a As Long
b As Long
End Type


Sub main1()
'個別にやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long

cc.xx.a = 5
cc.xx.b = 2

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub


Sub main2()
'yyを用意してまとめてやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long
Dim yy As X

yy.a = 5
yy.b = 2

cc.xx = yy

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub

----------------------------------------

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょう...続きを読む

Aベストアンサー

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型が値型か参照型かです。クラスのような参照型を扱う際には、LetではなくSetを使います。

[ Class1 ]
Option Explicit

Private m_xx As New X '←クラスなのでNewでインスタンスを作成しておく

Public Property Get xx() As X
Set xx = m_xx '←戻り値の設定もSetで
End Property

Public Property Set xx(p As X)
Set m_xx = p '←ここも
End Property

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型...続きを読む

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エクセルで計算すると2.43E-19などと表示される。Eとは何ですか?

よろしくお願いします。
エクセルの回帰分析をすると有意水準で2.43E-19などと表示されますが
Eとは何でしょうか?

また、回帰分析の数字の意味が良く分からないのですが、
皆さんは独学されましたか?それとも講座などをうけたのでしょうか?

回帰分析でR2(決定係数)しかみていないのですが
どうすれば回帰分析が分かるようになるのでしょうか?
本を読んだのですがいまいち難しくて分かりません。
教えてください。
よろしくお願いします。

Aベストアンサー

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるための指数表記のことですよ。
・よって、『2.43E-19』とは?
 2.43×1/(10の19乗)で、
 2.43×1/10000000000000000000となり、
 2.43×0.0000000000000000001だから、
 0.000000000000000000243という数値を意味します。

補足:
・E+数値は 10、100、1000 という大きい数を表します。
・E-数値は 0.1、0.01、0.001 という小さい数を表します。
・数学では『2.43×10』の次に、小さい数字で上に『19』と表示します。→http://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98
・最後に『回帰分析』とは何?下の『参考URL』をどうぞ。→『数学』カテゴリで質問してみては?

参考URL:http://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90

★回答
・最初に『回帰分析』をここで説明するのは少し大変なので『E』のみ説明します。
・回答者 No.1 ~ No.3 さんと同じく『指数表記』の『Exponent』ですよ。
・『指数』って分かりますか?
・10→1.0E+1(1.0×10の1乗)→×10倍
・100→1.0E+2(1.0×10の2乗)→×100倍
・1000→1.0E+3(1.0×10の3乗)→×1000倍
・0.1→1.0E-1(1.0×1/10の1乗)→×1/10倍→÷10
・0.01→1.0E-2(1.0×1/10の2乗)→×1/100倍→÷100
・0.001→1.0E-3(1.0×1/10の3乗)→×1/1000倍→÷1000
・になります。ようするに 10 を n 乗すると元の数字になるた...続きを読む

QVB6 ClassにてEnum(列挙型)のうまい使い方

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをしているわけですが、
Class(Dll)とExeは別プロジェクトで生成しており、
Dllはバイナリ変換、デバッグはExeを実行するように設定済です。
これでActiveXDLLプロジェクトで「開始」をすると、Exeを実行してくれます。

Exeのプロジェクトから、
「開始」・ステップ実行して確認しましたが、
正常に動作しているようです。(記述した文がそれぞれ機能しているという意味で)

ActiveXDLLプロジェクトから、
「開始」後、「停止」をして、Dllを上書きしようとすると、
「書込みできません。"~DllのPath~"」とMsgboxのBouttonのでいうvbMsgBoxStyle=vbCriticalの形式で、
Msgboxが表示されてしまいます。
どうやらExeがDLLを離していないのでしょうか?
もちろん列挙型を設定していないDLLの場合ですと、上書きは可能です。
(他にも上書きできないパターンを見つけましたが、話が脱線するので割愛します。もしご存知でしたら、併せて教えて頂くと幸いです。)


困っている点としては、
1 デバッグする上で、Dll(書出)⇔Exe(開始)を繰り返したく、都度プロジェクトを閉じて、開いてDLL書出しするのは、非効率。
(DLLを書き出して、インターフェースを変えてしまえば、Exeはリコンパイルが必要なので、あんまり意味ないかも・・・とも)

2 読み取り専用プロパティを作って、Initializeで初期値を設定してしまう方法を考えたが、非常にかっこ悪いし、運用が大変。

3 1を我慢したとしても、作成したDLLはCOM+に登録して、WebサーバでASPから使用するつもりなので、DLLを離してくれないと、無駄なプロセス動き続けてしまう(?)→未テスト

です。


いろいろとツッコミどころがあるかもしれませんが、
忌憚なくご意見下さい。


---Class-(test_Class)----
'列挙宣言
Public Enum Chiiki
Hokkaidou = 0
Aomori = 1
Akita = 2
End Enum

'プロパティ値を格納しておく変数
dim aaa as integer

'プロパティでEnum宣言した型を引数に指定します、
Public Property Get Shusshin() As Chiiki
Shusshin = aaa
End Property
Public Property Let WindowState(ByVal NewValue As Chiki)
aaa = NewValue
End Property
---Class-End--------------------

---Exe-----------------
'Classは参照設定にて
'参照設定にしている理由としては、インテリセンスでロパティ・メソッド等を利用したいから。開発側の怠慢?

Sub a
'Class宣言
Dim a_class as test_Class
Set a_class = New test_Class

'プロパティ設定 ↓ = と打つと、Classの列挙で設定した値がプルダウン
a_class.WindowState = Aomori

'プロパティ値表示(処理自体に意味無し)
'「1」 と表示される
Msgbox a_class.WindowState

'Class開放
Set a_class = nothing

End sub
---Exe-End----

へっぽこPGです。
今まで私の質問にご回答を頂いた方々、改めてお礼申し上げます。

最近VB6でActiveXDLLにて、DLLを作り始めました。
Classについて勉強を始めたばかりで、
実現できそうな機能と実現できない力量のギャップに苦労しています。

さて、いろいろと便利なDLLを作ってやるぞ!と意気込み、
ExeからDLLを参照してプロパティに値を設定する時に、
インテリセンスが出るようにしたく、ClassにEnum(列挙型)を使うやり方を見つけましたが・・・・。

その先困ってます。

VB6でデバッグをし...続きを読む

Aベストアンサー

VB6が DLLを離していないためですよ
VB6のインスタンスが2つある状態なのですよね
VB6-ActiveXとVB6-TextExeが起動している状態で
VB6-TestEXEが参照設定のため DLLをつかみっぱなしになっています
DLLが開発途上なら プロジェクトグループで開発したほうが良いと思います
DLLプロジェクトとテスト用EXEプロジェクトを1つのグループにして開発orデバッグします

どちらでも良いですからプロジェクトを開いて
ファイル > プロジェクトの追加 で他方のプロジェクトを追加します
テスト用EXEプロジェクトに参照設定をして開発します

DLL側の修正はそのままコードウィンドウを開いて編集します
DLLファイルの作成し直しは
プロジェクトウィンドウで DLLプロジェクトをアクティブにして
ファイルメニューからDLL作成をします

テストEXEのデバッグには プロジェクトウィンドウでEXEプロジェクトをアクティブにしてからデバッグ実行などをします

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

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

Qユーザー定義型変数の一括初期化

ユーザー定義型の変数を初期化する場合、
各エレメントごとに初期化をすればいいのですが、
C言語のmemset()の様に、一括で初期化をする方法はありますか?

Aベストアンサー

空のユーザー定義型変数を代入してやればよい。

Public sub EraseTypeHoge(byref Data as TypeHoge)
Dim nul as TypeHoge
Data = nul
end sub


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

人気Q&Aランキング