Excel VBA では、標準でImageBoxオブジェクトがありますが、これではなくVisualBasicのPictureBoxで持っている機能が使いたいのです。ExcelのUserFormにPictureBoxオブジェクトを貼り付ける方法があれば、教えて下さい。

A 回答 (1件)

VBでActiveXコントロールを作成してみたらいかがでしょうか。

    • good
    • 0

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

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

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

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

QVisualBasic2010のPictureBoxにAccessの画

VisualBasic2010のPictureBoxにAccessの画像データを表示させたい。
MSAccess2007をデータベースとして利用して、VB2010を端末としてプログラミングを行っていますが、行き詰ってしまったのでお聞きします。
DBに記録された画像データ(jpgかBitmap)を抽出してVBの画面に表示させたいのです。
やり方としては、添付ファイル型で記録されたデータをPictureBoxに表示させようと考えています。
このとき、OleDbのDatasetからPictureBoxか、あるいは構造体に格納したいのですが、やり方がわかりません・・・。文字列や数値データは普通に検索・更新・削除ができるのですが、画像データの操作がわからないのです。
そもそも添付ファイル型を使用せず、OLEオブジェクト型を使用したらよいのでしょうか??
ご教授願います。

Aベストアンサー

Access2007からは添付ファイル型というのがあるのですね
一旦ファイルに落として、PictureBoxにLoadするのではダメでしょうか?
OLE型は非公開のヘッダーがついていてファイル取り出し不能?と言われていたので、
それに比べると保存できるだけ良いのではないでしょうか。
試みに、xl2000でAccess2010のデータベースを読んで、添付ファイル型からファイルを保存してみました。
(Access2010を入手しましたが、まだほとんど使っておりません。)
何かの足しになれば幸いです。

'Microsoft Office 14.0 Access database engine Object Libraryを
'ダウンロード&インストール&参照設定要
Sub test()
Dim dbWS As DAO.Workspace
Dim dbWB As DAO.Database
Dim dbRes As DAO.Recordset
Dim myFiles As DAO.Recordset

