だるまのエクセルVBA掲示板

申し訳ございません。HPの引越しに伴い、掲示板はやめました。
過去の書き込みの表示のみできるようにしてありますが、新規の投稿は出来ません。
なお、各ページへのリンクは引越し後のHPのアドレスに変更してあります。

■

リフレクションほにゃららについて

 hoge

データNo:200

2015年09月17日(Thu) 15:29

 

http://darumaexcel.uijin.com/aboutooa/vba_limit.html
のリフレクション云々の話ですけど、例えば、VBA.Collectionクラスの
メンバ一覧とかなら、

' 参照設定: %Systemroot%\system32\TLBINF32.dll(TypeLib Information)
Dim ifInfo As TLI.InterfaceInfo
Dim mInfo As TLI.MemberInfo
With New TLI.TLIApplication ' レイトバインドの場合は、CreateObject("TLI.TLIApplication")
Set ifInfo = .InterfaceInfoFromObject(New VBA.Collection)
For Each mInfo In ifInfo.Members
Debug.Print mInfo.Name
Next
End With

とかでできますよ。

あと、リフレクションの言葉にもっとも適切なのはCallByNameですけど、
Excel VBAであれば、RunメソッドやOnTimeメソッドも近しい動きをしますし、
OnActionプロパティで設定→ExecuteメソッドとかaccDoDefaultActionメソッド
とかも、同じような役割に使えると思います。
その他、ScriptControlを使ってJScriptのエンジンを使ってevalメソッドで
実行するとかもできます。

■

Re:リフレクションほにゃららについて

だるま

データNo:207

2016年05月04日(Wed) 00:31

 

有難うございます。

今更ですみません。見落としていました。


■

Implementsほにゃららについて

 hoge

データNo:201

2015年09月17日(Thu) 15:49

 

VBAのImplementsでのメンバ実装は、C#でいうところの継承したメンバを
オーバーライドせずにnewキーワードをつけて定義するようなものなので、

' Class2(Interface)
Option Explicit

Sub aaa()
Debug.Print "Class2(Interface)"
End Sub

をClass1で実装する場合、

' Class1(Interface)
Option Explicit
Implements Class2

Private Sub Class2_aaa()
aaa
End Sub

Sub aaa()
Debug.Print "Class1"
End Sub

とかすればよいかと思います。
実装側のメンバ実装のスケルトンは、

Private Sub Interface名_メンバ名()

End Sub

と自動で作られますけど、

Private Sub Interface名_メンバ名()
メンバ名
End Sub

Sub メンバ名
' ここに処理
End Sub

をスケルトン(ひな形)と考えればよろしいかと。

ちなみに、この場合、

Dim obj As Class2
Set obj = New Class2
obj.aaa
Set obj = New Class1
obj.aaa

とかしてみると、入れ物の型ではなく、中身に応じた結果が得られます。

■

Re:Implementsほにゃららについて

だるま

データNo:204

2016年05月01日(Sun) 12:58

 

だるまです。返信がべらぼうに遅くですみません。

本当に、有難うございます。

■

Re:Implementsほにゃららについて

だるま

データNo:206

2016年05月01日(Sun) 13:59

 

http://darumaexcel.uijin.com/aboutooa/vba_limit.html
を更新しました。


■

クラスの静的メンバについて

 hoge

データNo:202

2015年09月17日(Thu) 15:58

 

http://darumaexcel.uijin.com/aboutooa/vba_limit.html
の5番で触れられている内容は、静的メンバとインスタンスメンバの話だと思いますが、
それができないから、Excel君とかであれば、ドキュメントモジュールが
その代わりに使えます。

この人たちのメンバはインスタンスメンバですけど、ブック(プロジェクト)が
開かれている間、その存在が担保されていますので。
とりわけ、ブックモジュールは、プロジェクトごとでシングルトンが
担保されているので、クラスに静的メンバが定義できないから、
シングルトンパターンの実装ができない、という問題も解消です。

ブックを保護すれば、シートもシングルトンクラスとして使えます。
4番で書かれている内容にも若干関係するのですけど、ワークシートと
グラフシートを使い分ければ、アイコンが変わるので、少しは分類できます。

※先ほどの投稿は、
http://darumaexcel.uijin.com/aboutooa/vba_limit.html
の2番に関してです。

