変数のスコープと有効期間に関するVBAのやりたいことについて2つの問題があります。VBA 2変数のスコープと有効期間に関する質問
私は同じ変数を何度も何度も繰り返し使用しています。たとえば、列を日付列、cDate、またはアプリケーションとしてアプリケーションを定義する整数です。かなりの宣言セクションがあるので、私はこれをGlobalを使って別のモジュールに入れたいと思っていましたが、これはうまくいきませんでした。ここで手順のスコープをどのように設定するかは重要ですか?これどうやってするの?
Q1と同様に、変数の初期化はどうですか?具体的には、列ヘッダー(例:cDate)を検出した同じブロックをコピーして貼り付ける代わりに、それを独自の手順に入れます。私はこれを動作させるために多くの問題を走っています。私はこれが可能であると思う、多分そうでないかもしれない。
コードが必要な場合は教えてください。私は何を見たいのか教えてください。私はそれをここに投げます。 (PS-私はVBAヘルプ、MSDN、Gooleなどを通ってきましたが、ここでは理解できないことがあります)
編集:実際のものはかなり長いため、編集済みのコードを追加しています。すべてのセクションは別々の標準モジュールにあります。私は、以下のワークブックレベルで動作するグローバル宣言を読んでいたので、私はまた、各モジュール(ないここに示されている)で、Public
としてwb
、およびwrk
を宣言し、app
設定しようとした:私の宣言ここで です:
Option Explicit
Global app As Application
Global wb As Workbook
Global wrk As Worksheet
Global cInvoice As Byte
Global iEndCol As Integer
Global lEndRow As Long
Global x As Integer
Global sString1 As String
Global rng As Range
Private Sub Not_Really_a_sub()
'No code. I read that any declaration needed to be in a module
' with a procedure. I tried it with out the dummy sub also
End Sub
'green text, read me and notes
そして、呼び出していたサブ:
Dim modulevariables As Integer
Sub Calling_Sub()
'doing things
lEndRow = 1 'blah blah blah
iEndCol = 1 ' blah blah blah
app.Run "'" & ThisWorkbook.Name & "'!Header_Finder"
'Code using cInvoice etc.
End Sub
とヘッダファインダー:
Private Sub Header_Finder()
With wb.ActiveSheet
For x = 1 To iEndCol
If InStr(UCase(.Cells(x, 1)), UCase("Invoice")) > 0 Then
cInvoice = x
ElseIf .Cells(1, x) = "next thing" Then
cNextThing = x
End If
Next
End With
End Sub
を
ありがとうございました。
グローバル変数を別のモジュールに配置することはどういう意味ですか?コードを実行したときにエラーが発生しましたか? グローバル宣言と最初の列見出しルーチンを含めることができますか? – mkingston
入力は、デフォルトでコメントを送信するべきではありません。毎回。オリジナルの編集を参照してください。 – Bippy
あなたはどこにも指定していませんが、変数にアクセスする前に変数の初期化コードを呼び出すと仮定しました。 – mkingston