0

私はほとんどコードを機能させましたが、まだ2つの問題があります(とにかく2つの主要な問題)。

1) 絶対セル参照。Excelのように機能しません。たとえば $A5 が必要ですが、A6 A7 などに変更する代わりに、ループ全体で A5 のままです。

2) スキップする必要がある 3 番目の列があります。%UTIL ではなく、VOL および CAP の下の列に書き込むためのループのみが必要です。ループに $UTIL をスキップするように指示するにはどうすればよいですか?

代替テキスト

Option Explicit
Dim myRange As Range

Function numberOfRows() As Integer
    Debug.Print ("Start test")

    ThisWorkbook.Worksheets("LCI").Range("A9").Select

    Set myRange = Range(Selection, Selection.End(xlDown))

    Debug.Print ("Rows: " & myRange.Rows.Count)

    numberOfRows = (myRange.Rows.Count)
End Function

Function numberOfColumns() As Integer
    Debug.Print ("Start test")

    ThisWorkbook.Worksheets("LCI").Range("B8").Select

    Set myRange = Range(Selection, Selection.End(xlToRight))

    Debug.Print ("Columns: " & myRange.Columns.Count)

    numberOfColumns = (myRange.Columns.Count)
End Function

Sub TieOut(ByVal numberOfRows As Integer, ByVal numberOfColumns As Integer)
    Dim i As Integer 'i is row
    Dim j As Integer 'j is column

    For i = 1 To numberOfRows  'Loop over rows
       For j = 1 + 2 To numberOfColumns  'Loop over columns
        ThisWorkbook.Worksheets("Loop").Select
            With ThisWorkbook.Worksheets("Loop")
                **.Cells(i + 3, j + 1).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),4)"
                .Cells(i + 3, j + 2).Value = "=INDEX('ZAINET DATA'!$A$1:$H$39038,MATCH(Loop!B$2&TEXT(Loop!$A4,""M/D/YYYY""),'ZAINET DATA'!$C$1:$C$39038,0),5)"**
            End With
        Next j
    Next i
End Sub

Sub Test()
    Dim x As Integer
    Dim y As Integer
    x = numberOfRows()
    y = numberOfColumns()

    Call TieOut(x, y)
End Sub
4

2 に答える 2

0

これは、「スコープ」とは何かを学ぶ良い例です。作成しようとしている範囲のような変数を宣言 (または作成) します。これは、作成したマクロ (またはサブ プロシージャ) 内に存在します。ただし、サブ プロシージャが終了すると、変数には存在する場所がなくなり、削除されます (コンピューターのメモリから削除されます)。

残念ながら、マクロをコーディングした方法では、期待どおりに動作しません。あなたの myRanges は、End Sub に到達するたびに消滅します。

また、引数 (byvals) を別のサブ プロシージャ (この場合は TieOut) に渡すときは、適切な数の引数を指定する必要があります。現在、TieOut 手順には 2 つ必要です。次々と追い越すことはできません。正しい方法は次のようになります。

Call TieOut(myRange.Rows.Count, myRange.Columns.Count)

また、TieOut2 という名前のプロシージャを呼び出そうとしています。タイプミスかどうかはわかりませんが、プロシージャ名を正しくすることは重要です。

私の意見では、VBA は非常に強力で、学ぶ価値があります。あなたは表面をひっかいているように見えます。私は間違いなくオンラインでいくつかの VBA チュートリアルを検索します。プロシージャの呼び出し、変数の宣言、およびスコープに集中すれば、問題を解決できることを保証します :D

于 2009-07-15T20:00:28.833 に答える
0

どこで定義しましたか?BASモジュールの一部ですか?

編集: BAS モジュールの最初の行として Option Explicit を配置してコンパイルします ([デバッグ] メニュー -> [コンパイル])。
コンパイル エラーがあることがわかります。

Dim myRange As RangeMacro1 & Macro2 から削除します。
BASモジュールの先頭に配置します(オプションの明示的な後)

注: SUB の一部として定義された変数がある場合、他の SUB/関数はそれを使用できません。TieOut が myRange を使用するには、すべての SUB で使用できるスコープで定義する必要があります。

また、Macro1 を最初に実行する必要があります - MyRange に値を割り当てます (つまり、Set MyRange = .....)
。Macro1 が実行されていない場合、MyRange は値を保持しないため、コードがプロパティを読み取ろうとするとランタイム エラーが発生します。 (MyRange.Rows.Count)。

変数のスコーピングについて読んでください。
変数から読み取ろうとする前に、変数に何らかの値を保持する必要があります。

于 2009-07-15T18:42:49.270 に答える