7

次のようなシートを含む Excel ワークブックがあります。

Apple    |    15    |    Bob
Banana   |    20    |    Tim
Apple    |    19    |    Mary
Banana   |    25    |    Kate

最初の列に「Apple」がある最初のシートの行のみを表示する別のシートを作成したい:

Apple    |    15    |    Bob
Apple    |    19    |    Mary

ある意味で、これは SQL SELECT クエリに類似しており、最初のテーブル (シート) 内の特定の値を持つすべてのエントリを選択します。

問題は、2 番目のシートを常に維持する必要がないことです。最初のシートを変更すると (たとえば、最初の行の "Apple" を "Grape" に変更すると)、2 番目のシートが自動的に更新され、"Apple" の行のみが表示されるようになります。この例では、"Mary" のみが表示されます。行が表示されます。

これは一般的に便利な機能のようです。Visual Basic スクリプトを使用せずにこれを行うことは可能ですか?

4

2 に答える 2

5

これは複雑な非配列標準式で行うことができますが、将来の追加/削除/変更を自動的に補正するために、最初に返すものを超えて数行を埋める必要があります。

        条件付きで 1 行目、2 行目、3 行目を一覧表示する

このサンプルのスペースを節約するために、ターゲット テーブルをソース テーブルと同じワークシートに配置しましたが、式のセル範囲参照を調整して、どれがどれであるかを簡単に判別できるようにしました。

まず、 Appleを E4 に入力してから、この数式を F4 に入力します。

=IF(LEN($E4), IFERROR(INDEX('first sheet'!B$1:B$999, SMALL(INDEX(ROW($1:$999)+('first sheet'!$A$1:$A$999<>$E4)*1E+99, , ), ROW(1:1))), ""), "")

その権利を G4 まで埋めてから、F4:G4 を 1 行下の F5:G5 まで埋めます。この式を E5 に入れます。

=IF(COUNTIF('first sheet'!A:A, E4)>(COUNTIF(E$4:E4, E4)), E4, "")

ここで E5:G5 を埋めて、元のワークシートから返されるすべての可能性 (およびいくつかの行) をキャッチします。

新しい果物の値を E4 に入力すると、返されるデータの性質が即座に変わります。

これに関する計算はそれほど複雑ではなく、ソース データを指すセル範囲は数千行を簡単に処理できるはずですが、ソース データが大きくなるにつれて計算の遅延が見られるようになります。

一部のユーザーは、 COUNTIFまたはCOUNTIFS 関数に対して条件付き書式チェックを使用して、可能なすべての行を収集していることを確認しています。これは、すべての結果を取得するのに十分な数式がないことを示します。そのようなものを実装することは、厳密にユーザー次第です。それがあなたが使用したいものである場合は、詳細を投稿してください。

そのサンプル ワークブック (ソース ワークシートとターゲット ワークシートが異なる) を Office キャスト ( Excel_Formula_to_Mimic_SQL_Query.xlsx ) に置きました。

于 2015-04-26T02:07:38.123 に答える
0

以下のコードを sheet1 コード セクションにコピーします。

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False

    On Error Resume Next

    Dim lastRow As Long
    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    Dim rng As Range, cell As Range
    Set rng = Range("A1:A" & lastRow)

    Sheets("sheet2").Cells.Clear
    If Not Intersect(rng, Target) Is Nothing And Target.Value <> "" Then
        For Each cell In rng
            If Trim(LCase(cell.Value)) = Trim(LCase(Range("A1"))) Then
                With Sheets("sheet2")
                    cell.Resize(, 3).Copy .Cells(.Range("A" & .Rows.Count).End(xlUp).Row + 1, 1)
                End With
            End If
        Next
    End If

    Application.EnableEvents = True
End Sub
于 2013-05-25T03:21:52.750 に答える