前回の質問はうまく受け入れられませんでしたが、もう一度試してみます。
Microsoft が Word/Access/Excel 用に提供する COM/Interop-Interface を使用して、多くのオフィス アプリケーションの動作を制御できるプログラムに取り組んでいます。それでも、いくつかの機能は、対処されるプログラムに固有のものであるという点で互いに異なります。
私の野心は、マクロ コードを既存の Access データベースに挿入し、データベースが開いている間にコードを実行し、データベースが閉じる前にコードを削除することです。これは、次の C# コードを使用することで、部分的に希望どおりに機能します。
VBProject found = null;
Access.Application currApplication = this._currentInstance.Application;
if (target.Equals("") || scriptText.Equals(""))
return false;
foreach (VBProject vb in currApplication.VBE.VBProjects)
{
if (currApplication.CurrentDb().Name.Equals(vb.FileName))
{
found = vb;
break;
}
}
if (found != null)
{
foreach (VBComponent foundComponent in found.VBComponents)
{
if (foundComponent.Name.Equals(target))
{
return true;
}
}
VBComponent module = found.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule);
module.Name = target;
module.CodeModule.AddFromString(scriptText);
return true;
}
else
{
return false;
}
特に、Access は、コード エディターに表示される VBA コード モジュールと、データベース自体に読み込まれるモジュールとの間で迂回を行います。モジュールをデータベースに挿入するには、もう一度保存する必要があります。GUI を使用する場合、DB に保存するときに使用する名前をポップアップ表示して尋ねるウィンドウがあります。正しいものなどはすでに取ってありますので、手でやれば大丈夫です。
手動の解決策以外に、このステップをプログラムで行う方法が見つかりませんでした。
最初の考えは次のとおりです。
currApplication.DoCmd.OpenModule(target, Type.Missing);
currApplication.DoCmd.Save(Access.AcObjectType.acMacro, target);
また
found.VBE.ActiveVBProject.SaveAs("");
私が想像できる唯一の2つの方法は、私が望んでいたステップを実行することです. .NET と互換性のある新しい形式の VBE の文書化は非常に悪いものです。ネイティブ バージョンに適用されるメソッドは、もはや無罪です。だから私は今それで立ち往生しています。
誰かが尋ねた場合、なぜモジュールを保存するのですか? VBE に挿入すると、Access にリストされている他のモジュールと同じように実行できるからです。 2回保存します。マクロの起動中に実行時エラー (2501 など) が発生しましたが、適切に保存されている場合はそうではありません。
Access-Databases に永久に保持するのは最後のオプションですが、これらは多くの MDB であり、頻繁に変更されるため、動的にするのが良いと思いました。
誰かが私がここに書いたことを理解し(私にとっては簡単ではありません)、何らかの形で助けてくれることを願っています:)
読んでくれてありがとう。最高のコミュニティからの良い結果を楽しみにしています。