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

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

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

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

Q&A

解決済

1回答

5036閲覧

poworshellでexcelを操作する場合、既に値が入力されているセルに追記する事は可能でしょうか?

jimuma

総合スコア23

PowerShell

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

0グッド

0クリップ

投稿2018/10/19 14:18

実現したい事

powershellでexcelを操作し、セルに値を入力します。その際、既に値が入力されているセルに対して、入力されている値を上書きせずに、追記するようなセルへの入力方法を知りたいです。

バージョンと扱えるツール

具体的な挙動の検証ではなく、ソースコードの記述をするにあたっての方向性(考え方?)が分かれば問題ないのでバージョンは問いません。
また、仕事上の制限がある為、利用出来るのはpowershellとexcelであり、他のソフトウェアや開発言語は利用出来ません。

具体例

説明が長くなってしまうので恐縮ですが、スクリプトを書く事自体初心者ですので、どなたか詳しい方がいらっしゃれば是非アドバイス頂きたいです。

実現したい事の詳細としては下記のように
1、「管理台帳.xlsx」のA列からユーザ名を取得し、
2、「実機のID.txt」から「抜き出したユーザが所属しているグループ」を抜き出し
3、「管理台帳.xlsx」のB列に「ユーザが所属しているグループ」を入力したいと考えています。

「実機のID.txt」の見方ですが「<」で始まる「fruit」と「OS」がグループ名で
それ以外はユーザ名とします。つまり、
orange,plum,strawberry,appleはfruitグループに属しているユーザで
apple,linux,andoroidはOSグループに属しているユーザとします。

尚、処理の概要としては3つ目の画像のように、例えば「linux」の属しているグループを
探す場合は、「実機のID.txt」をGet-Contentで取得し一行ずつ上の行から見ていき、
「linux」ユーザが見つかったら今度はそこから上方向に「<」を探していき
該当すれば「ユーザが所属しているグループ」として取得する、ような感じです。

詳細はスクリプトをご覧ください。

一応、これでほぼ上手くいったのですが問題が発生しました。
ユーザ名「apple」のように「fruit」グループにも「OS」グループにも属しているユーザの場合、
「管理台帳.xlsx」のように一つのセルに「fruit OS」と入力出来ず、「fruit」のみに
なってしまいます。(恐らく最初に合致した「OS」グループを「fruit」で上書いている為)

そこで、「管理台帳.xlsx」のappleユーザのように、複数のグループに属しているユーザに対しては、
一つのセルに二つのグループ名を記入する方法を教えて欲しいです。

長くなり恐縮ですが、宜しくお願い致します。

イメージ説明

イメージ説明

イメージ説明

$EXCELPATH = "C:\work\ユーザ別グループ管理台帳.xlsx" $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $book = $excel.Workbooks.Open("$EXCELPATH") $sheet = $excel.Worksheets.Item(1) $TEXT = "C:\work\実機のID.txt" $DATA = Get-Content $TEXT for($col = 2; $col -le 9; $col++){ #2行目~9行目まで繰り返す $ID = $sheet.Cells.Item($col,1).Text #A列のセルに記載されているユーザ名の取得 for($i = 0; $i -lt 9; $i++){ #1行目から9行目まで繰り返す if($ID -eq $DATA[$i]){ #「$ID」と「$i」行目が等しいかチェック for($j = $i; $j -gt 0; $j--){ #「$j」に「$i」を入れて、「0」まで遡る if($DATA[$j] -match "< "){ #「$i」行目に「<」が含まれているかチェック $GROUP1 = $DATA[$j] -replace '< ','' $GROUP2 = $GROUP1 -replace ' >','' echo "$ID が所属しているグループは $GROUP2 です。" $sheet.Cells.Item($col,10) = $GROUP2 #特定のセルに、取得したセルの値を入力 break }else{ ; } } }else{ ; } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

次のスクリプトでできると思います。
当然のことながら、ここに挙げられたサンプルでしか動作テストしていませんので、実際に使っているファイルを直接書き換える前にテストをしてください。

ps1

1$excelPath = 'Excel ファイルのフルパス' 2$idPath = 'C:\work\実機のID.txt' 3 4$g = @{} 5Get-Content $idPath | Where-Object { $_ -ne "" } | Foreach-Object { 6 if ($_ -match '^<(.*)>$') { 7 $currentGroup = $Matches[1] 8 } else { 9 if ($g[$_] -ne $null) { 10 $g[$_] += "`n" 11 } 12 $g[$_] += $currentGroup 13 } 14} 15$excel = New-Object -ComObject Excel.Application 16$excel.Visible = $true 17$book = $excel.Workbooks.Open($excelPath) 18$sheet = $excel.Worksheets.Item(1) 19for ($row = 2; ; $row++) 20{ 21 $id = $sheet.Cells.Item($row, 1).Text 22 if ($id -eq "") { 23 break 24 } 25 $sheet.Cells.Item($row, 2).Value = $g[$id] 26}

投稿2018/10/19 22:27

Zuishin

総合スコア28660

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

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

jimuma

2018/10/20 07:32

有難うございます! 教えて頂いたソースコードの「$g[$_] += $currentGroup」の後ろにechoコマンドで「 $g[$_]」に 格納されている値を確認したところ「apple」のユーザに対しては「fruit」と「OS」グループが セットされていた事が確認出来たので、これで行けそうです! 改行コードを付与する条件の「if ($g[$_] -ne $null) 」が何故「apple」の所だけ合致するのか、 その前の「$Matches[1]」が何をするためなのか等、不明な点はあるのですが、 パイプやハッシュテーブルなど学習しながら理解していきたいと思います! 有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問