2

私はワークブックの怪物を持っており、私の後にそれを使用する人のために、より扱いやすくしようとしています。ボタンが押されたときに実行される大量のコードがあり、Excel をほとんどまたはまったく知らない人にとってより使いやすくなっています。だからここで私は助けが必要です。

同様のテーブルを含むシートがいくつかあります。私の最初のシートには、顧客情報のマスター リストが含まれており、ボタンを押すと、この情報が他のシートにコピーされ、それぞれのシートでこれらの顧客を分類するために並べ替えられます。これにより、最初のシートにのみ新しい情報を入力し、シートを正しく自動入力して人的エラーを最小限に抑えることができます。

多くのエラーを減らすために、テーブルで構造化参照を利用しました。私はもともとこの方法を持っていませんでしたが、時間をかけてこのワークブックを改善しようとしてきました. とにかく、各テーブルに「料金タイプ」列があり、合計列はそれを次のように参照します

    [@[Charge Type]]

顧客がかなり定期的に追加および削除され、これによりエラーが削減されることを考えると、これは素晴らしいことです。

ただし、この数式が他のシートの 1 つにコピーされると、次のように変換されます。

    All_List[@[Charge Type]]

「All_List」であるシート1にテーブルの名前を追加します。今、私はそれが新しいシートの新しいテーブルで特に「Charge Type」列を参照するようにしたいのですが、私の人生ではその方法を理解することはできません.

4

1 に答える 1

0

このソリューションでは、変数を使用してListObject "Field"式を保持し、同じ"Field"ListObjectsを持つ同じワークブック内の他のすべてをループして、式をその"Field"に適用します。

前のListObjects

Sub ListObjects_Formula_Copy()
Dim wsh As Worksheet
Dim lob As ListObject
Dim rTrg As Range
Dim sFld As String
Dim sFmlR1C1 As String

    Rem Get Formula from Primary ListObject
    sFld = "Price"                                                      'Change as required
    Set lob = ThisWorkbook.Sheets("Sht(0)").ListObjects(1)              'Change as required
    sFmlR1C1 = lob.ListColumns(sFld).DataBodyRange.Cells(1).FormulaR1C1

    Rem Apply Formula to Other ListObjects
    For Each wsh In ThisWorkbook.Worksheets
        If wsh.Name <> "Sht(0)" Then
            For Each lob In wsh.ListObjects
                Rem Validate Field
                Set rTrg = Nothing
                On Error Resume Next
                Set rTrg = lob.ListColumns(sFld).DataBodyRange
                On Error GoTo 0
                Rem Applies Formula
                If Not (rTrg Is Nothing) Then rTrg.FormulaR1C1 = sFmlR1C1
    Next: End If: Next

End Sub

後のListObjects ここに画像の説明を入力

于 2016-11-26T15:00:05.200 に答える