2016-11-27 1 views
2

ピボットテーブルを作成しようとしていて、電子メールに埋め込むためにahkからピボットチャートを作成しようとしています。私は完全な騒ぎですので、私のコードの品質を許してください。私はピボットテーブルを正しく設定するのに問題があり、私の人生のために現れるチャートを手に入れることはできません。私は、私が取り組んでいる投稿、そしてこの記事の最後に希望する最終結果を参照しました。ピボットテーブルとチャートを作成するExcel COM for Autohotkey

私のデータは2つの列で、時間のヘッダーが付いていて、警告が表示されます。それをOutlookの電子メールに入れるか、コピー貼りだけでも機能します。これを行う方法をアドバイスしてください、私はとても近いと思います。

編集 私は以下のコードを更新し、唯一のものイム不足しているが、ピボットテーブル内の凡例欄に「警告」を追加してグラフが作成されることにポイント(ずさんイム確認してください)、それを手に入れましたAxis(カテゴリー)を「時間」から「時間」に変更すると、個々のタイムスタンプではなく時間単位で警告がグループ化されます。手動で行うと、私が望む結果が得られるようです。その後、チャートのタイトルを削除して、埋め込むオブジェクトにチャートを割り当てたり、クリップボードに取り込んだりするだけです。

ありがとうございました。私はから働いています

 f1::Reload 
Pause::Pause 
f2::ListVars 
Pause 
!`:: 
function() 
return 

function() 
{ 

when:=[] 
what:=[] 
Nothing:="Nothing to report, have a wonderful day." 
TMP:="" 
RMRKS:="" 
Date1:="" 
Date2:="" 
EMOUT:="" 

EMIN := Clipboard          ; Email text var 
Loop, Parse, EMIN,`n,`r        ; parse email by line 
{ 
tmp := StrSplit(A_LoopField, ";")   ; for each line break it into chunks by ";" 
rmrks := tmp.6         ; Warn code is in 6th index  
If (InStr(rmrks, "Warning"))     ; If this is a warning line 
{ 
date1:=StrSplit(tmp.1, "/")     ; date/time is in DD/MM/YYYY , split it up by "/" 
date2= % date1.2 "/" date1.1 "/" date1.3 ; Rearrange the date into MM/DD/YYYY 
EMOUT .= date2 "`t" rmrks "`n"    ; Push into VAR "11/24/2016 13:40:45 WARNING MESSAGE" 
}           

} 
EMOUT := StrReplace(EMOUT,"""") ; Replace all of the quotes in the var with Null 

Loop, Parse, EMOUT,`n,`r ; Split output by line and then... 
{   
tmp := StrSplit(A_LoopField, ["`t"]) ; split lines by tab 
when.insert(tmp.1)     ; insert date/time stamp into "when" array 
what.insert(tmp.2)     ; insert Warn Code into "what" array 
} 

if (emout!="")         ; If there was stuff to put into array 
{ 
XL := ComObjCreate("Excel.Application") ; create an excel object 
wbk := xl.Workbooks.Add       ; add a workbook to the object 
Xl.Visible := True       ; make it visible 
XL.Range("A1").Value := "Time"    ;Create Time header 
XL.Range("A:A").columnwidth := "20" 
XL.Range("B:B").columnwidth := "56.86" 
XL.Range("B1").Value := "Warning"   ; Create Warning Header 
for index in when  
     Xl.Range("A" . index+1).Value := when[index] ;add everything in the "when" array 
for index in what 
     Xl.Range("B" . index+1).Value := what[index] ;add everything in the "what" array   




rng := xl.Sheets(1).UsedRange.address 
trgt := xl.Sheets(1).range("c1") 
pvt := xl.ActiveWorkbook.PivotCaches.Create(xlDatabase:=1, rng, xlPivotTableVersion12:=3).CreatePivotTable(trgt, "PivotTable1", ,xlPivotTableVersion12:=3) 
pvt.PivotFields("warning").Orientation := 1 
pvt.PivotFields("warning").Position := 1     
pvt.PivotFields("time").Orientation := 1 
pvt.PivotFields("time").Position := 2   
pvt.AddDataField(pvt.PivotFields("Warning"), "Count of Warning", -4112)  



Sheet := xl.Sheets(1) 
Sheet.Shapes.AddChart.Select 
wbk.ShowPivotChartActiveFields := false 
xl.ActiveChart.ChartType := 51 
xl.ActiveChart.PivotLayout.PivotTable.PivotFields("Warning").Orientation = xlColumnField 
xl.ActiveChart.PivotLayout.PivotTable.PivotFields("Warning").Position = 1 







return 




} 
if (emout="") 
Msgbox, %Nothing% 

