0

別のワークシートで実行でき、以下のデータを参照できる式を考え出そうとしています。

基本的に、D の各セルについて上向きにチェックしたいのですが、「請求書」という文字列が見つかったら、上の次の行と列 B を選択します。基本的に、毎回会社名を見つけることになります。ご覧のとおり、各会社のレコードの行数は異なる場合があります。

もっと簡単に言えば、数式は列 B で機能し、文字列 "Status" の最初の出現のすぐ上にある文字列を返すことができます。

これがどれほど複雑かは嫌いですが、受信しているデータ形式を制御することはできず、ソースはそれを変更することを拒否しています.

元データ

    A               B               C               D
1                   ABC Widgets, Inc.
2   Account         Status          Date            Invoice
3   1423            Open            4/25/2011       123748
4   1423            Closed          5/1/2011        432741
5   1423            Open            5/2/2011        522211
6 
7                   XYZ Sprockets, Inc.
8   Account         Status          Date            Invoice
9   3222            Open            5/3/2011        529999
10

完成データ

    A               B               C               D            E
2   Account         Status          Date            Invoice      Client
3   1423            Open            4/25/2011       123748       ABC Widgets, Inc.
4   1423            Closed          5/1/2011        432741       ABC Widgets, Inc.
5   1423            Open            5/2/2011        522211       ABC Widgets, Inc.
9   3222            Open            5/3/2011        529999       XYZ Sprockets, Inc.

ヌッチ、

あなたの VBA コードを正しく動作させることはできませんが (コメントを参照)、「ステータス」の最初の出現を見つけて上の 1 セルをオフセットするこのコードを思いつくことができました。これは本質的に私がしようとしていることですが、フォーミュラ形式です。

Sub findFirstStringAbove()
'
Cells.Find(What:="Status", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase _
    :=False).Offset(-1, 0).Select
End Sub
4

4 に答える 4

2

Ctrl+ Shift+を使用して配列数式として入力し、Enterコピーしてこの数式を試してください。

=INDEX(B:B,IF(ROW()>COUNTIF(B:B,"Status"),"",SMALL(IF($B:$B="Status",ROW($B:$B),2000000000),ROW()))-1)

別のシートから実行するには、元のシートからカットアンド ペーストすると、参照が自動的に調整されます。

于 2012-09-28T20:27:34.230 に答える
1

VBA は、動的ではありませんが、数式よりもはるかに高速な回答を提供します。結果をフィルタリング、オフセット、およびコピーする添付のコードを実行します。

Dim lLastRow As Long, rgResult As Range


lLastRow = Cells(Rows.Count, 2).End(xlUp).Row


With Range("B1:B" & lLastRow)
    .AutoFilter field:=1, Criteria1:="Status"
    Set rgResult = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
    .AutoFilter
End With

Sheets.Add

rgResult.Offset(-1).Copy ActiveSheet.Cells(1, 1)
于 2012-09-28T20:35:47.987 に答える
0

わかった。これがVBAです。

Public Sub test()
Dim rngStCol As Range
Dim rngSt As Range
Dim lastRow As Integer
Dim rngDB As Range
Dim currRow As Integer

Set rngStCol = Sheet1.UsedRange.Columns(2)
Set rngSt = rngStCol.Find("Status")
Do While rngSt.Row > lastRow
    Set rngDB = rngSt.CurrentRegion
    Set rngDB = rngDB.Offset(2, 0).Resize(rngDB.Rows.Count - 2)

    If currRow = 0 Then
        Sheet3.Range(Sheet3.Cells(1, 1), Sheet3.Cells(1, rngDB.Columns.Count)).Value = rngDB.Offset(-1, 0).Resize(1).Value
        Sheet3.Cells(1, rngDB.Columns.Count + 1).Value = "Client"
        currRow = 2
    End If

    Sheet3.Range(Sheet3.Cells(currRow, 1), Sheet3.Cells(currRow + rngDB.Rows.Count - 1, rngDB.Columns.Count)).Value = rngDB.Value
    Sheet3.Range(Sheet3.Cells(currRow, rngDB.Columns.Count + 1), Sheet3.Cells(currRow + rngDB.Rows.Count - 1, rngDB.Columns.Count + 1)).Value = rngDB.Cells(-1, 2)

    currRow = currRow + rngDB.Rows.Count

    lastRow = rngSt.Row
    Set rngSt = rngStCol.FindNext(rngSt)
Loop


End Sub
于 2012-09-29T17:13:13.910 に答える
0

私はパズルが嫌いです。少なくとも、私は人々にそう言っています。

Ok。最初の列をヘッダーとして作成しました。

A1 =    Account
B1 =    Status
C1 =    Date
D1 =    Invoice
E1 =    Client
F1 =    Index
G1 =    Client Index
H1 =    Client Cnt

行 2 がデータの始まりになります。

A2 =    =INDEX(Sheet1!A$1:A$1000,$F2)
B2 =    =INDEX(Sheet1!B$1:B$1000,$F2)
C2 =    =INDEX(Sheet1!C$1:C$1000,$F2)
D2 =    =INDEX(Sheet1!D$1:D$1000,$F2)
E2 =    =INDEX(Sheet1!B$1:B$1000,$G2)
F2 =    =IF(ISNUMBER(F1),IF(INDEX(Sheet1!B$1:B$1000,$F1+1)="",G2+2,F1+1),G2+2)
G2 =    {=IF(H2=H1,G1,SMALL(IF(Sheet1!$B$1:$B$1000="Status",ROW(Sheet1!$B$1:$B$1000),2000),H2)-1)}
H2 =    =IF(ISNUMBER(H1),IF(INDEX(Sheet1!B$1:B$1000,$F1+1)="",H1+1,H1),1)

#REF エラーが発生するまで貼り付けます。

Excel は $B:$B 構文に悪臭を放っています。それは本当の範囲を望んでいます。さらに、おそらく $1000 よりも大きな数値が必要になるでしょう。

結局のところ、マクロはより単純で、この要件に適していますが、それで何が楽しいのでしょうか。

楽しみ!

于 2012-09-29T16:37:28.047 に答える