問題タブ [vbe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
excel - VBA Excel - 範囲内でコマンドを実行する - 他のブックとやり取りする
私はしばらくの間、これを理解する方法を試してきました。ほとんどの人がコードを変更できるようにしたくないので、vba プロジェクトをロックしました。問題は、ユーザー入力に基づいて他のモジュールを変更するコードがあることです。ロックされているモジュールは変更できないため、明らかに問題が発生します。私が「sendkeys」をしない方法なので(笑)、コードを変更できるようにロックを解除する実際的な方法はありません。
そこで、.xlam アドインを作成しました。モジュールは新しいコードをファイルに書き込み、それを .bas タイプとして保存してから、アドインがそれをインポートして実行します。
しかし...
ワークブック (.xlam アドインのモジュールを生成したもの) とのやり取りに問題があります。以下は、私がトリッキーだと思っているコードの部分です。これは主に、自動入力の実行と、ワークブックでのフォームの更新に関連しています。
これらが主な問題です。個人的には、ワークシートから直接コードを実行したいのですが (つまり、Range("A1") のようなものを実行するモジュールを考えます - "msgbox someString" のように)、これが可能かどうかさえわかりません。これはかなり前から気になっていた
#1 と #2 など、構文がどうあるべきかについての指針 - および/またはシートからコードを直接実行する方法に関するアイデア、それによって頭痛をすべて回避しますか?
excel - ユーザーフォームにデータをロードするために VBA エディターを開く必要があるのはなぜですか?
VBA マクロがデータをユーザーフォームにロードする Excel ファイルがあります。
エディターを開かずに実行すると、Excel がクラッシュして終了することがあります。
最初にエディターを開く必要がないようにファイルを修正するにはどうすればよいですか?
マクロのサンプル コード:
c# - `ThisWorkbook` が `Workbook` であることをどのように知ることができますか?
私は VBIDE API を使用していますが、ホスト アプリケーションが Excel である、または Office アプリであるとは想定できません。
だから私が知っているのは、私が を見ていることVBComponent
、そしてそれが であることだけType
ですvbext_ct_document
。
VBE の即時ペインで、次の出力を取得できます。
But the Sheet1
object only exists in the runtime environment, so if I'm a C# add-in I don't even see it.
The only thing that gets anywhere close to what I need, is via the Parent
and Next
properties of the component:
This gets me the type names I'm after... but on the wrong component! And for ThisWorkbook
, which is the top-level document object, I get the Application
object as the Parent
:
このアプローチは潜在的に有用ですが、ホスト アプリケーションが Excel の場合、「アプリケーション」タイプの「親」プロパティを持つコンポーネントがインスタンスであることを認識しているホスト固有のロジックをハードコードする場合に限りWorkbook
ます。他のホストの他のドキュメント モジュールもその「親」プロパティを持っているので、私はほとんど困惑しています。
p/invoke 呼び出しや低レベルの COM "リフレクション" マジック (魔法のようなもの) から ... から ... わからない -コメントが必要なファンキーなポインターを含むコード-実用的なソリューションになる可能性のあるリードは大歓迎です。ITypeInfo
unsafe
// here be dragons
私の知る限り、VBEアドインはホストと同じプロセスに存在するため、VBAプロジェクトのどこかにポインタがThisWorkbook
ありSheet1
、その他のドキュメントタイプがあります。VBComponent
どうにかしてそのポインターをつかむ必要があり、必要な場所にいると思います。
c# - MS-Access フォームでコントロールを反復するにはどうすればよいですか?
を指定すると、そこからコレクションにVBComponent
アクセスできるメソッドがあります。.Designer
.Controls
この方法の問題点は、ホストが MS-Access の場合、form.Designer
がnull
であるため、メソッドが早く戻ることです。
ここでのdynamic
キャストは特に有用ではありません。インターフェイスにキャストできるようUserForm
で、少なくとも Excel ホストでは「うまく機能する」ようです。
しかし、MS-Access のフォームにはデザイナ (???) がないため、VBE アドインである C# コード (つまり、何にでも簡単にしかアクセスできない) が与えられた場合、MS-Access フォームでコントロールを反復するにはどうすればよいですか? VBIDE API が利用可能になります)?
vba - このコードを貼り付けるとコンパイルされるのに、それ以外の場合は失敗するのはなぜですか?
友人が私にこのページを見せてくれ、フォーラム ユーザーの 1 人の署名に奇妙なコードがあることに気付きました。
コードは次のようなワンライナーです。
スクロールが削除されました:
On Local Error Resume Next: If Not Empty Is Nothing Then Do While Null: ReDim i(True to False) As Currency: Loop: Else Debug.Assert CCur(CLng(CInt(CBool(False Imp True Xor False Eqv True))) ): 停止: On Local Error GoTo 0
驚くべきことに、有効なプロシージャ レベルのスコープにそのまま貼り付けるだけで (そして、もう一度触れないでください!)、そのコードはコンパイルされます (実行しようとはしませんでしたが、それは無関係です)。
いくつかの観察:
- 命令の区切り記号/コロンが新しい行に置き換えられると、コンパイルされなくなります
On Local Error
に簡略化できますOn Error
- ネストされた変換は一見特に興味深いものではありませんが、その一連の変換と比較を単純なものに置き換えると
Debug.Assert True
、コードが一貫してコンパイルされるようになるため、コンパイラが混乱していることがわかります。 - コードが貼り付けられると、コンパイルされます。VBEが行を検証した後に何らかの方法で(単に削除しても
Local
)変更された場合、コンパイルが停止し、行が削除されて再貼り付けされない限り、VBAにそれを理解させるものは何もないようです。 - 最新のラバーダックの文法/パーサーは、実際の VBA 仕様に基づいて厳密にモデル化されており、問題なく解析および解決されます(これには正直驚きました)。
- 行がコンパイルされないことがわかっている場合、カット/再貼り付けしてもコンパイルされません... しかし、VBE の外部から再度貼り付けると、突然コンパイルされます。
問題は、このコードが VB 言語仕様に対してどのようにコンパイルされるのかということです。VB[6|A|E] 実装のバグですか? 言い換えれば、なぜ/どのように機能するのですか?
命令区切り文字 ( ) と inline-if 構文に関係があると思います。ステートメントがない場合、ブロックではなく 1 行になります。:
End If
しかし、では、その特定のコードがシュレディンガーのコードである理由は何でしょうか? それを同時に合法と違法にするのは何ですか?
正式な文法定義 (ANTLR) を使用して生成されたパーサーによってコードが正しく解析される場合、それは正当な構造である必要がありますか? それでは、単にその行に戻って ENTER を押すだけで、合法でなくなるのはなぜですか?
vba - 複数の VBE ウィンドウを開く (プロジェクトごとに 1 つ) - Word VBA
Word で作業を行う VBA のプロジェクトがいくつかあります。
問題は、現在、私が開いているすべてのプロジェクトが VBE の同じウィンドウにあるということです。開いたプロジェクトごとに 1 つの VBE ウィンドウが表示されるように、VBE の複数のウィンドウを開きたいと思います。
これを行う理由は、1 つのプロジェクトを左側のモニターに、別のプロジェクトを右側のモニターに表示したいからです。このように、両方を同時に見ることができます。
これを行う方法はありますか?(Google からは回答が得られませんでした)
編集:私が持っているプロジェクトはすべて.dotm
ファイルであることを追加するかもしれません(VBAを含むWordファイルのタイプを保存する唯一の方法です)。
編集 2: Microsoft Office Professional Plus 2013 を使用しています。基本的には Word 2013 です。
ANSWER : Cindy Meisterの回答 (以下の引用または彼女のコメントを参照) は、私が必要としていたとおりに機能しています。
Word で新しいインスタンスを開くには、特別なトリックが必要です。インストールの既定では、許可されていません。1 つの方法は、コマンド ラインから /n スイッチを使用することです: filepath\winword.exe /n もう 1 つの方法は、マクロで New キーワードを使用することです。
Dim wdApp As Word.Application: Set wdApp = New Word.Application: wdApp.Visible = True
vba - Access VB Editor - モジュールの更新時に非表示にする方法は?
ユーザーに VBE を表示することは避けたいと思います。
シナリオは次のとおり です。組織全体で使用される 2010 *.accdb にアクセスします。ユーザーがデータベース アプリケーションを開くと、モジュールの 1 つが更新され、データベース内のテーブルの情報に基づいて再保存されます。これはうまくいきます。
使用するシステムは Windows 7 & 10 です。
問題 上記のモジュールを (VBA 経由で) 更新および保存すると、VBE が開き、表示されます。
これまでのところ 、モジュールを更新して保存した後、次のコードを追加しました。
残念ながら、これは VBEがユーザーに明確に表示された後にのみ非表示になります。そのため、かなり不格好に見えます。
モジュールを操作し、VBE が表示されないようにする方法についてのアイデアはありますか?
よろしくお願いします。
vba - MS Access: 保護された VBA コードにアクセスして、「予期しないエラー 40230」を回避するにはどうすればよいですか?
私の先駆者は、.accdb と .accde ファイルで構成される AccessDB を構築しました。DB (.accdb ファイル) はネットワーク ドライブに保存され、各ユーザーはフロントエンド ファイル (.accde) をコピーして DB にアクセスして操作する必要があります。データベースはパスワードで保護されていません。レポートの生成には埋め込み VBA コードが使用されており、バグやエラーがいくつかあります。だから私は彼らの世話をしなければなりません。VBA コードはパスワードで保護されており、もちろん彼は誰にも明かさずに立ち去りました。
ここで、VBE を開こうとするたびに (Alt+F11 またはメニューの [データベース ツール] - [Visual Basic] を使用)、「予期しないエラー 40230」という警告が表示されます (数回、フォームとレポートごとに 1 つずつ)。 )。警告をクリックして VBE を開くことはできますが、コードが表示されません。
VBE で自分のプロジェクトのプロパティを開こうとしましたが ("Tools" > "'MyProject' Properties...")、できません。ここでパスワードが必要です!
VBAコードにアクセスするのに役立つアイデアはありますか? どうもありがとう!あなたの助けに本当に感謝します!
vba - IDE アドインで VB6 または VBA-IDE 環境関連のリファレンスを作成しますか?
Microsoft "Visual Basic 6.0 Extensibility"への参照を持つVB6_IDE_Add_Inを VB6 で正常に作成しました。ただし、このアドインを VBA IDE (Excel、Access) で使用するには、VB6_IDE_Add_In プロジェクトのコピーを作成し、名前をVBA_IDE_Add_Inに変更し、そのプロパティの名前を変更する必要がありました。アプリケーションの拡張性 5.3" .
最後に、VB6 用と VBA 用の 2 つの dll があります。どちらも"regsvr32"を実行し、 VBA-IDE-Add-Inレジストリ キーを VB6 キー"[HKCU\Software\Microsoft\Visual Basic\6.0\Addins]"から VBA キー[HKCU\Software\Microsoft\ ]に手動で移動する必要があります。 VBA\VBE\6.0\アドイン] ...
条件付きコンパイルまたはコマンド ライン パラメータを使用して、VB6 または VBA 環境に応じて右参照を使用する単一の dll をコンパイルする方法はありますか?
残念ながら、これは私の最初のアドインであり、この件に関しては私の経験では不十分です...