以前の、どなたかの質問の中に「連結オブジェクトフレームにExcelファイルを表示したい。」というのを見つけました。その質問に付属するかたちとなりますが、私は、表示させたら、それをフォーム画面とレイアウト的にはほぼ同じレポートに、プレビューさせ、Excelシートの画は一時的に写した状態で印刷までもっていきたいというのが目的です。
「”SourceItem/OLE元データ名”プロパティ」などで検索すると、以下のようなコードが紹介されています。
Sub Command1_Click OLE1.Class = "Excel.Sheet" ' Set class name. ' Specify type of object. OLE1.OLETypeAllowed = acOLELinked ' Specify source file. OLE1.SourceDoc = "C:\Excel\Oletext.xls" ' Specify data to create link to. OLE1.SourceItem = "R1C1:R5C5" ' Create linked object. OLE1.Action = acOLECreateLink ' Adjust control size. OLE1.SizeMode = acOLESizeZoomEnd Sub
フレームには写すが、Excelシートの画はレコードには保存せず、別につくったTextBoxにパス名を保存するようにしています。「オブジェクトの挿入」などでレコードに保存したら、すぐに容量が重くなってしまうからであります。
上記のOLE1.SourceDoc = "C:\Excel\Oletext.xls"のところは、OLE1.SourceDoc = Me!パス名と、書き換えています。
使い方が、丁寧に解説されてないので、勝手に変な具合に使っているところがあるのではないかと思い、質問します。
現に、それが元で急にエラーが出て、ダウンしたり再起動になったりします。これは、コードのなかで本来、同居できない、干渉しあうものがあるからではないでしょうか?うまくいったり、いかなかったりは本当に厄介であります。
1.このOLE1.Classというのは、”Excel.Sheet"で、CreateObjectなどを使わずにExcelを起動させているようですが、Sheetを宣言することもなく、
また、Set xlsheet = nothingで終了させてもいませんが大丈夫なのでしょうか?
私の場合、フォームに2か所OLEフレームを配置しているので、気になります。
2.このコードの解説では、「非連結オブジェクトフレーム」を使うように案内されていますが、「非連結」にすると、今度はレポートの貼りたい箇所のコントロールに、=Forms![フォーム名]![OLE1]としても、Excelシートの画像が反映されません。なので、「連結」フレームにしています。「連結」なら、フォームの画像も次に開いたときに、フレームのなかに残りませんし、パス名だけが保存されている状態なので扱いやすくなります。
仕組みとしては、要するに
パス名のテキストボックスが空の場合は、「ファイルを開く」ダイアログで、とある格納場所のExcelシートを探しに行き、指定する。
テキストボックスに記入されたら、パス名に従って、OLEフレームにそのエリアを映し出す。(2か所)
そのフォームのコンテンツのまま、レポートに反映させて印刷までもっていく。
ただこれだけのことなくですが、半年以上分からずに困っています。どうしても不具合がつきまといます。
上記のしくみの、正しいやり方を教えてください。