web-dev-qa-db-ja.com

VBA-無効または未修飾の参照エラー

私はExcelテンプレートを作成しようとしています(データの量はケースごとに異なります)、それは次のようになります:

enter image description here

すべての偶数行には「顧客」があり、すべての奇数行に「元帳」を配置したいと思います。基本的には、列Cにデータが存在するようになるまで、すべての奇数行に「元帳」を配置する必要があります。次のコードがあります。

'========================================================================
' INSERTING LEDGERS for every odd row (below Customer)
'========================================================================

Sub Ledgers()

    Dim rng As Range
    Dim r As Range
    Dim LastRow As Long

    LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
    Set rng = .Range("C5:C" & LastRow)

    For i = 1 To rng.Rows.Count
        Set r = rng.Cells(i, -2)
        If i Mod 2 = 1 Then
            r.Value = "Ledger"
        End If

    Next i

End Sub

しかし、それは私にエラーメッセージを与えます無効または修飾されていない参照。エラーが発生した場所を教えてください。

どうもありがとう!

6
Srpic

コマンドが.のように.Cellsで始まる場合は、次のようなwithステートメント内にあると想定します。

With Worksheets("MySheetName")
    LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
    Set rng = .Range("C5:C" & LastRow)
End With

したがって、セルが含まれると予想されるワークシートの名前を指定する必要があります。

モジュールの上部でOption Explicitを使用して、すべての変数を宣言することを強制するのは良い考えではありません(i As Longの宣言に失敗しました)。

あなたのコードは…に減らすことができます

Option Explicit 

Public Sub Ledgers()
    Dim LastRow As Long
    Dim i As Long

    With Worksheets("MySheetName") 
        LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row

        'make sure i starts with a odd number
        'here we start at row 5 and loop to the last row
        'step 2 makes it overstep the even numbers if you start with an odd i
        'so there is no need to proof for even/odd
        For i = 5 To LastRow Step 2 
            .Cells(i, "A") = "Ledger" 'In column A
            '^ this references the worksheet of the with-statement because it starts with a `.`
        Next i
    End With
End Sub
7
Pᴇʜ

ステップ2でループして、インデクサー変数の1行おきに行を取得します。

Sub Ledgers()
    Dim rng As Range
    Dim LastRow As Long

    LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "C").End(xlUp).Row
    Set rng = ActiveSheet.Range("C5:C" & LastRow)

    For i = 1 To LastRow step 2
        rng.Cells(i, 1) = "Ledger" 'In column A
    Next i
End Sub
0
Rik Sportel