たびたびすみません・・・
先ほどオブジェクトのName取得で悩んでいたものは皆様のおかげで解決した
のですが、そのデータをExcelでプレビューすると一度目は処理が通っても
二度目からSelectionプロパティがNothingで帰ってくる為、エラーで落ちてしまいます。
いろいろ処理方法を変更するなど対策を試みたのですが力不足のせいか一人では解決できませんでした。
もう一度どなたかお知恵をお貸しください。
'表示
XLObj.Visible = True
For i = 1 To ObjCount
XLWB.ActiveSheet.Shapes(PictureNameG(i)).Select
'プロパティの設定
On Error Resume Next
With Selection
.Locked = False
.Placement = xlMoveAndSize
.PrintObject = True
.Locked = True
.Enabled = False
End With
On Error GoTo 0
DoEvents
Next i
XLWB.PrintOut , , nCopy, True
'プレビューを終了する
If PreviewNoClose = False Then
XLWB.Close False
XLObj.Quit
End If
'終了
Set XLWB = Nothing
Set XLObj = Nothing
> 二度目からSelectionプロパティがNothingで帰ってくる為、エラーで落ちてしまいます。
Selectionを使うのは、極力避けましょう。
それから、暗黙のオブジェクトを使うのも厳禁です。
> With Selection
たとえばコレ、Excel内でVBAとして実行する場合は、
「自分自身の選択範囲」である事が明確なので、さほど問題になりません。
しかし、外部(VBなど)から操作しようとした場合は、それが
どのオブジェクトのSelectionなのかを明示する必要があります。
XLObj.Selectionなどのようにして。
たとえば、プログラム内でExcelを3つ起動していたと仮定しましょう。
この時、「Selection」とだけ書いてあっても、どのExcelを操作すれば
よいのか、VBには分かりませんよね。
そのため、予期しない動作となってしまう可能性があるわけです。
これは、VB内でExcelを1つしか起動していなかったとしても同様です。
現在VBで開いているExcelが操作される事になるのか、それとも
別のExcelを操作すればよいのか、処理が曖昧になってしまいますから。
特に、「参照設定」していた場合、勝手に暗黙のオブジェクトを生成するため、
一見、正しく動作しているように見えますが、Excelが終了せずに
非表示のままメモリ上に残ってしまったり、あるいは、今回のように
2回目にはうまく動かなかったりといった弊害があります。
# 参照設定していなければ、暗黙のオブジェクトが生成される事も無いので、
# こうした問題は発生しなくなります。
魔界の仮面弁士さん、重ね重ねありがとうございます。m(。。;)m
ご指導の通り
With XLObj.Selection
とコードを修正するだけでエラーで落ちる事もなくなりました...
自分では気づかなかったです。
ほかのコードも修正できるところは修正させていただきました。
もっと自分で修正できるように努力していきたいと思います。
ありがとうございました。
ツイート | ![]() |