2009-07-15 7 views
0

私は自分のコードを稼働させましたが、それでも2つの問題があります(とにかく2つの大きな問題があります)。ループ作業で絶対セル参照を行い、ループ内の列をスキップする方法はありますか?

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

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

alt text http://i27.tinypic.com/2dig8hu.jpg

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 

答えて

0

? BASモジュールの一部ですか?

EDIT:BASモジュール&コンパイルの最初の行にOption Explicitを置きます([デバッグ]メニュー - > [コンパイル])。
コンパイルエラーが表示されます。

Dim myRange As RangeをMacro1から削除します。& Macro2。
BASモジュールの最上部に置きます(明示的にオプションを指定した後)

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

また、Macro1をまず実行する必要があります - をMyRangeする値を代入している(つまり、設定MyRange = .....)
てMacro1が実行されていない場合、MyRangeは値&を保持しませんので、ときに実行時エラーが発生しますコードがプロパティ(MyRange.Rows.Count)を読み取ろうとします。

変数のスコープについては、しばらく時間を取ってください。
変数は、読み込む前に値を保持する必要があります。

+0

My numberOfRows = Macro1から返された数値numberOfColumns = Macro2から返された数値 – Techgirl09

+0

Defineとは何を意味していますか? – Techgirl09

+0

返却しないとどういう意味ですか? – shahkalpesh

0

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

あなたのコードされたマクロがあなたが働くことを望んでいるように機能しない方法です。あなたのmyRangesはEnd Subに達するたびに死にます。

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

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

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

VBAは非常に強力で、私の意見では学ぶ価値があります。あなたは表面を傷つけているように見えます。私は間違いなくいくつかのVBAチュートリアルをオンラインで検索します。D

+0

ありがとうございます。あなたが留意したすべてをチェックしてください。 – Techgirl09

関連する問題