- 締切済み
powershellのwhile文での変数記述法?
前に「PowershellでExcelへデータを書き込む 」で2次元配列にデータを変換する方法を教えてもらったのですが、今回は、複数の1次元配列をpowershellのwhile文でExcelに書き込む方法についてです・・・多分こちらの方がパフォーマンス的に劣ると思われますが記述法の勉強のため。 下記のコードの途中でつまずいてしまいました。 $sheet = $excel.Worksheets.Item(1) <#セルに書き込むためのデータ#> $array1 = @("果物","リンゴ" ,"ミカン", "バナナ","ぶどう") $array2 = @("個数","10", "20","5","8") $array3 = @("売上","1500", "2000","5000","300") $i = ((gv).Name -match "^array\d+$").Count $j = $array1.Length $y = 3 $x = 3 $n = 0 while ( $n -lt $i) {$sheet.Range($sheet.Cells($y + $n, $x), $sheet.Cells($y + $n, $x + $j - 1)) = $array?;$n++} 「・・= $array?;$n++}」部の配列名を動的に指定する方法が解りません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- luka3
- ベストアンサー率72% (453/623)
原因:arrayが1から始まるのに対し、nが0から始まるため ・解決方法1 Rangeを指定するときに1を引く $sheet.Range($sheet.Cells($y + $n - 1, $x), $sheet.Cells($y + $n - 1, $x + $j - 1)) = $v ・解決方法2 nを0スタートにして、arrayを指定するときに別変数を作る for (($n=0); $n -lt $i; ($n++)) { $m = $n - 1 $v = Get-variable -Name "array$m" -ValueOnly
- luka3
- ベストアンサー率72% (453/623)
こんな感じで動きました。 for (($n=1); $n -le $i; ($n++)) { $v = Get-variable -Name "array$n" -ValueOnly $j = $v.Length $sheet.Range($sheet.Cells($y + $n, $x), $sheet.Cells($y + $n, $x + $j - 1)) = $v }
お礼
ありがとうございます。 別にwhile文ではなくfor文でもかまわないのですが下記のようにして実行すると $y = 3 $x = 3 for (($n=1); $n -le $i; ($n++)) { $v = Get-variable -Name "array$n" -ValueOnly $j = $v.Length $sheet.Range($sheet.Cells($y + $n, $x), $sheet.Cells($y + $n, $x + $j - 1)) = $v } ExcelのセルC4ではsells(4,3)から開始されます。私の方法で「・・= $array1;$n++}」とすればB3から全てarray1の内容ですがですが繰り返されます。
補足
arraayに動的値を加える方法を利用して $sheet = $excel.Worksheets.Item(1) <#セルに書き込むためのデータ#> $array1 = @("果物","リンゴ" ,"ミカン", "バナナ","ぶどう") $array2 = @("個数","10", "20","5","8") $array3 = @("売上","1500", "2000","5000","300") $i = ((gv).Name -match "^array\d+$").Count $j = $array1.Length <#配置先の先頭セル位置の指定#> $y = 3 $x = 3 <#ループで順に書き込む#> $n = 1 while ( $n -le $i) {$aw = Get-variable -Name "array$n" -ValueOnly; $sheet.Range($sheet.Cells($y + $n-1, $x), $sheet.Cells($y + $n-1, $x + $j - 1)) = $aw;$n++} とすれば正解かどうか分かりませんがExcelの所定の範囲にセットできました。
お礼
luka3さん有り難うございます。 補足投稿の準備中に行き違いなったみたいで申し訳ありません。 再度頂いたfor文参考にさせていただきます。
補足
各配列で要素数が異なることを顧慮してfor文同様while文の中で取得するようにしました。 $sheet = $excel.Worksheets.Item(1) <#セルに書き込むためのデータ#> $array1 = @("果物","リンゴ" ,"ミカン", "バナナ","ぶどう") $array2 = @("個数","10", "20") $array3 = @("売上","1500", "2000","5000","300") $i = ((gv).Name -match "^array\d+$").Count <#配置先の先頭セル位置の指定#> $y = 3 $x = 3 <#ループで順に書き込む#> $n = 1 while ( $n -le $i) {$aw = Get-variable -Name "array$n" -ValueOnly;$j = $aw.Length $sheet.Range($sheet.Cells($y + $n-1, $x), $sheet.Cells($y + $n-1, $x + $j - 1)) = $aw;$n++}