再現用のソースコード
そのままだと説明が難しかったので最初にコードを載せます。
poweshell
1Using Namespace System.Runtime.InteropServices 2 3$AP = New-Object -ComObject "Excel.Application" 4$Ap.Visible = $true 5$Bk = $Ap.Workbooks.Add() 6$Sh = $Bk.ActiveSheet 7$Sh.Range("A1:D10").Value = "test" 8 9$Ap2 = [Marshal]::GetActiveObject("Excel.Application") 10$Sh2 = $Ap2.ActiveSheet 11 12$Ap.Intersect($Sh.UsedRange, $Sh.Rows(3)).Address($false, $false) # New-Object 取得できない(エラー表示で「オーバーロードで引数が2つのものが見つからない」っとでる) 13$Ap2.Intersect($Sh2.UsedRange, $Sh2.Rows(3)).Address($false, $false) # Marshal 取得できる 14 15$Ap.Workbooks | foreach { $_.Close($false) } 16$Ap.quit() 17Remove-Variable Ap, Bk, Sh, Ap2 18[GC]::Collect()
やりたいこと
新規インスタンス(New-Object)でExcelを起動して EnableEvents を False に設定してから
指定ファイルを読取専用で開いて 特定行の条件に一致したセルからデータを取得したい。
特定行の条件に一致したセルを検索するときにUserRange外のセルは確認する必要がない為
UserRange内の指定行のセルだけ取得したかったです。
そのために Intersect を利用しようとしましたが使えませんでした。
New-Object を使用した場合Intersect は引数2つでは使えないのでしょうか?
教えて頂きたいです。
やりたいこと内の操作の理由
下記条件を満たすためです。
- 処理を行うパソコンでExcelを使用中の可能性がある
- 使用中のExcelには影響は与えたくない
- 使用中のExcelはVBAが使用されている可能性がある(イベント含み)
- 操作対象のExcelファイルにはVBAが使用されている(イベント含み)
- 操作対象のExcelファイルのVBAは動作させてはいけない
- 操作対象のExcelファイルは変更(上書き保存)してはいけない
- 操作対象のExcelファイルは共有場所にある
- 操作対象のExcelファイルはいつ別PCで利用されるか分からない
- 別PCでの作業の邪魔はしてはならない
試したこと
再現用のソースコードに記載しましたが
New-Objectで生成したExcelインスタンスでは引数が2つではIntersectが利用できませんでしたが
[Marshal]で取得したインスタンスでは問題なく利用できました。
そこからNew-Objectで生成したExcelインスタンス を [Marshal]で取得したインスタンスと同じ型に
キャストしてみようと試みましたが失敗に終わりました。
補足情報(FW/ツールのバージョンなど)
Win10
powershell V5

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/06 11:35