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], &amp;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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.