Set dbWS = DAO.DBEngine.Workspaces(0)
Set dbWB = dbWS.OpenDatabase(ThisWorkbook.Path & "\" & "Database1.accdb")
Set dbRes = dbWB.OpenRecordset("T_my1st", dbOpenDynaset)

dbRes.MoveFirst
Do Until dbRes.EOF
With dbRes.Fields("attachedFile").Value
Set myFiles = dbRes.Fields("attachedFile").Value
Do Until myFiles.EOF
myFiles.Fields("filedata").SaveToFile ThisWorkbook.Path & "\" & myFiles.Fields("filename").Value
myFiles.MoveNext
Loop
dbRes.MoveNext
End With
Loop
dbRes.Close
dbWB.Close
dbWS.Close
End Sub

参考URL:http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=ja

Access2007からは添付ファイル型というのがあるのですね
一旦ファイルに落として、PictureBoxにLoadするのではダメでしょうか?
OLE型は非公開のヘッダーがついていてファイル取り出し不能?と言われていたので、
それに比べると保存できるだけ良いのではないでしょうか。
試みに、xl2000でAccess2010のデータベースを読んで、添付ファイル型からファイルを保存してみました。
(Access2010を入手しましたが、まだほとんど使っておりません。)
何かの足しになれば幸いです。

'Microsoft Office 14.0 Access data...続きを読む

QEXCEL VBA UserFormで困っています。

EXCEL VBA UserFormで困っています。
VBAプログラミングで以下のような現象が起こります。

開発環境  WinXP , EXCEL2003

ブックを起動するとメニューが表示され、そこからボタンを押すとuserform1が表示されるというプログラムなんですが、そのボタンを押してuserform1を起動しようとすると『問題が発生したため、  Microsoft Excel Windowsを終了します。・・・ エラー報告を送信する 送信しない』のメッセージが出て起動できない。
UserForm1.Showのステップで一旦止めてステップモードで続行すると正常に動作します。

過去に似た質問を見つけ、そのアドバイスを元に以下を試してみました。
http://oshiete.goo.ne.jp/qa/2001805.html

・エラーの発生行の特定
userform1.showの前に、userform1.label.visible=falseのように、表示、非表示を切り替える命令を出しており、どうやらその表示命令の行でつまづいている事がわかりました。
表示命令を全て消去し実行したところ、現在までは問題なく起動できています。

・on timeメソッドで時間差をつける
ラベルやボタンの表示、非表示命令行をまとめて、
Application.OnTime Now + TimeValue("00:00:01"), "ラベルボタン表示設定"
userform1.show
といった形で時間差をつけてみました。
結果として、userform1自体は立ち上がるようになったのですが、時間差で実行される"ラベルボタン表示設定"の実行時に「オートメーションエラーです。起動されたオブジェクトはクライアントから切断されました。」と出てくるようになってしまいました。

ラベルはまだ良いのですが、コマンドボタンの表示、非表示は、誤操作を防ぐ手段として非常に重要です。なんとかエラーを出さずにコード通りに起動する方法はありませんでしょうか。

EXCEL VBA UserFormで困っています。
VBAプログラミングで以下のような現象が起こります。

開発環境  WinXP , EXCEL2003

ブックを起動するとメニューが表示され、そこからボタンを押すとuserform1が表示されるというプログラムなんですが、そのボタンを押してuserform1を起動しようとすると『問題が発生したため、  Microsoft Excel Windowsを終了します。・・・ エラー報告を送信する 送信しない』のメッセージが出て起動できない。
UserForm1.Showのステップで一旦止めてステップモードで続行すると正常に...続きを読む

Aベストアンサー

>最終的な結論としては、マルチページを使用しているために起こるエラーとの事でした。
この話は、Excel2000で、Excel2003も同じ構造的なものを持っていますから、共通していると思います。

私自身としては、今回のエラーの理由は、UserForm にインスタンスのオブジェクトが乗る時に、オーバーヘッドが掛かり過ぎるからと考えています。途中で割り込みを入れるから、エラーが発生してしまいます。だから、立ち上がりの時は、必要以上に、メモリに割り込みさせないようにするぐらいしか手がないのだと考えています。

他の言語のように、Control 自身を、フォーム上に生成するという方法もありますが、Excelでは、それはとても遅いのではないかと思います。

>userform1.show
>userform1.textbox300.value=○○
>にしたいのですが、現状、userform1.showすると、そこでコードがとまってしまい、

それは無理ですね。Show の後は、UserForm 側に渡されるので、UserForm のプロパティはUserForm モジュール側からでないと変更できません。

>フォームを先にshowし、その後に操作するにはどうすればよいでしょうか?
それは、その後のコードは、「Private Sub UserForm_Initialize()」 側に渡します。

ただ、もうひとつの提案の、予めプロパティを設定しておくというのはダメですか?

面倒なことは言うまでもないですが、20個程度ならなんとかなると思いますが。
そうしたら、起動時の処理は必要ありません。他にも、方法がないわけではありませんが、今の見通しでは、あまり変わらないように思っています。

それから、

>独自のバックアップシステムというものに替えて検証してみたいです。どういったコードなのか、教えて頂けませんか?

その骨子の部分だけ書くと、こういうことです。

Backup というフォルダを予め作っておきます。以下のようにします。何だとお思いになるかと思いますが、最悪の状態は、これだけで免れるのです。それに、日にちを置いたものをバックアップを取れば、なお良いわけです。

それを、Workbook_Open ()イベントに入れておきます。Copy では、出来ません。
Excelは、キャッシュの中に入って、物理的ファイルは別にありますから、外部オートメーションでないと出来ません。5~6年、ほとんど毎日のように使っていますが、ファイルを失ったことは一度もありません。ファイルサイズは、最大のひとつは、12.2MB です。生半可に小さいものではありません。

Set objFso = CreateObject("Scripting.FilesystemObject")
 objFso.Copyfile ThisWorkbook.Path & "\" & ThisWorkbook.Name, ThisWorkbook.Path & "\Backup\" & ThisWorkbook.Name
Set objFso = Nothing

>最終的な結論としては、マルチページを使用しているために起こるエラーとの事でした。
この話は、Excel2000で、Excel2003も同じ構造的なものを持っていますから、共通していると思います。

私自身としては、今回のエラーの理由は、UserForm にインスタンスのオブジェクトが乗る時に、オーバーヘッドが掛かり過ぎるからと考えています。途中で割り込みを入れるから、エラーが発生してしまいます。だから、立ち上がりの時は、必要以上に、メモリに割り込みさせないようにするぐらいしか手がないのだと考えています...続きを読む

QEXCEL VBA COLLECTIONオブジェクトについて教えてください。

教えてください。

EXCELで3万件の商談情報があり、その情報に顧客情報をセットするようにマクロを作成しています。

顧客情報にある顧客コードをキーにしてCollectionオブジェクトを作成し、商談情報にある顧客コードを元にセットしているのですが、この顧客コードが英数の大文字と小文字が混在しています。

例えば、60000AABBと60000AaBbは違う顧客コードということになり、Collectionオブジェクトのキーに指定するとエラーとなります。
Collectionオブジェクトのキーを大文字・小文字を区別する方法はありますか?

もし、区別する方法がなければ、Collectionオブジェクト以外に何か良い方法はありますか?

Aベストアンサー

n-junです。

ご参考程度として新規Bookで試してみて下さい。

Sub try_next()
Dim myDic As Object
Dim s1 As String, s2 As String
Dim s1t As String, s2t As String
Dim s1n As String, s2n As String
Dim r As Range

Set myDic = CreateObject("Scripting.Dictionary")

s1 = "60000AABB": s1t = "鹿児島店": s1n = "001-0789-0123"
s2 = "60000AaBb": s2t = "神奈川店": s2n = "001-0123-4567"

'顧客コードをキーに、顧客名と電話番号を項目として
myDic.Add s1, Array(s1t, s1n)
myDic.Add s2, Array(s2t, s2n)

'A1~A2に顧客コードを代入
Range("A1").Resize(2).Value = Application.Transpose(Array(s1, s2))

'A列の顧客コーtどに対して、B・C列に顧客名と電話番号を代入
For Each r In Range("A1:A2")

r.Offset(, 1).Resize(, 2).Value = myDic.Item(r.Value)

Next

Set myDic = Nothing

End Sub

例えばこんな感じでしょうか?

n-junです。

ご参考程度として新規Bookで試してみて下さい。

Sub try_next()
Dim myDic As Object
Dim s1 As String, s2 As String
Dim s1t As String, s2t As String
Dim s1n As String, s2n As String
Dim r As Range

Set myDic = CreateObject("Scripting.Dictionary")

s1 = "60000AABB": s1t = "鹿児島店": s1n = "001-0789-0123"
s2 = "60000AaBb": s2t = "神奈川店": s2n = "001-0123-4567"

'顧客コードをキーに、顧客名と電話番号を項目として
myDic.Add s1, Array(s1t, s1n)
m...続きを読む

QVBAでカタカナ→ローマ字の変換を標準モジュールでどのように貼り付けしたらいいか教えてください

VBA初心者です。
佐藤陽子さんだったら、SATO YOKOとExcelで表示させたいのですが、こちらに書いてある質問と一緒だったので、標準モジュールでプログラムをコピペしましたが、上手くいきませんでした。
https://oshiete.goo.ne.jp/qa/1450971.html
恐らく、貼り付けの仕方が悪いと思うのですが、今回初めてVBAを使うため、色々調べてみてもどのようにこちらのプログラムを貼り付けしたら良いかさっぱりわかりません…。
昨日仕事で来週金曜日までに1000人ほど変換してほしいと言われ、困っています。
変換できる無料ソフトウェアもあるようですが、会社のPCのため、勝手にインストール出来ません。
知識不足で申し訳ありませんが、分かりやすくご回答いただけますと幸いです。どうぞよろしくお願い致します。

Aベストアンサー

下記URLにソースを置きました。それを、コピーして貼り付けても構いません。
http://climbi.com/b/8497/0

但し、最初の行の
Option Explicit
が2行になった場合、片方を削除してください。

QUserFormから標準モジュールのIEを制御

VBAで、標準モジュールにて呼び出したIEオブジェクトをUserForm上から
制御する方法があればご教授願います。

Sub SampleModule()

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True
objIE.Navigate "http://www.yahoo.co.jp"

UserForm1.Show

~~~~~~~~~~

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Module1.SampleModule.objIE.Navigate "http://www.google.co.jp"
↑こういう感じの解をイメージしてます。

End Sub

つまり、標準モジュールでセットしたオブジェクトを、呼び出した
フォーム上から参照したいわけです。宜しくお願いします。

Aベストアンサー

Dim objIE As Object

を削除して、

Public objIE

として、標準モジュールに登録し、

Module1.SampleModule.objIE.Navigate "http://www.google.co.jp"

を、

objIE.Navigate "http://www.google.co.jp"


にすればいいのでは。
リストボックスのダブルクリックでリストボックスの
アイテムの中のURLを選択するというように見えますが、
そのあたりはいかがですか。そのような場合は、

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
objIE.Navigate ListBox1.Text
End Sub

でもよろしいかと。


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

人気Q&Aランキング

おすすめ情報