24-03-22 02:38 PM
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:
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
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 in 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"
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:
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:
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.
27-03-22 05:13 PM
28-03-22 09:04 AM
@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.
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."
28-03-22 12:40 PM
28-03-22 02:10 PM
@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.
29-03-22 09:14 AM
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 🤞
29-03-22 11:21 AM
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)
tows.Range(sortarea).Sort(Key1:= ws.Range(sortcell), Order1:= 1, Header:= 1)
Then I should be able to input any areas I want.