■

Re:クラスの静的メンバについて

だるま

データNo:203

2015年09月23日(Wed) 20:16

 

だるまです。

返信が遅くてすみません。

すばらしいです!!
ありがとうございます。

■

Re:クラスの静的メンバについて

だるま

データNo:205

2016年05月01日(Sun) 13:57

 

http://darumaexcel.uijin.com/aboutooa/vba_limit.html
を更新しました。


■

Imageコントロールにjpg画像が表示できないって事ですけど

 TERUO

E-mail

データNo:198

2014年02月28日(Fri) 21:33

 

私も仕事で、一度ワークシート上にマーカー付の折れ線グラフを自動作成して、それをユーザーフォームに張り付けたイメージコントロールに表示させるマクロを書いたことがありますが、オフィス2000でしたらjpg大丈夫なはずですよ。String変数に絶対パスを設定して
其処へ表示させるグラフをjpgで格納し、LoadPictureメソッドで実行すれば問題なく動作するはずです。
以下に私が書いたコードの一部をご紹介します。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Private Sub UserForm_Initialize()
Dim chartrange As Range
ActiveSheet.Range("a11").CurrentRegion.Select
Set chartrange = Selection
Charts.Add
ActiveChart.ChartType = xlLineMarkers
ActiveChart.SetSourceData Source:=chartrange, PlotBy:=xlRows
ActiveChart.Location Where:=xlLocationAsObject, Name:="記録"
Const GRAPH_IMAGE As String = "C:\Users\user\Pictures\Graph1.jpg" 'PCに合わせて格納するパスを変更する


'グラフの存在チェック
If ActiveSheet.ChartObjects.Count = 0 Then Exit Sub

'グラフを画像として保存
ActiveSheet.ChartObjects(1).Chart.Export GRAPH_IMAGE

'画像ファイルをImageに読み込み
If Len(Dir(GRAPH_IMAGE)) > 0 Then
With Image1
.PictureSizeMode = fmPictureSizeModeStretch 'イメージコントロールに合わせて表示
.PictureAlignment = fmPictureAlignmentCenter '中央配置
.BorderStyle = fmBorderStyleNone '枠なし
.Picture = LoadPicture(GRAPH_IMAGE)
End With
'画像ファイルを削除
Kill GRAPH_IMAGE
End If
ActiveSheet.ChartObjects.Delete
テスト3.StartUpPosition = 0
Left = 0

End Sub

■

Re:Imageコントロールにjpg画像が表示できないって事ですけど

だるま

データNo:199

2014年03月02日(Sun) 10:51

 

Mac版のExcelではどうだったでしょうか?

Windows版のExcelではうまく動作するけど、Mac版のExcelではうまく動作しないということが、あるので。


■

関数オブジェクト

 げんちゃん

URL

データNo:195

2013年04月28日(Sun) 19:18

 

業務で使えないかとVBAをかじっていたので、大変助かりました。

さて、題記の件ですが、標準モジュールのプロシージャは、Runメソッドで、クラスモジュールのプロシージャはCallByNameメソッドで呼び、関数オブジェクトクラスモジュールにVariant配列で引数を保持させれば関数オブジェクトが作れると思います。

拙いですが、自作してみました。だるまさんからご覧になって、いかがでしょう?
http://www7.ocn.ne.jp/~r421/excel/Macros.zip
Functor.xlaに実装してあります。

■

Re:関数オブジェクト

だるま

データNo:196

2013年05月08日(Wed) 22:14

 

だるまです。

http://www7.ocn.ne.jp/~r421/excel/
も見ました。
一言で言うと、「すごいだろ」。
VBAは関数ポインタが無いですから。

■

Re:関数オブジェクト

げんちゃん

データNo:197

2013年05月09日(Thu) 00:34

 

ご覧いただいて光栄です。
Modern C++ Designという本にC++のテンプレートを使用した関数オブジェクトの実装があったので、同じことを試みました。
共通モジュールの関数を呼び出したときにByRef引数の戻り値が取得できないこと、戻り値があっても関数オブジェクトのアクセッサで読み出す必要があることなど、いまいちな点はありますが、「動的な関数呼び出しを使ったCommandパターン」を曲がりなりにも実現できたのではと思います。


次のページ >>