Reload 
} 

ソースのフォーラムの投稿はあり

AutoHotkeyをドットコム/ボード/トピック/ 149544-テーブルピボット-VS-テーブルピボットチャートコム

autohotkeyドットコム/ボード/トピック/ 125719-com-excel-pivot-table

最終結果私はOutlook電子メールに埋め込みたいと考えています:

http://imgur.com/a/6baLe

サンプル入力:

http://p.ahkscript.org/?p=a0ceb3b1

答えて

0

https://xkcd.com/979/

f1::Reload 
    Pause::Pause 
    f2::ListVars 
    Pause 


    !`:: 

    SetKeyDelay, -1 




    Recipients:="[email protected]" 

    TMP:="" 
    RMRKS:="" 
    Date1:="" 
    Date2:="" 
    City:="" 
    Chart:="" 
    Warnings:="" 


    EMAIL:=clipboard 
    city:=Getcity(EMAIL) ; Get city name 
    Warnings := ParseWarnings(Email) 


     if Warnings.MinIndex()        ; If there was stuff to put into array 
     { 
      Chart := CreateChart(Warnings) 
      CreateEmail(Chart, city,Warnings) 
     } 


     else 
      msgbox , No Warnings 





    ;###################################################################################################################################################################################################################; 
    ;##########################################################################################  Functions  ####################################################################################################; 
    ;###################################################################################################################################################################################################################; 


    ParseWarnings(Email) 
    { 
     Warnings := [] 
     EMAIL := StrReplace(EMAIL, """")     ; Email text var. Remove all quotes. 
     Loop, Parse, EMAIL, `n, `r       ; Parse email by line 
     { 
      tmp := StrSplit(A_LoopField, ";")    ; For each line break it into chunks by ";" 
      rmrks := tmp.6         ; Warn code is in 6th index  
      If InStr(rmrks, "Warning")      ; If this is a warning line 
      { 
       date1:=StrSplit(tmp.1, "/")     ; Date/time is in DD/MM/YYYY , split it up by "/" 
       Warnings.Push({"When": date1.2 "/" date1.1 "/" date1.3, "What": rmrks}) ;Warnings[1].when //// Warnings[1].what 
      } 
     } 
     return Warnings 
    } 

    CreateChart(Warnings) 
    { 
     static xlColumnClustered := 51 
      , xlColumnField := 2 
      , xlCount := -4112 
      , xlDatabase := 1 
      , xlHidden := 0 
      , xlPivotTableVersion12 := 3 
      , xlRowField := 1 

     XL := ComObjCreate("Excel.Application")   ; Create an excel object 
     Wbk := XL.Workbooks.Add       ; Add a workbook to the object 
     Xl.Visible := True        ; Make it visible 
     Sheet := xl.Sheets(1)       ; Save a reference to this sheet 

     ; Set Column headings and width 
     Sheet.Range("A1").Value := "Time"    ; Create Time header 
     Sheet.Range("A:A").columnwidth := "20" 
     Sheet.Range("B1").Value := "Warning"   ; Create Warning Header 
     Sheet.Range("B:B").columnwidth := "56.86" 

     ; Create a safe array and copy data into it. Then put the safe array into a range. 
     nRows := Warnings.MaxIndex()     ; The number of rows 
     SafeArray := ComObjArray(12, nRows, 2)   ; Create a safearray of the correct size. (Type = 12, Rows = nRows, Columns = 2) 
     for i, Warning in Warnings 
     { 
      SafeArray[i - 1, 0] := Warning.When   ; SafeArray[RowNumber, ColumnNumber] := Value 
      SafeArray[i - 1, 1] := Warning.What   ; SafeArray index starts at 0 (not 1) 
     } 
     Cell := Sheet.Range("A2")      ; The top left cell of the range 
     Sheet.Range(Cell, Cell.Offset(nRows - 1, 1)).Value := SafeArray ; Put the SafeArray into the Range 

     rng := Sheet.UsedRange.address 
     trgt := Sheet.range("c1") 
     pvt := xl.ActiveWorkbook.PivotCaches 
      .Create(xlDatabase, rng, xlPivotTableVersion12) 
      .CreatePivotTable(trgt, "PivotTable1",, xlPivotTableVersion12) 

     pfWarning := pvt.PivotFields("warning") 
      pfWarning.Orientation := xlColumnField 
      pfWarning.Position := 1 
      pvt.AddDataField(pfWarning, "Count of Warning", xlCount) 






     ; **Is it necessary to set 'pfTime.Orientation' multiple times? 
     pfTime := pvt.PivotFields("time")  ; VBA = With ActiveChart.PivotLayout.PivotTable.PivotFields("Time") 
      pfTime.Orientation := xlHidden  ; VBA = ActiveChart.PivotLayout.PivotTable.PivotFields("Time").Orientation = xlHidden 
      pfTime.Orientation := xlRowField ; VBA = .Orientation = xlRowField 
      pfTime.Position := 1    ; VBA = .Position = 1 
      pfTime.AutoGroup     ; Must be Office version >= 2016 
     pvt.PivotFields("Minutes").Orientation := xlHidden ; ??? 
      pfTime.Orientation := xlHidden  ; ??? 

     Sheet.Shapes.AddChart 
     wbk.ShowPivotChartActiveFields := false 

     Sheet.ChartObjects(1).Activate 
     Chart := wbk.ActiveChart 
      Chart.ChartTitle.Delete 
      Chart.ChartType := xlColumnClustered 
      Chart.PivotLayout.PivotTable.PivotFields("Warning").Orientation := xlColumnField 
      Chart.PivotLayout.PivotTable.PivotFields("Warning").Position := 1 

     return Chart 
    } 
    CreateEmail(Chart, city,warnings) 
    { 
     ; Reference: http://stackoverflow.com/questions/25603864/copy-excel-chart-to-outlook-mail-message 
     ; Alternative method: http://www.mrexcel.com/forum/excel-questions/562877-paste-chart-into-email-body.html 
     static olMailItem := 0 

     olApp := ComObjCreate("Outlook.Application") 
     Email := olApp.CreateItem(olMailItem) 
     Email.Display 
     Email.To := "[email protected]" 
     Email.Subject := "*** Todays Warnings for Your Gain Site in " city " ***" 
     body:=warndata(warnings) 
     header:="`n" "`n" "Data:" "`n" 
     Email.body := header . body 
     Chart.ChartArea.Copy  
     wEditor := olApp.ActiveInspector.WordEditor 
     wEditor.Application.Selection.Paste 

    } 
    GetCity(EMAIL) 
    { 
      Split := StrSplit(EMAIL, "`n", "`r") 
      City := Split[Split.Length()-5] 
     IfNotInString, City, , 
      City := Split[Split.Length()-6] 
      City:=strsplit(city,",") 
      City:=City.1 
      Return City 
     } 

     warndata(warnings) 
     {  
      for i, Warning in Warnings 
       body .= "`n" Warning.When "`t" Warning.What "`n" ; This is not right 
     return body 
     } 
1

二つの可能な提案:あなたはVBAの関数として何をしようとして用

  1. 検索(はるかに可能性の高い良い得るためにVBAアドバイスを探している検索結果)
  2. Excelで実行したいことをマクロに記録してから、VBAコードt帽子が生成されます。言い換えれば、マクロが記録されている間にチャートを作成してタイトルを削除してから、それがあなたに良いコードを与えるかどうかを確認します。いくつかのケースでは、これは動作しますが、場合によってはそうではありません。

これらの方法のいずれかを使用すると、スクリプトに翻訳する必要があるコードや機能を把握できるようになります。

関連する問題