Excel Automation Finding Controls with Ruby
Ich möchte kurz ein kleines, aber umso praktischeres Skript vorstellen: Mein Excel-FindControls-Skript.
Es steht auch in Zusammenhang mit einem früheren Post, in dem die magische Zeile
[sourcecode language=“ruby“]excel().CommandBars(12).Controls(4).Controls(3).Execute[/sourcecode]
stand. Was soll diese Zeile? Und: Woher kommen die Zahlen?
Nun: RTFS!
[sourcecode language=“ruby“]
require ‚win32ole‘
def exl()
WIN32OLE.connect(‚Excel.Application‘)
end
def has_method(e, meth_name) #hat das Objekt eine Methode mit geg. Namen?
e.ole_methods.map {|e| e.to_s }.include?(meth_name)
end
def find_rec(bar, pos, &cond)
puts " #{has_method(bar, ‚Caption‘) ? bar.Caption : has_method(bar, ‚Name‘) ? bar.Name : "Unknown"} @[#{pos.join(‚|‘)}]" if (not cond.nil? and cond.call(bar)) or true
if (has_method(bar, ‚Controls‘))
num = 1
for b in bar.Controls
find_rec(b, pos.dup << num, &cond)
num += 1
end
end
end
def find_control(&cond = nil)
exl().CommandBars.Count.times { |cnt|
next if cnt < 15
puts "[@#{exl().CommandBars(cnt+1).Name}]"
find_rec(exl().CommandBars(cnt+1), [cnt+1], &cond)
}
end
[/sourcecode]
😉
Das Skript besorgt sich über OLE eine Referenz zu einer laufenden Excel-Instanz und geht (rekursiv) durch die CommandBars-Eigenschaft. Dabei kann es optional Bedingungen beachten. Nungut, wird man denken, und was steht da drin? Das ist das Tolle: Da stehen *alle* „Knöpfe“ drin, die man in Excel klicken kann! Auch solche, die erst nachdem Excel gestartet wurde z.B. über ein AddIn zum Menü hinzugefügt wurden. Außerdem gibt das Skript „Koordinaten“ aus, die angeben, wie man die „Knöpfe“ dann später erreichen und dann natürlich auch aus einem Skript heraus klicken kann (s.o. und altes Post)..
Das kann man dann beispielsweise so nutzen, um sich einfach mal alle „Knöpfe“ mit passenden Koordinaten ausgeben zu lassen:
[sourcecode language=“ruby“]
find_control()
[/sourcecode]
Oder z.B. so, um nur Elemente angezeigt zu bekommen, die im Titel ein /calc/ haben:
[sourcecode language=“ruby“]
find_control { |c| has_method(c, ‚Caption‘) ? c.Caption =~ /Calc/i : false }
[/sourcecode]
Vielleicht findet’s ja noch jemand außer mir praktisch 😉
Schreibe einen Kommentar