3

したがって、Sheet1にはいくつかの名前のベースがあり、次のようになります。

ここに画像の説明を入力してください

Sheet2では、Sheet1のこれらの名前を使用しています。これは、A列にCode値を入力し、BI列にNameを入力し、CI列にLastNameを入力する方法で行っています。これは次のようになります。

ここに画像の説明を入力してください

これを数式で行い、数式バーに入力しました。列A(または名前)には次の式を使用しました:=IFERROR(VLOOKUP(A2;Sheet1!A:C;2;FALSE);"")列B(または姓)には次の式を使用しました:=IFERROR(VLOOKUP(A2;Sheet1!A:C;3;FALSE);"")。これらの数式を行20にドラッグしましたが、うまく機能しています。

さて、私がやりたいのは、これらの数式をExcel VBAコードに入れて、指定された範囲で機能するようにすることです。私はVBAを使い始めたばかりで、その中でそれを行う方法がわかりません。何かを試しましたが、機能しません...、これまでにこれを行いました。私はこのExcel/Macro / VBAに慣れていないので、助けていただければ幸いです。

4

2 に答える 2

2

私があなたの質問とコメントを正しく理解しているなら、あなたは列B&Cが常にあなたの数式に基づいて正しい値を表示することを保証したいだけでなく、ユーザーから保護したい(そしておそらく数式を隠したい)。

代わりにシート保護を使用することをお勧めします。ユーザーが編集するセルのロックを解除するだけです。つまり、列Aを選択し、[セルの書式設定]ダイアログで[保護]タブの[ロック]をオフにします。同様に、列B&Cについては、「非表示」をチェックしてください。次に、シート名を右クリックして、[シートの保護]を選択します。これが完了すると、ユーザーは列Aを編集できますが、B&Cに数式が表示されず、それらのセルを編集できません。

何らかの理由でVBAでこれを確認する必要がある場合は、次のコードを使用してください。

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False 'to prevent endless loop
    With Target.Offset(, 2 - Target.Column).Resize(, 2)
        .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,COLUMN(RC),0),"""")"
        .Value = .Value
    End With
    Application.EnableEvents = True
End Sub

これをワークシートのモジュールに配置する必要があります。

于 2013-02-17T22:00:02.770 に答える
2

以下のコードは、Code値を入力しsheet2て強調表示し、このマクロを実行すると機能します。

Selection.Offset(0, 1).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-1],Sheet1!C[-1]:C,2,FALSE),"""")"
Selection.Offset(0, 2).FormulaR1C1 = "=IFERROR(VLOOKUP(RC[-2],Sheet1!C[-2]:C,3,FALSE),"""")"
Selection.Offset(0, 1).Value = Selection.Offset(0, 1).Value
Selection.Offset(0, 2).Value = Selection.Offset(0, 2).Value

編集:入力時に値を更新したい場合は、use(@PeterAlbertに最適化を追加していただきありがとうございます!):

Private Sub Worksheet_Change(ByVal Target As Range)

    'end if the user made a change to more than one cell at once?
    If Target.Count > 1 Then End

    'stop system activating worksheet_change event while changing the sheet
    Application.EnableEvents = False

    'continue if column 1(A) was updated
    'and
    'dont continue if header or row 1 was changed
    If Target.Column = 1 And Target.Row <> 1 Then

        With Target.Offset(0, 1) 'alter the next cell, current column +1 (column B)

            'RC1 = current row and column 1(A) e.g. if A2 was edited, RC1 = $B2
            'C1:C2 = $A:$B
            .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C2,2,FALSE),"""")"
            .Value = .Value 'store value
        End With

        With Target.Offset(0, 2) 'alter the next cell, current column +2 (column C)

            'C1:C3 = $A:$C
            .FormulaR1C1 = "=IFERROR(VLOOKUP(RC1,Sheet1!C1:C3,3,FALSE),"""")"
            .Value = .Value 'store value
        End With

    End If

    Application.EnableEvents = True 'reset system events
End Sub

RCの説明:

数式のFormulaR1C1種類は、現在のセルを基準にしてセルを参照するときに使用すると便利です。覚えておくべきいくつかのルールがあります:

  • Rは行を表し、列を表し、その後Cの整数があれば、行または列を定義します。
  • 基礎として、RC式はそれ自体を参照します。
  • Rまたはに続く数字C[]、それ自体へのオフセットです。たとえば、セル内A1にいて使用するR[1]C[1]場合は、セルを参照しB2ます。
  • Rまた、とに続く任意の数字Cは正確です。たとえば、現在のセルに関係なく参照する場合は、 ;R2C2も指します。B2

C5セル内にいる場合、たとえば次のように使用Range("C5").FormulaR1C1 =してコーディングすると、事態が複雑になります。

  1. "=RC[-1]"参照セルB5
  2. "=RC1"セルを参照A5し、より正確に$A5
  3. "=R[1]C[-2]"参照セルA6
  4. "=Sum(C[-1]:C5)"です=Sum(B:E)、もっと正しく=Sum(B:$E)
于 2013-02-17T05:27:16.997 に答える