hiroton
2023/07/20 (木) 18:37:00
14585@f966d
うまいこと解説してるサイト見つけてペタッとして終わりたかったんですけど見つけられないですねぇ
このような問題を起こさないためには、「アクティブな」というその瞬間によって変わるような参照を使わないようにする必要があります。そのためには、オブジェクトの親子関係をしっかり把握して、最上位の親から目的の子まで、すべてをつなげる必要があります
Range
/Cells
の場合
(Excel)Application :xls = CreateObject("Excel.application")はこのレベル
└Workbook
└Worksheet
└Range / Cells
つまり、xls.Cells
と記述すると「xls.ActiveWorkBook.ActiveSheet.Cells」と同等の結果になります
「アクティブな」参照をしないためにはWorkbook
とWorksheet
を明示してあげればいいので、例えば
xls.Workbooks(1).Worksheets(1).Cells
のような記述が考えられます
また、毎回このような記述は冗長なので、変数で置き換えたり
Dim WS As object
Set WS = xls.Workbooks(1).Worksheets(1)
WS.Cells(~)
Set WS = Nothing
With ~ End With
ステートメントを使ったり
With xls.Workbooks(1).Worksheets(1)
.Cells(~)
End With
すると良いコードになります
通報 ...