1

VBAを学びながら、フォーラムを数週間使用しています。しかし今、私は立ち往生しており、助けが必要です。だからここに私の問題があります:

いくつかのワークシートを含むワークブックがあります。簡単にするために、2 つのワークシートがあるとします。1 つは多くの未加工データ素材を含むもので、もう 1 つはきれいにフォーマットされていて受信シートになります。

生データ テーブルは次のようになります。8 つの列があり、各行 (列 B と E) で 2 つの条件をチェックし、列 H の値を合計する必要があります。列 B には異なる名前が含まれ、列 E には作業ステータスが含まれます。 、例えば、準備ができている、または話している。私は約3.000行と、ステータスが異なる約20の異なる名前のセットを持っています。全体として、名前が「Smith」でステータスが「talking」の 100 行を順不同で考えてみましょう。ここで、「Smith」という名前と「話している」というステータスが入力されている各行のすべての数字 (H 列) を合計する必要があります。その後、名前 (B 列)、ステータス (E 列) と合計 (H 列) が、I3:K3 から始まるダイナミック レンジで同じワークブックのセルに書き込まれます。私はこれについて完全に暗闇の中にいることを認めなければなりません..皆さんがコードを手伝ってくれたり、正しい方向に向けてくれることを本当に願っています. 何よりも、あなたのコードが何をするのかについても説明していただければ、私はそれを正しく理解し、学ぶことができます。よろしくお願いします!

これまでの私のコードは次のとおりです。

Private Sub SumNumbers()

Dim tbl As Worksheet
Dim x As Integer
Dim lrow As Long
Dim lastname As String
Dim astatus As String
Dim number As Integer
Dim counter As Integer

Set wb = ThisWorkbook
Set tbl = wb.Sheets("Sheet1")
lrow = tbl.Cells(Rows.Count, "B").End(xlUp).Row
lastname = tbl.Cells("C2:C" & lrow).Text
astatus = tbl.Cells("E2:E" & lrow).Text
number = tbl.Cells("H2:H" & lrow)

For x = 2 To lrow

    If lastname = "Smith" And astatus = "Talking" Then
        counter = counter + number
    End If

Next x

End Sub
4

4 に答える 4

2

近いですが、ループ内で各セルを個別にテストする必要があります。このようなもの:

Sub Macro1()
    Dim tbl As Worksheet
    Dim x As Integer
    Dim lrow As Long
    Dim lastname As String
    Dim astatus As String
    Dim number As Integer
    Dim counter As Integer: counter = 3

    Set wb = ThisWorkbook
    Set tbl = wb.Sheets("Sheet1")
    lrow = tbl.Cells(Rows.Count, "B").End(xlUp).Row

    For x = 2 To lrow
        If tbl.Range("C" & x) = "Smith" And tbl.Range("E" & x) = "Talking" Then
            Range("I" & counter).Value = Range("C" & x)
            Range("J" & counter).Value = Range("E" & x)
            Range("K" & counter).Value = Range("H" & x)
            counter = counter + 1
        End If
    Next x
End Sub

@Tim コメントごとに、SumIfs を使用して、次のような複数の基準を満たす「H」列の合計を返すことができます。

=SUMIFS(H:H,C:C,"=Smith",E:E,"=Talking")
于 2013-10-30T20:21:35.620 に答える
0

これまでのところ、自分のために仕事をする方法を見つけましたが、すべてのケースで手動で行う必要があるため、これはかなり混乱しているようです。だから今、私はこれを行うためのよりシンプルでエレガントな方法を探しています. コードを提供するか、正しい方向に向けていただければ幸いです。

これまでの私のコードは次のとおりです。

For Each cell In Range("H2:H" & lrow)
   cell.Offset(0, 1).Value = cell.Value + cell.Offset(-1, 1).Value
      If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Talking" Then
      cell.Offset(0, 2).Value = cell.Value
      End If

      If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Ready" Then
         cell.Offset(0, 3).Value = cell.Value
      End If

      If cell.Offset(0, -6).Value = "Smith" And cell.Offset(0, -3).Value = "Not Ready" Then
      cell.Offset(0, 4).Value = cell.Value
      End If
Next

前に述べたように、これは単純化したい回避策です。条件「Smith」とステータス「Talking」、「Ready」、および「Not Ready」を探し、H 列の値を列のそれぞれのセルに入れ、後のプロセスで合計できるようにします。それで、それをよりエレガントにする方法はありますか?

于 2013-11-01T11:36:53.383 に答える
0

A. すべての一意の名前を取得し、新しい列に配置します。これは、各行の検索に使用される配列になります。

B.ステータスが何であるかがわかっているので、ステータス用に別の配列を設定します。

C. Name Array の外側のループを設定する
For each item in array

D.ネストされたループが各行を見て、各ステータスを検索します

C. ステータスが一致すると、別のネストされたループで時間が追加され、合計時間という新しい列に配置されます。

于 2016-10-06T14:21:50.133 に答える
0

さすがポートランドランナー!私の論理は単純です。特定のステータスを持つ各名前の記録されたアクティビティのリストがあります。たとえば、「Smith」(列 B)と「Talking」(列 C)、および数字(列 H)。そして、条件名とステータスが等しいすべての行について、列 H の数値を合計する必要があります。1万行あるとしましょう。そのうちの 2k には「Smith」という名前が含まれています。しかし、名前が「Smith」でステータスが「Talking」になっているのは 500 人だけです。そのため、これらの数値を合計するためのより簡単な方法を見つける必要があります。名前が「Smith」でステータスが「Ready」の行もあります。ここでの難点は、これらの行が基本的にランダムな順序になっていることです。

したがって、テーブルは次のようになります。

Row    Name     Status      Number     
2      Smith    Talking     105
3      Smith    Talking     67
4      Smith    Ready       75
5      Smith    Talking     94
6      Jones    Ready       89
7      Jones    Talking     224
8      Jones    Not Ready   75
9      Jones    Talking     99

したがって、この場合、行番号 1 は見出し用にブロックされ、データは行番号 2 から始まります。「Smith」と「Talking」の場合、コードは条件の行 2、3、および 5 を合計する必要があります。スミス」と「トーキング」。「Smith」と「Ready」の行 4。「Jones」と「Talking」などの行 7 と 9。

私ができることは、新しいワークシートを作成し、すべての名前のリストを列 A に入れ、すべてのステータスのリストを列 B に入れ、それを参照することです。これにより、コードで正確な名前とステータスを使用する手間が省けますが、問題は解決しません。

于 2013-11-01T13:52:11.820 に答える