ブー - エクセルオートメーション、トラブルの選択範囲
-
11-09-2019 - |
質問
私はブーを調査し、(この例では、2007)Excelを自動化する由緒あるVBスクリプトのカップルを変換しようとする有用な運動だろうと思っています。物事の多くは、しかし、私はトラブルの範囲を選択するの膨大な量を抱えている、非常に簡単に翻訳しているようだ - 私はそれらを取得または設定しようとする時はいつでも私が見つかりませんに、TargetInvocationExceptionメンバーを取得
。ここで私はbooishで実行した(削減)の例です
def CreateInstance(progid):
type = System.Type.GetTypeFromProgID(progid)
return type()
xl as duck = CreateInstance("Excel.Application")
xl.Visible = true
xl.Workbooks.Add
sht as duck = xl.ActiveSheet
#Next line throws exception
rng as duck = sht.Range("A1")
特定の物事には、そのようなので、上のシートのNameプロパティを設定して、正常に動作しますが、どのように私は範囲で動作しますか? VBは、私が呼び出す必要があり、たいことを隠していくつかの特別な方法があります。もしそうならどのように私はそれらを見つけるに行くか?
乾杯、
レニーます。
解決
の範囲は、実際にはプロパティであり、そしてそれがarray-たことを意味または辞書のようなセマンティクスインデクサーとして働くことで、それはやや特殊なプロパティです。ほとんどの言語では、それはあなたがsht.Range["A1"]
にアクセスしたいということを意味します。これはシンタックスシュガーであり、実際にそれはつまり、単に他の方法と同様にアクセスしています。
sht.get_Range("A1",System.Reflection.Missing.Method)
私はシンタックスシュガースタイルと明示的なメソッド呼び出しの両方を使用して、あなたのコードを繰り返すためにブー、RubyとIronRubyのを使用しようとしました。 IronRubyので、私はそれが完璧に仕事を得ることができますが、の32ビットのみインタープリタでの。私の設定の32ビットアプリケーションである通常のルビー、で、それもうまく働きました。 64ビット・インタプリタでは、Rangeプロパティが正しく解決されませんでした。
だから、そのためブーインタラクティブシェルは64ビットモードで実行していたし、その相互運用が失敗していたことを疑うに私を導きました。残念ながら、同じ問題がCORFLAGS.exeを使用して32ビットモードで実行するために私の地元のブーバイナリを設定後に再生ので、私はそれが本当の問題はないと思う。
の仕事をやった、しかし、そのように、明示的にエクセルDOTNET相互運用ライブラリだけでなく、相互運用サービスの名前空間をインポートしました
import Microsoft.Office.Interop.Excel
import System.Runtime.InteropServices
xl_type=typeof(Application).GetCustomAttributes(typeof(CoClassAttribute),true)[0].CoClass
xl=xl_type()
xl.Visible=true
xl.Workbooks.Add
するとます:
xl.Range["A1","A2"].Value=12
xl.Range["A1",System.Type.Missing].Value="Alpha"
(xl.ActiveSheet as Worksheet).Range["A1","A2"].Value2='Whatever'
これらの作業のすべてが、彼らは基本的にあなたがからに慣れている「Scriptiness」を放棄する必要が遅延バインディング(あなたのダックタイピングがやっていることである)。
ほとんどの言語のための真(C#4.0以外)であるVB / VBScriptのから1つの違いは、あなたが方法を扱うときに、より慎重にAPIを見て必要があると思いますので、一般的に、オプションのパラメータは、透過的に処理されていない、ということですそのサポートオプションのパラメータ(System.Type.MissingまたはするSystem.Reflection同等に置き換えます)。あなたはそれを見ているよりも簡単にすることを発見した場合、あなたはおそらくオプションとしてマークパラメータを識別するためにリフレクションを使用することができますが、あなたは、Excelの相互運用機能のドキュメントを介してこれを見つけると思います。
Rubyは遅く、これらのオブジェクトを結合するための合理的な解決策を持っているので、私は不足している機能(またはバグ)がブーでCOM相互運用機能のシナリオにあります疑います。
を追加する編集:<のhref = "http://blogs.msdn.com/samng/archive/2009/11/03/com-interop-in-c-4-0-indexed-properties.aspx" rel =「nofollowをnoreferrer」>サムンは、C#4.0 の中でインデックス付きプロパティのサポートについて書いています。彼の記事で説明している問題は、おそらく同様、ブーに適用されます。