创build数据透视表和图表在用于Autohotkey的Excel COM中

我试图创build一个数据透视表,然后从ahk的透视图embedded到电子邮件。 我是一个小菜鸟,所以请原谅我的代码质量。 我无法让我的数据透视表正确设置,并且无法为我的生活出现一个图表。 我已经提到了我一直在工作的post,以及在这篇文章底部的最终结果。

我的数据是两列,与(可以使它没有)时间的标题,并警告我希望能够创build一个图表,显示数量和警告的types随着时间的推移,从那里得到一个对象的句柄和把它放在一个Outlook电子邮件,甚至只是一个副本粘贴会为我工作。 请告诉如何做到这一点,我想我是如此接近。

编辑我更新了下面的代码,得到它的点(马虎确定)图表创build,我唯一缺less的东西是向数据透视表中的图例字段添加“警告”,并将Axis(目录)从“时间“到”小时“,这将按小时分组,而不是单独的时间戳。 如果我手动这样做,我似乎得到了我想要的结果。 之后,我只想删除图表标题,然后将图表分配给要embedded的对象,或者将其放到剪贴板上。

感谢您的任何帮助。

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 } 

我在工作的来源论坛post是

autohotkey点com / board / topic / 149544-table-pivot-vs-table-pivot-chart-com

autohotkey点com / board / topic / 125719-com-excel-pivot-table

最终结果我正在寻找embedded到Outlook电子邮件:

View post on imgur.com

示例input:

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

两个可能的build议:

  1. search你想做的VBA函数(更有可能获得好的search结果寻找VBAbuild议)
  2. logging一个macros,在Excel中做你想做的事情,然后看看生成的VBA代码。 换句话说,在logging一个macros的时候,制作一个图表并删除标题,然后看看它是否给你提供了很好的代码。 在某些情况下,这将起作用,在某些情况下不会。

使用这些方法中的任何一个都希望能让你确定你需要翻译成脚本的代码或函数。

https://xkcd.com/979/

  f1::Reload Pause::Pause f2::ListVars Pause !`:: SetKeyDelay, -1 Recipients:="test64413@gmail.com" 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 := "test64413@gmail.com" 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 }