0

私がここで達成しようとしていることについて助けを得たいと思っています。

$ActiveUsers と $InactiveUsers の 2 つの配列があり、それぞれに 4 つのフィールドと次のデータがあります

$ActiveUsers = fahe532|Allyson Sullivan|34563|Cain,Ashley J
               pers274|Martha Walsh|53732|Mckenny,Josh
               fgh8458|Kayla Benson|95463|Trot,Cook K
               ndcf846|Sam Huff|56737|Mcghee,John
               vdfg456|Mark Jones |67843|Hart,Josh W
               fasf345|Amber Sean|24678|John,Kneel G

$InavtiveUsers = fasd034|Colin Hart|35473|David, Casper
                 aertp56|Andy Matthews|56849|Debby, Gould K
                 ahshb86|Mark Michael|46848|Ty, Justin H
                 gkr5057|Josh Meeker|56848|Ashley, Rhonda R
                 irrk106|Tom Mortin|64838|Becks, Alan
                 eqer348|Nathan Willis|469894|Baker ,John T

今、$ActiveUsers から各行を取得して、作成中の Excel ファイルに追加しようとしています。$InactiveUsers の各行に対して同じことを行い、それらを新しい Excel ファイルに追加しました

2 つの配列を 2 つの Excel ファイルに追加する代わりに、要件にわずかな変更がありました。すべてを 1 つの Excel ファイルに入れる必要があります。私がすべてを書いている1つのExcelファイル。

$InactiveUsers から取得した行を強調表示して、2 つの配列を同時にループし、行を 1 つの Excel ファイルに書き込む方法はありますか? 以下、今まで書いたもの

$ExcelObject = new-Object -comobject Excel.Application  
$ExcelObject.visible = $false 
$ExcelObject.DisplayAlerts =$false
$date= get-date -format "yyyyMMddHHss"
$strPath1="o:\UserCert\Active_Users_$date.xlsx" 
if (Test-Path $strPath1) {  
  #Open the document  
$ActiveWorkbook = $ExcelObject.WorkBooks.Open($strPath1)  
$ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)  
} else {  
# Create Excel file  
$ActiveWorkbook = $ExcelObject.Workbooks.Add()  
$ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)  

#Add Headers to excel file
$ActiveWorksheet.Cells.Item(1,1) = "User_Id"  
$ActiveWorksheet.cells.item(1,2) = "User_Name" 
$ActiveWorksheet.cells.item(1,3) = "CostCenter"
$ActiveWorksheet.cells.item(1,4) = "Approving Manager"
$format = $ActiveWorksheet.UsedRange
$format.Interior.ColorIndex = 19
$format.Font.ColorIndex = 11
$format.Font.Bold = "True"
} 
#Loop through the Array and add data into the excel file created.
foreach ($line in $Activeusers){
     ($user_id,$user_name,$Costcntr,$ApprMgr) = $line.split('|')
      $introw = $ActiveWorksheet.UsedRange.Rows.Count + 1  
      $ActiveWorksheet.cells.item($introw, 1) = $user_id  
      $ActiveWorksheet.cells.item($introw, 2) = $user_name
      $ActiveWorksheet.cells.item($introw, 3) = $Costcntr
      $ActiveWorksheet.cells.item($introw, 4) = $ApprMgr 
      $ActiveWorksheet.UsedRange.EntireColumn.AutoFit();
      }

$InactiveUsers について上記を繰り返しました。

4

1 に答える 1

0

両方の配列に同じ数のレコードがある場合、次のようにすることができます。

for ($i = 0, $i -lt $activeUsers.Length; $i++) {
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $activeUsers[$i].split('|')
  $row = 2 * $i + 2
  $ActiveWorksheet.Cells.Item($i, 1) = $user_id  
  $ActiveWorksheet.Cells.Item($i, 2) = $user_name
  $ActiveWorksheet.Cells.Item($i, 3) = $Costcntr
  $ActiveWorksheet.Cells.Item($i, 4) = $ApprMgr
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $inactiveUsers[$i].split('|')
  $ActiveWorksheet.Cells.Item($i+1, 1) = $user_id  
  $ActiveWorksheet.Cells.Item($i+1, 2) = $user_name
  $ActiveWorksheet.Cells.Item($i+1, 3) = $Costcntr
  $ActiveWorksheet.Cells.Item($i+1, 4) = $ApprMgr
  $ActiveWorksheet.Rows.Item($i+1).EntireRow.Interior.ColorIndex = 3
}

両方の配列の長さが異なる場合は、次のようにすることができます。

if ($activeUsers.Length -gt $inactiveUsers.Length) {
  $larger  = $activeUsers
  $smaller = $inactiveUsers
} else {
  $larger  = $inactiveUsers
  $smaller = $activeUsers
}
for ($i = 0, $i -lt $smaller.Length; $i++) {
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $smaller[$i].split('|')
  ...
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $larger[$i].split('|')
  ...
}
for ($i = $smaller.Length, $i -lt $larger.Length; $i++) {
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $larger[$i].split('|')
  ...
}

ただし、より良い解決策は、アカウントの状態を示す追加の列を導入することです。

$ActiveWorksheet.Cells.Item(1,5) = "Inactive"
...
for ($i = 0, $i -lt $activeUsers.Length; $i++) {
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $activeUsers[$i].split('|')
  $row = 2 * $i + 2
  $ActiveWorksheet.Cells.Item($i, 1) = $user_id  
  $ActiveWorksheet.Cells.Item($i, 2) = $user_name
  $ActiveWorksheet.Cells.Item($i, 3) = $Costcntr
  $ActiveWorksheet.Cells.Item($i, 4) = $ApprMgr
  ($user_id,$user_name,$Costcntr,$ApprMgr) = $inactiveUsers[$i].split('|')
  $ActiveWorksheet.Cells.Item($i+1, 1) = $user_id  
  $ActiveWorksheet.Cells.Item($i+1, 2) = $user_name
  $ActiveWorksheet.Cells.Item($i+1, 3) = $Costcntr
  $ActiveWorksheet.Cells.Item($i+1, 4) = $ApprMgr
  $ActiveWorksheet.Cells.Item($i+1, 5) = "x"
}

次に、条件付き書式を使用して、5番目の列の値が「x」である行を強調表示できます (その書式の式は になります=(INDIRECT("E"&ROW()))="x")。

上記の追加の列を導入する場合は、スクリプトを次のように単純化することもできます。

$users =  $activeUsers | % { $_ + "|" }
$users += $inactiveUsers | % { $_ + "|x" }
...
$ActiveWorksheet.Cells.Item(1,5) = "Inactive"
...
for ($i = 0, $i -lt $users.Length; $i++) {
  ($user_id,$user_name,$Costcntr,$ApprMgr,$inactive) = $users[$i].split('|')
  $ActiveWorksheet.Cells.Item($i+2, 1) = $user_id  
  $ActiveWorksheet.Cells.Item($i+2, 2) = $user_name
  $ActiveWorksheet.Cells.Item($i+2, 3) = $Costcntr
  $ActiveWorksheet.Cells.Item($i+2, 4) = $ApprMgr
  $ActiveWorksheet.Cells.Item($i+2, 5) = $inactive
}
于 2013-07-01T14:42:01.030 に答える