• 締切済み

PowerShellでExcel操作をする

昔、水平タブ区切りの集計データをコピーし下記のVBSでExcelに貼り付けグラフ化する事をしていました。 今回PowerShellで同じようなことができないかと思い挑戦しています。簡単なExcel操作はなんとかなりますが範囲の取得やそれを利用した指定等を組み込んだ場合上手く行きません。 そこで下記のVBSで行ったExcel操作をPowerShellで実現する方法をお教えください。 Option Explicit Dim ex,eb,eg,sD,chart,newChartObject ' Excel起動 Set ex=CreateObject("Excel.Application") ex.Visible=True ' ワークブックを追加 Set eg=ex.Application.Workbooks.Add() Set eb=eg.Sheets(1) ' 新規グラフ(座標は、グラフのエリア) Set chart =eb.ChartObjects() Set newChartObject = chart.Add(300, 100, 400, 300) ' グラフデータを代入 eb.Range("A3").PasteSpecial ' グラフデータをの範囲取得(最終行及び最終列) sD = eb.Range("B3").End(-4121).Row eb.Range("B3").Resize(sD-1, 1).NumberFormatLocal = "#,###" eb.Range("D4").Resize(sD-3, 1).NumberFormatLocal ="0.00%" ' 参照範囲の設定 ex.ActiveSheet.ChartObjects("グラフ 1").Activate ex.ActiveChart.SetSourceData eb.Range("A3").Resize(sD-2 , 2) ex.ActiveChart.SeriesCollection(1).Values = eb.Range("B4").Resize(sD-3 , 1) ex.ActiveChart.SeriesCollection(1).Name =eb.Range("B3") ex.ActiveSheet.ChartObjects(1).Chart.ChartStyle = 32 '第2データの指定 ex.ActiveChart.SeriesCollection(2).ChartType = 4 '折れ線グラフ ex.ActiveChart.SeriesCollection(2).Values = eb.Range("D4").Resize(sD-3 , 1) ex.ActiveChart.SeriesCollection(2).AxisGroup = 2 ex.ActiveChart.SeriesCollection(2).Name =eb.Range("D3") Set eg=Nothing Set eb=Nothing Set ex=Nothing 宜しくお願いします。

みんなの回答

  • NuboChan
  • ベストアンサー率47% (745/1582)
回答No.1

>VBSで行ったExcel操作をPowerShellで実現する方法 回答が付かないので思ったことを記載します。 個人的には、EXCELに引き継ぐ巨大なDATA(CSV)をPowerShellで加工するような操作を行っています。 (PowerShellは門外漢なのでほとんど他力本願ですが。。。。) なぜわざわざPowerShellで実行したいのですか? コードを見た感じですがコードのどこをPowerShellに置き換えるのかイメージできません。

turu575
質問者

補足

>なぜわざわざPowerShellで実行したい wikからVBScriptの項目から抜粋 マイクロソフトは2000年代初頭から ActiveX に変わる戦略として、.NET戦略を打ち立てており、ASPも2002年にリリースされたASP.NETに置き換えられ、その記述言語も C# や Visual Basic .NET 等となった。また、オペレーティングシステムの汎用スクリプト環境についてもWSHから Windows PowerShell へ移行すると言う。 別にこれが理由ではなく単にやってみたいだけです。ちなみに単純なグラフは下記のコードでグラフ化はできましたがVBSで作った棒グラフと折れ線の2軸グラフの作成迄はまだまだです。 $excel = New-Object -ComObject Excel.Application $excel.Visible = $true $book = $excel.Workbooks.Add() $sheet = $excel.Worksheets.Item(1) $sheet.Range("B2") = "月別売上" $sheet.Range("B3").PasteSpecial($exlpasteType::xlPasteValues) $objRange = $sheet.usedRange $a = $objRange.SpecialCells(11).row $b = $objRange.SpecialCells(11).column $tableRange = $sheet.Range($sheet.Cells.Item(3,2),$sheet.Cells.Item($a,$b)) $tableRange.Borders.LineStyle = $True $posX, $posY = 300, 100 $width, $height = 500, 400 $chart = $sheet.ChartObjects().Add($posX, $posY, $width, $height).Chart $chart.SetSourceData($tableRange) | Out-Null

