2

ピボット テーブルを作成してから、電子メールに埋め込むための ahk のピボット チャートを作成しようとしています。私は初心者なので、コードの品質を許してください。ピボット テーブルを正しく設定するのに問題があり、一生グラフを表示できません。私が取り組んできた投稿への参照と、この投稿の最後に望ましい最終結果を含めました.

私のデータは 2 つの列で、時間のヘッダー (なくてもよい) と警告があります。時間の経過に伴う警告の量と種類を示すグラフを作成できるようにしたいと考えています。そこから、オブジェクトのハンドルを取得し、それを Outlook の電子メールに入れるか、単にコピーして貼り付けるだけでもうまくいきます。これを行う方法を教えてください。私はとても近いと思います。

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

助けてくれてありがとう。

        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 ドット com/board/topic/149544-table-pivot-vs-table-pivot-chart-com

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

Outlookの電子メールに埋め込むために探している最終結果:

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

サンプル入力:

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

4

2 に答える 2

0

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
        }
于 2016-12-04T12:09:28.687 に答える