0

以下のコードについて質問がありました。誰かが何らかの洞察を提供できれば、私は大いに感謝するでしょう。基本的に、これは私が毎週実行するために作成しているレポートの一部です。私が抱えている問題は、参照列Kの入力サイズが可変であり、定数を入力してN / A#の束になることを嫌うことです(K行は300を超えてはなりません)。見落としているのは簡単なことだと思いますが、K2:Knを数えるものを書いて、それを範囲(q2:r2:s2:t2:qrstn)に入力しようとしました。あなたの知恵を共有してください=)

Sub Vlookup()
    Sheets(2).Select
    Range("q2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-6],table,15,FALSE)"
    Range("q2").Select
    Selection.AutoFill Destination:=Range("q2:q300"), Type:=xlFillDefault
    Range("r2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-7],table,16,FALSE)"
    Range("r2").Select
    Selection.AutoFill Destination:=Range("r2:r300"), Type:=xlFillDefault
    Range("s2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-8],table,17,FALSE)"
    Range("s2").Select
    Selection.AutoFill Destination:=Range("s2:s300"), Type:=xlFillDefault
    Range("t2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-9],table,18,FALSE)"
    Range("t2").Select
    Selection.AutoFill Destination:=Range("t2:t300"), Type:=xlFillDefault
4

3 に答える 3

2

あなたの質問を正しく理解したことを願っています

以下はQ2:QN、Nが列Qで最後に使用されたセルである範囲を自動入力します

Selection.AutoFill Destination:=Range(Range("K2"),Range("K2").End(xlDown)).Offset(ColumnOffset:=6), Type:=xlFillDefault

最大値が固定されているため、逆の方法で行うこともできます。

Selection.AutoFill Destination:=Range(Range("K2"),Range("K301").End(xlUp)).Offset(ColumnOffset:=6), Type:=xlFillDefault

1 つ目はシートの最後の行を調べ、2 つ目はシートの最大行から最後の行まで調べます。

多くの列に対して同じことを行うように見えるので、Qを必要な列に置き換えることができます!

アップデート

例を更新しました。K 列で使用されている範囲が検出され、目的の列にオフセットされます。の値は、数式ColumnOffsetで使用される値と同じ (正の値ですが) になります。R1C1

また、K Range は一定のままである必要があり、数式はかなり予測可能であるため、少し短くすることができます。次のように(私はそれをテストしていません、ただ遊んでいます)

Sub Vlookup() ' might want to re-name, to avoid confusion with the worksheet function
Dim R As Range
Dim A As Range
Dim I As Integer

  Set R = Range(Range("K2"), Range("K301").End(xlUp))
  Set A = Range("K2")

  For I = 6 To 9
    A.Offset(ColumnOffset:=I).FormulaR1C1 = "=VLOOKUP(RC[-" & CStr(I) & "], table, " & CStr(I+9) & ", FALSE)"
    A.Offset(ColumnOffset:=I).AutoFill Destination:=R.Offset(I), Type:=xlFillDefault
  Next I

End Sub
于 2013-02-24T01:55:43.537 に答える
1

FormulaR1C1を使用する場合は、記入する必要はありません。数式を全範囲に適用できます。これが例です。

Sub MakeVlookup()

    Dim lRows As Long, lCols As Long
    Dim rCell As Range
    Dim rRef As Range

    'Set the first cell of the reference column
    Set rRef = Sheet1.Range("K2")

    'Count the rows of the reference column
    lRows = Sheet1.Range(rRef, rRef.End(xlDown)).Rows.Count

    'Loop through the row 2 cells where you want the formula
    For Each rCell In Sheet1.Range("Q2:T2").Cells
        'Compute the offset back to the reference column
        lCols = rCell.Column - rRef.Column
        'Write the formula to the whole range
        rCell.Resize(lRows, 1).FormulaR1C1 = _
            "=VLOOKUP(RC[-" & lCols & "],Table1," & rCell.Column - 2 & ",FALSE)"
    Next rCell

End Sub
于 2013-02-24T15:24:27.300 に答える
1

異なる数式で各列をループしたりアドレス指定したりする必要はありません!

これらの式の代わりに:

列 Q: =VLOOKUP(K2,table,15,FALSE)
列 R: =VLOOKUP(K2,table,16,FALSE)
...

あなたは単に使用することができます

=VLOOKUP($K2,テーブル,COLUMN()-2,0)
すべての列で 1 つの数式として! $K2(in R1C1: ) (in R1C1 , , ...)RC11の代わりに、列 K を保持します。実際のセルの列番号、つまり、列 Q = 17、R = 18 などを返します。これにより、私のような怠け者の入力が減りますが、結果は同じになります. :-) )。K2RC[-6]RC[-7]COLUMN()FALSE0

したがって、マクロを次のように減らすことができます。

Sub MakeVLOOKUP
    Sheets(2).Range("Q2:T300").FormulaR1C1 = "=VLOOKUP(RC11,table,COLUMN()-2,0)"
End Sub

そして同じ結果を達成します。

ディックのソリューションのように範囲を柔軟にしたい場合は、次のようにすることができます。

Sub MakeVLOOKUP
    Sheets(2).Range("Q2").Resize(Sheet1.Range("K2").End(xlDown)).Rows.Count-1,4).FormulaR1C1 = _
        "=VLOOKUP(RC11,table,COLUMN()-2,0)"
End Sub
于 2013-02-24T19:38:38.417 に答える