関連するQ&A

  • VBScriptでExcelグラフ作成につて

    VBSを生かじりしている者です。既存のExcelファイルを開きそのファイルにあるデータを参照してグラフを作るVBS文を作る勉強をしています。現在2軸グラフを作成中で、グラフスタイルの指定まで出来るようになりました。次に第2系列の折れ線グラフの色を変えられないものかと試行中ですが全くうまく行きません。グラフの色を変える方法をご教授願います。もしかしてVBSで出来ない範囲かどうかと思ったり・・・・・ Excel2007のデータ(a1セルから)・・DBからのエクスポートのためa1セルに値有り 月    1    2    3    4    5    6 売上高 540,000 560,000 660,000 750,000 360,000 620,000 粗利益 81,000 128,800 171,600 225,000   65,000 116,500 粗利益率 15.00% 23.00% 26.00% 30.00% 18.06% 18.79% 売上高と粗利益率を参照する2軸グラフの作成VBS文 Option Explicit Dim ex,eb,eg,sE,sW,objEx,nChart ' Excel起動 Set ex=CreateObject("Excel.Application") ex.Visible=True ' 既存ファイルを開く Set eg = ex.Workbooks.Open("C:\Users\hidefumi shima\Documents\VBS\グラフ0002.xlsx") Set eb=eg.Sheets(1) ' 新規グラフ(座標は、グラフのエリア) Set nchart =eb.ChartObjects.add(300, 100, 400, 300) ' グラフデータの範囲取得(終端セル) sE = eb.Range("B1").End(-4121).Row sW = eb.Range("A1").End(-4161).Column ' グラフデータの指定 ex.ActiveSheet.ChartObjects("グラフ 1").Activate ex.ActiveChart.SetSourceData eb.Range("b2").Resize(1, sW-1) ex.ActiveChart.SeriesCollection(1).Name =eb.Range("a2") ex.ActiveSheet.ChartObjects(1).Chart.ChartStyle = 34 '第2データの指定 ex.ActiveChart.SeriesCollection.NewSeries ex.ActiveChart.SeriesCollection(2) ex.ActiveChart.SeriesCollection(2).ChartType = 4 '折れ線グラフ ex.ActiveChart.SeriesCollection(2).Values = eb.Range("b4").Resize(1, sW-1) ex.ActiveChart.SeriesCollection(2).AxisGroup = 2 ex.ActiveChart.SeriesCollection(2).Name =eb.Range("a4") Set eg=Nothing Set eb=Nothing Set ex=Nothing

  • C#でのExcel操作について.(Rangeオブジェクトへの複数範囲設定)

    C#でExcelのグラフを作成させるプログラムを書いるのですが,Rangeオブジェクトへの離れたセルの複数範囲を指定したいのですが,いろいろ調べてみましたがどうしても解決できません. 調べた限りではVBではできるようですが,C#ではできないのでしょうか? Excel.ChartObjects chartObjects =(Excel.ChartObjects)oSheet.ChartObjects(Type.Missing); Excel.ChartObject chartObj = chartObjects.Add(100, 100, 700, 400); Excel.Chart chart = chartObj.Chart; Excel.Range chartRange = oSheet.get_Range("B1","B3"); /*↑の部分で("B1:B3,B5:B8,C5")のようなことをしたいです.RangeにAddメソッドのようなものがあればと思っているのですが無いみたいなので‥‥*/ chart.SetSourceData(chartRange,Excel.XlRowCol.xlColumns); Excel.SeriesCollection seriesCollection=(Excel.SeriesCollection)chart.SeriesCollection(Type.Missing); よろしくお願いします.

  • [VBA Excel] 2系列の散布図を書いてみるとおかしくなります・・・

    Excel 2007とVBAで数値解析をしています。計算結果のグラフを表示するための準備段階として、次のようなプログラムを組んで、2系列の散布図を書いて見ました。 Option Explicit Sub makechart()   Dim chart1 As ChartObject, wsh As Worksheet   Set wsh = Sheet1   Set chart1 = wsh.ChartObjects.Add( _   10, 20, 250, 200)   With chart1.Chart    .ChartType = xlLineStacked    .SeriesCollection.NewSeries    .SeriesCollection(1).XValues = _     wsh.Range("A1:A5")    .SeriesCollection(1).Values = _     wsh.Range("B1:B5")   End With   With chart1.Chart    .SeriesCollection.NewSeries    .SeriesCollection(2).XValues = _     wsh.Range("A1:A5")    .SeriesCollection(2).Values = _     wsh.Range("C1:C5")   End With End Sub --sheet1--   A B C ----------- 1| 1 2 3 2| 2 3 4 3| 3 4 5 4| 4 5 6 5| 5 6 7 系列1のグラフはB列 対 A列という意図通りのものになったのですが、系列2のグラフは、Y軸の値が、C列の値にB列の値を足したもの (1,2+3)、(2,3+4) ・・・ になってしまいました。系列2のグラフも純粋にC列 対 A列したいのですが、そのためにはどうすれば良いでしょうか。ご教授ください。

  • エクセルのグラフの操作

    エクセルのグラフの操作 初歩的でスミマセンが、よろしくお願いします。 エクセルのグラフのデータの内容を1セルずつ下に下げて、それを400回繰り返したいんです。 'wave-h'!R402C3と'wave-h'!R402C4を 'wave-h'!R403C3と'wave-h'!R403C4にして 'wave-h'!R867C3と'wave-h'!R867C4にまでしたいのですが。 do loopを考えてるんですが、引数?が上手くいかなくて・・・。 ついでにその後グラフをコピーしてペイントに貼り付けてJPGで保存する予定です。 これを400回以上繰り返すんですが、ペイントのコピーのところまではエクセルのVBAで可能でしょうか。よろしくお願いします。 ActiveSheet.ChartObjects("グラフ 4").Activate ActiveChart.SeriesCollection(2).Select ActiveChart.SeriesCollection(2).XValues = "='wave-h'!R402C3" ActiveChart.SeriesCollection(2).Values = "='wave-h'!R402C4" ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(2).Select ActiveChart.ChartArea.Select ActiveChart.ChartArea.Copy

  • EXCEL VBA:埋め込みグラフオブジェクトの命名方法について (続き1)

    http://oshiete1.goo.ne.jp/qa3258443.html の質問の続きです。 ------------------------------------------------------------- Sub sample() Dim myRange As Range Set myRange = Range("A1:D2") With Worksheets("Sheet1").ChartObjects.Add(50, 50, 300, 200).Chart .ChartType = xlPie .SetSourceData Source:=myRange, PlotBy:=xlRows .ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent, LegendKey:=False, HasLeaderLines:=True End With End Sub ------------------------------------------------------------- この手法でグラフ作成した場合について、 1. グラフ作成時に以下と同じように NumberFormatLocal を設定する方法はありますか? (通常の記述例) ActiveChart.SeriesCollection(1).DataLabels.Select Selection.NumberFormatLocal = "0.0%" といいますのは、現在作成しているマクロはユーザーの操作によっては 円グラフと棒グラフが順不同に作成される場合があり、 SeriesCollection の INDEX番号 が分からない場合があるためです。 または、グラフの名前等を指定することなどにより、 SeriesCollection の INDEX番号 を取得する事が可能でしたら その方法を教えて頂きたいのですが・・・。 2. 同じく、グラフ作成時にデータラベルのフォントを設定する方法はありますか? (通常の記述例) With Selection.Font .Name = "MS Pゴシック" .Size = 10 End With 3. 同じく、横棒グラフ作成時に、以下と同じ事はできますか? '反転 ActiveChart.Axes(xlCategory).Crosses = xlMaximum ActiveChart.Axes(xlCategory).ReversePlotOrder = True '横軸100% ActiveChart.Axes(xlValue).MaximumScale = 1 以上、何卒ご教授のほど、よろしくお願い致します。

  • VB2005でExcelのグラフのデータ範囲を設定したい

    VB2005で既存のExcelのグラフのデータ範囲を設定したいのですが どなたか教えてください。 VB6.0では下記のコードで実現できましたが VB2005ではいろいろ調べたり変更してみたりしたのですが実現できませんでした OSはWindows2000でExcelも2000です Dim ExAp As Excel.Application Dim ExBook As Excel.Workbook Dim ExSheet As Excel.Worksheet On Error GoTo er Set ExAp = CreateObject("Excel.Application") Set ExBook = ExAp.Workbooks.Open("C:\ファイル名.xls") Set ExSheet = ExBook.Worksheets("シート名") ExAp.Visible = True ExSheet.Activate ExSheet.ChartObjects("グラフ 1").Activate With ActiveChart .SeriesCollection(1).XValues = ExSheet.Range("B21:B24") .SeriesCollection(1).Values = ExSheet.Range("C21:C24") End With Exit Sub er: Set ExSheet = Nothing Set ExBook = Nothing Set ExAp = Nothing MsgBox Err.Description

  • VBAにてExcelでグラフ元データの範囲を取得する関数は?

    VBAでExcelのグラフの「元のデータ」のデータ範囲の 値を取得する関数等がありましたら教えていただけな いでしょうか。 系列の名前や値はこんな形で取れるのですが。。 Set work = Tg_Sheet.ChartObjects(i) AreaStr = work.Chart.SeriesCollection.Item(1).Formula Set work = Nothing 以上よろしくお願いいたします。

  • 初心者です。SeriesCollection(i)はどのように使うのでしょうか

    Sheets("推移グラフ").Select ActiveChart.ChartArea.Select ActiveChart.SeriesCollection(1).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(1).Values = Worksheets(Zsheet2).Range(yrenge1) ActiveChart.SeriesCollection(2).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(2).Values = Worksheets(Zsheet2).Range(yrenge2) ActiveChart.SeriesCollection(3).XValues = Worksheets(Zsheet2).Range(xrenge1) ActiveChart.SeriesCollection(3).Values = Worksheets(Zsheet2).Range(yrenge3) ActiveChart.Deselect に折れ線を1本追加したいのですが、SeriesCollectionの使い方がわかりません。SeriesCollection(i)のiは1~3しか使えないのでしょうか。

  • グラフの参照元を相対参照で記述するには

    マクロ初心者です。 あるグラフを最初テンプレートで作っておいて、他のデータでも簡単に同じグラフを作れるようにしたいです。 マクロの記録で「相対参照」があったので、これでできると思ったのですが、グラフのセルは絶対参照になるようです。下記のようになってりまいます。 Sub Macro6() ' ' Macro6 Macro ' ' ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.PlotArea.Select ActiveSheet.ChartObjects("グラフ 1").Activate ActiveCell.Select ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.PlotArea.Select ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).XValues = "='Sheet1'!J3:J11" ActiveChart.SeriesCollection(1).Values = "='Sheet1'!M3:M11" ActiveChart.SeriesCollection(2).XValues = "='Sheet1'!J3:J11" ActiveChart.SeriesCollection(2).Values = "='Sheet1'!P3:P11" ActiveCell.Select End Sub 具体的にやりたい動作は、 1.相対的な場所を決定するセルを選択(表の左上のセルなど) 2. ActiveChart.SeriesCollection(1).XValues = "='1.のセルから右に2列進んだセル:1.のセルから右に2列下に8列進んだセル" ActiveChart.SeriesCollection(1).Values = "='1.のセルから右に4列進んだセル:1.のセルから右に4列下に8列進んだセル" ActiveChart.SeriesCollection(2).XValues = "='1.のセルから右に2列進んだセル:1.のセルから右に2列下に8列進んだセル" ActiveChart.SeriesCollection(1).Values = "='1.のセルから右に6列進んだセル:1.のセルから右に6列下に8列進んだセル" というふうにしたいです。 ご指導お願いします。

  • エクセルのグラフ

    グラフが貼り付けられているシートを見えない状態でグラフ描画したいのですがうまくいきません ちなみに、今のコードはこうです。 Sub 電力力率表示() ActiveSheet.ChartObjects("グラフ 3").Activate ActiveChart.SeriesCollection(2).Select ActiveChart.SetSourceData Source:=Sheets(s_NAME) _ .Range("A2:C146"), PlotBy:=xlColumns End Sub

専門家に質問してみよう