cancel
Showing results for 
Search instead for 
Did you mean: 

Blue Prism - Excel365 - Sortieren

MarcoMatuttis1
Level 6

Ich habe mal wieder ein Excel Problem mit blueprism und komme irgendwie nicht richtig weiter.

Ich muss in einem Tabellenblatt bestimmte Zeilen nach einer bestimmten Spalte sortieren.

Siehe Screenshot:

36369.png

Wenn ich das manuell per Hand mache, klicke ich in Zelle J10 und wähle dann oben in der Excelwerkzeugleiste "Sortieren und Filtern" aus und klicke dann auf "Von A bis Z sortieren".

Alle Werte ab Zeile 10 des Tabellenblatts sind dann wie gewünscht nach den Werten in Spalte J sortiert.

Ich schaffe es jedoch nicht, in blueprism diese eigentlich triviale Sache so nachzubauen, dass sie zuverlässig funktioniert...

Mit "Get Worksheet as Collection" kann ich dem Fall nicht arbeiten, weil mir Excel beim einlesen und zurückspielen der Werte mit "Write Collection" die Formeln und Werte in den Zellen versaut. Also über Collection sortieren klappt das leider nicht.

Es gibt im Excel VBO und auch im Excel VBO Extended, leider keine Sortierfunktion die genau das macht, was ich möchte.

Ich habe mir deshalb ein neues Business Objekt für Excel erstellt. Als Parameter hab ich ausgewählt:

Windows Application

  • Application will already be running - I want to attach to an existing instance
  • Fenstertitel * weil der ja alles mögliche sein kann.
  • Processname EXCEL
  • keinen Pfad angegeben und auch keine Parameter weil er ja zu einer bereits offenen Excelinstanz "attachen" soll
  • Application Manager Mode "embedded"

Wenn ich jetzt die einzelnen Elemente des Excelfensters ausspähen möchte habe ich das Problem, dass das Excel Fenster als ganzes irgendwie gar nicht ausgespäht werden kann. Ich kann den oberen Part mit der Werkzeugleiste als einzelnes Element ausspähen und dann auch den unteren Teil etc.

Dadurch dass der Funktionsbutton 36370.pngin der oberen Werkzeugleiste ist, spähe ich diese als einzelnes Element aus. Das funktioniert sowohl im w32 Spy-Modus als auch im UIA Spy-Modus. Danach den Button selbst und den "Befehl von A bis Z sortieren"

36371.png

Diese Elemente lassen sich nur im UIA Spy-Modus selektieren.

Man kann das ganze auch per Tastenkombination auslösen. Nachdem man Alt oder F10 klickt erscheinen ja in der Werkzeugleiste diese kleinen Symbole:

36372.png

Die Tastenfolge um sortieren auszulösen ist: F10, R, O, S, S oder ALT, R, O, S, S

Hier hat Blueprism 2 Möglichkeiten wie ich diese Tastendrücke senden kann:

1. Global Send Key Events -> Text "{F10}ROSS" Interval 1/2

2. Windows Press Key -> Text "{F10}ROSS" Interval 1/2

Variante 1 lässt sich nur auf das oberste Element im Application Manager anwenden, also die Anwendung selbst. Variante 2 lässt sich auf "Fenster" anwenden.

Und jetzt kommt mein Problem:

Gehe ich mit Step Over über die Action klappt das ganze mit Variante 1.

Lasse ich den Prozess dann laufen friert blueprism zu 90% ein (keine Rückmeldung). Manchmal geht es nach ein paar Minuten auch weiter und der Befehl wird tatsächlich ausgeführt. Meistens muss ich blueprism aber einfach über den Taskmanager beenden.

Über Variante 2 kommt die Tastenkombination scheinbar gar nicht erst in der Anwendung an.

Über konventionelle Actions: Attach, Activate Application, Navigate Stage usw. klappt es ebenfalls nur im Step Over Modus.

Ich kann wenn ich im Businessobjekt bin das Attach und die Navigate Stages einzeln mit Step Over durchklicken und Blueprism findet tatsächlich die Elemente und klickt sie auch. Wenn ich die Actions jedoch im Prozess ausführe springt die blueprism Anwendung zu 90% auf "Keine Rückmeldung". Ab und zu klappt es mal für das erste Tabellenblatt. 

Ab und zu klappt es auch mit langen Hängern während blueprism auf "Keine Rückmeldung" stehen bleibt. Das dauert dann ein paar Minuten bis die Clicks dann tatsächlich durchgeführt werden.

Meine erste Frage: Hat für dieses Problem jemand eine Lösung ? 

Ich hab meiner Meinung nach eignetlich schon alles "herkömmliche probiert" und hatte daher eine neue Idee um das ganze irgendwie zu umgehen:

Eine modifizerte Code Stage im Excel VBO. Ich habe mir dazu ein Duplikat der Select Action im Excel VBO erstellt und versucht auf diese Art und Weise Tastendrücke direkt an Excel zu senden:

36373.png

36374.png

36375.png

Dim wb, ws As Object
Dim excel, sheet, range As Object

Try

wb = GetWorkbook(Handle, Workbook)
ws = GetWorksheet(Handle, Workbook, Worksheet)

wb.Activate()
ws.Activate()
excel = ws.Application
excel.SendKeys("%ROSS")

Success = True

Catch e As Exception
	Success = False
	Message = e.Message
Finally
	wb = Nothing
	ws = Nothing
	excel = Nothing
End Try

Ich hab leider so gut wie keine Ahnung von Visual Basic und hab mir das ganze anhand von einiger Sachen die ich auf google gefunden habe und was eben durch die Select Action vorgegeben war zusammengeschustert.

Quelle war z.B. hier:

Application.SendKeys-Methode (Excel) | Microsoft Docs

Ich habe auch schon excel.Application.SendKeys probiert und mit modifiziertem String aber ich vermute ehrlichgesagt, dass ich hier grundlegend irgendwas falsch mache ...

Vielleicht kennt sich ja jemand aus und kann mir hier weiterhelfen. Ich denke das über eine Code Stage zu lösen wäre wohl die eleganteste Methode. Weil mit den Fensterelementen zu arbeiten bei Excel irgendwie nur Fehler und Probleme verursacht.

6 REPLIES 6

ewilson
Staff
Staff
NOTE: Translation provided by Google Translate

Hallo @MarcoMatuttis1,

Wir haben gerade die MS Excel VBO auf der Digital Exchange aktualisiert. Vielleicht möchten Sie einen Blick darauf werfen, da wir Sortier- und AutoFilter-Aktionen hinzugefügt haben. ​

https://digitalexchange.blueprism.com/dx/entry/3439/solution/ms-excel-vbo

Cheers,

MarcoMatuttis1
Level 6

@ewilson
Thanks for the support.

I just downloaded the new VBO and tested the function but so far I have not been able to get it to work.

I'm not exactly sure about the input values and what the function exactly does.

Unfortunately the provided Blue Prism MS Excel VBO User Guide did not have information on the sort function. It seems not up to date yet.

36368.png

So far I tried different Values for Coloumn Reference the rest of the input parameters seems kinda clear but maybe I entered something wrong here also. Here are some of the errors I get as result. When I try:

"J" as input value i get "Exception from HRESULT: 0x800A03EC"

"J10" as input value i get "Die Sort-Methode des Range-Objektes konnte nicht ausgeführt werden."

"J10:J47" as input value i get "Die Sort-Methode des Range-Objektes konnte nicht ausgeführt werden."

    ewilson
    Staff
    Staff
    @MarcoMatuttis1,

    Ah, so you just want to sort of specific range of rows within the column and not the entire column, correct? If so, that's going to be a bit more tricky, We'll need to look at that further as the auto-expand feature of Excel tends to grab to entire column when doing this in code.

    Cheers,
    Eric​

    MarcoMatuttis1
    Level 6

    @ewilson Exactly, in this case I just want to sort a specific area.

    Excel does exactly that when I manually select or click in the Cell J10 and then manually press Sort from A to Z in the menu/toolbar. It will only sort the cells from J10 downwards and will not affect the upper part of the worksheet.

    If I could just activate this button by codestage, that would probably do the trick. I tried creating a codestage by copying the "select" action modified it and tried sending keystrokes to excel that way but I could not get it to work unfortunately.

    MarcoMatuttis1
    Level 6

    I think I found something how to do it with a macro.

    Range("A10:AQ47").Sort Key1:=Range("J10"), Header:=xlNo

    I found it here. EXCEL VBA Die wichtigsten Befehle #16 - Die SortierFunktion (sortieren, mehrere Kriterien) - YouTube

    I try to use this command in my codestage now and see where I end up 🤞

    MarcoMatuttis1
    Level 6

    I think I have it working. I will adjust the input parameters later but for now it seems the codestage seems to work.

    I made a copy of the sort function and changed the commands a bít.

    Dim ws as Object  = GetWorksheet(handle, workbookname, worksheetname)
    
    ' Initialize output.
    success = true
    errorMessage = ""
    
    Try
    	
    	ws.Range(colReference).Sort(Key1:= ws.Range("J10"), Order1:= 1, Header:= 1)
    		
    
    Catch ex as exception
    	success = false
    	errorMessage = ex.message
    
    End Try

    I will adjust that part later:

    ws.Range(colReference).Sort(Key1:= ws.Range("J10"), Order1:= 1, Header:= 1)
    
    to

    ws.Range(sortarea).Sort(Key1:= ws.Range(sortcell), Order1:= 1, Header:= 1)
    ​

    Then I should be able to input any areas I want.