質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

16031閲覧

PowerShell: Excelブック検索時の条件を指定したい

退会済みユーザー

退会済みユーザー

総合スコア0

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2016/02/06 13:51

編集2016/03/12 07:46

皆様、宜しくお願い致します。

###前提・実現したいこと

文字通り、Excelブックを開いて、テキスト検索を
行いたい。
このとき、完全/部分一致、数式/値、半角/全角等の
検索条件を指定したい。

###発生している問題・エラーメッセージ

検索条件の指定方法がわからない。
参考にしたサイトより、FindとFindNextの引数として、何らかの書式で
指定すれば好いと思うのですが・・・・。

エラー1:

"FindNext" のオーバーロードで、引数の数が "9" であるものが見つかりません

エラー2:

Range クラスの FindNext プロパティを取得できません。 発生場所 E:\GitRoot\PS1\test_val.ps1:65 文字:13 + ${FindResult} = $SheetName.Cells.FindNext(${FindResult}) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], COMException + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException HRESULT からの例外:0x800A01A8 発生場所 E:\GitRoot\PS1\test_val.ps1:69 文字:18 + if ( ${FindFirst}.Address() -eq ${FindResult}.Address() ) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationStopped: (:) [], COMException + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

ポイントとなる処理:

powershell

1 ${first} = ${result} = ${ws}.Cells.Find(${word}) 2 while (${result} -ne $null) { 3 echo "${childPath}[${wsName}][$(${result}.Row), $(${result}.Column)] : $(${result}.Text)" 4 ${result} = ${ws}.Cells.FindNext(${result}) 5 if (${result}.Address() -eq ${first}.Address()) { 6 break 7 } 8 }

こんな感じ??:

powershell

1 2## After 3set-variable -name After -value "`$A`$1" -option constant 4 5## LookIn 6set-variable -name xlFormulas -value -4123 -option constant 7set-variable -name xlValues -value -4163 -option constant 8#xlComments 9 10## LookAt 11set-variable -name xlWhole -value 1 -option constant 12set-variable -name xlPart -value 2 -option constant 13 14## SeachOrder 15set-variable -name xlByColumns -value 2 -option constant 16set-variable -name xlByRows -value 1 -option constant 17 18## SearchDirection 19set-variable -name xlNext -value 1 -option constant 20set-variable -name xlPrevious -value 2 -option constant 21 22## MatchCase (True or False) 23set-variable -name MatchCase -value $false -option constant 24 25## MatchByte (True or False) 26set-variable -name MatchByte -value $false -option constant 27 28## SearchFormat (True or False) 29set-variable -name SearchFormat -value $false -option constant 30 31 32$LookIn = $xlValues #値 33$LookAt = $xlPart #部分一致 34$SeachOrder = $xlByColumns #列方向に検索 35$SearchDirection = $xlNext #全方向に検索 36 37Find(${word},$After,$LookIn,$LookAt,$SeachOrder,$SearchDirection,$MatchCase,$MatchByte,$SearchFormat)

###結果(解決)

powershell

1 2 ${FindFirst} = ${FindResult} = ` 3 ${SheetName}.Range(${CellRange}).Find(${xText},${FirstCell},${LookIn},` 4 ${LookAt},${SeachOrder},${SearchDirection},${MatchCase},${MatchByte},` 5 ${SearchFormat})

${SheetName} : シート名。オープンしたブックから取得するか、事前設定。
${CellRange} : セル範囲。お約束。Rangeの代わりにCellsでも好いと思うけど、範囲絞る方が?!
${xText} : 検索語句
${FirstCell} : 検索開始位置となるセル番号。
${FindFirst} : 初回検索結果を格納。取得できない時はNull。AddressやらRowやら全部入り。
${FindResult} :二回目以降の検索結果を格納。取得できない時は・・・以下同文。

###参考にした情報

PowerShellで複数のExcelファイルを一括検索する http://qiita.com/nejiko96/items/b423e2dda90181ef524e 条件に当てはまるセルを検索する(Find/FindNext/FindPreviousメソッド) https://www.moug.net/tech/exvba/0050116.html

###補足情報(言語/FW/ツール等のバージョンなど)

Name Value


PSVersion 5.0.10586.63
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.63
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

参考にされたmougにFindメソッドが掲載されてますが、Excel特有の定数がそのままでは使えません。

Excelで例えば"Something"を完全一致で探すとこんな感じになります。

lang

1Sub 探す() 2 探し物 = "Something" 3 アドレス = Sheets(1).Cells.Find(探し物, , , xlWhole).Address 4 MsgBox アドレス 'C3が返る 5End Sub

で、PowerShellに移植する際はxlWholeを1に直します。

つまり、定数の値が何であるかという情報を調べる必要がありますね。

Excel VBAのVBEditorでCtrl+Gを押すとイミディエイトウインドウが表示されるので、「?xlWhole」と入力してEnterしてみると1が返ります。

「?xlPart」なら2が返ります。

そうやって、mougに書いてある定数を数字に直してPowerShell側で書き換えるとうまく動くと思います。

投稿2016/02/06 14:12

編集2016/02/06 14:15
thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/07 04:56

コメントいただきまして、ありがとうございます。 定数を数値にすることができました。 一歩?前進したように思います。
guest

0

ベストアンサー

解決しました。

ごく単純に、$Afterを、検索開始したいセル番号にするだけでした。
(A1から開始なら、A1)

投稿2016/03/12 07:24

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問