2016-12-27 30 views
0

ループ内で相対参照を使用しようとしています。私の目的は、インデックスとマッチを組み合わせて、ファイルにいくつの行と列が存在するかに関係なく値を見つけることです。これは私がこれまでに作成したものですが、うまくいきません。データは、2つの異なるシートに格納されたものと同じです。これは禁止されてWorksheetFunctionクラスVBA:ループ内の相対セル参照

  1. サブテスト()

    Dim ActSor As Long, ActOsz As Long 
    
    ActSor = ActiveSheet.UsedRange.Rows.Count 
    ActOsz = ActiveSheet.UsedRange.Columns.Count 
    
    Dim ws1 As Worksheet, ws2 As Worksheet 
    
    Set ws1 = Sheets("Sheet1") 
    Set ws2 = Sheets("Sheet2") 
    
    Dim Rg As Range 
    
    Set Rg = ws2.Range("B2", Cells(ActSor, ActOsz)) 
    
    Dim RgActOsz As Long 
    
    RgActOsz = Rg.Columns.Count 
    
    Dim i As Long , sor As Long 
    
    For i = 2 To RgActOsz 
        For sor = 2 To ActSor 
         Cells(sor, i).Value = Application.WorksheetFunction.Index(ws1.Columns(i), 
         Application.WorksheetFunction.Match(Cells(sor, 1), Rg.Columns(1), 0)) 
        Next sor 
    Next i 
    
    End Sub 
    
+2

「Match」が成功しない場合に備えて、エラーをトラップする必要があります。 –

+0

助けてくれてありがとう。 2枚のシートは同じもので、テスト目的でのみ作成されます。つまり、両方のシートにすべての値が表示されます。この場合もエラーをトラップする必要がありますか? –

+0

実際には、あなたのコードのどこかにロジックエラーがあるだけではありません。私のコードでは、テキストの末尾に余分なスペースがある場合や、私が行ったかもしれないその他の不具合がある場合に備えて、とにかくそれをトラップします –

答えて

1
Set Rg = ws2.Range("B2", Cells(ActSor, ActOsz)) 

の同じプロパティを取得することができません

Error msg: Run-time error '1004': 

。正しい構文:

Set Rg = Range(ws2.Range("B2"), ws2.Cells(ActSor, ActOsz)) 

これは役に立ちますか?

+0

助けてくれてありがとう。いいえ、まだ同じエラーメッセージです。 –

0

Range()オブジェクトを使用するたびに暗黙のActiveSheet.Range()コマンドが使用されます。値を取得したいシートがアクティブでない場合、Range()コマンドは間違った結果を返します。

私の提案:

  1. ws1.Range()のように、適切なワークシートオブジェクトとすべてのRange()の機能を修飾します。
  2. 範囲のあるテーブルの左上のセルを選択し、Resize()コマンドを使用してテーブルに拡張します。たとえば、セルA2と次の100行20列を選択するには、ws1.Range("A2").Resize(100,20)を使用します。
  3. Cells()の代わりに、暗黙のアクティブなワークシートもあります。既存の範囲を使用し、Offset()コマンドを使用します。 20列は、それらが細胞に移動するので、セル参照を選択するセルA2使用Range("A2").Offset(i-1,0).Resize(1,20)
  4. 使用named rangesから始まるテーブルのI行目を選択します。たとえば、Range("AccountsTable").Offset(i-1,0).Resize(1,20)
+0

help @ Ja72ありがとうございます。ユーザーは元のシートを変更できます - 列を追加することができます - そのため、オフセットやサイズ変更のbacauseを使用したくないので、毎回コードを変更する必要があります。vloopupまたはインデックスとマッチを使用するループコードを書くことは可能ですか?エラートラップがまだ存在しないことを知っています - カラムAの値をチェックしてからカラムの値を返します。 10番目の列の値と100がある場合、100番目の? –

+0

[Named Ranges](https://support.office.com/en-us/article/Define-and-use-names-in-formulas-4d0f13ac-53b7-422e-afd2)を使用してこれを処理する方法-abd7ff379c64)を使用して、絶対的な場所を決して参照しないようにします。私は私の答えを編集します。 – ja72

+0

私はこのように解決できるかどうかわかります。先端に感謝します。 –

関連する問題