2016-07-05 3 views
0

私は、列に基づいて行をグループ化し、グループを分類しながら各グループの数を数えるスプレッドシートの機能に取り組んでいます。グループとインデックスへのVBAコード

私はこのような名前や家族の状況のリストを持っている:この

のように見えるように..

Bob  Employee  
Laura Spouse  
Steve Child  
Jim  Employee  
Brian Employee  
Amy  Spouse  
Jon  Employee  
Kelly Child 

をそして、私はそれが扶養のリストと階層化システムで従業員によってグループ化させたいですアプローチ

For i=1 to NumberOfRows 

    If status(i) = spouse 

    go up 1 row increment dependent count & add EE+Spouse, delete row 

    Else if status(i) = kid 

    go up 1 row increment dependent & add EE+child 

しかし、これが唯一のワットを働いていた場合、私は、ネストされたを取るしようとしていた

Name  # Dependents Tier  
Bob   2   EE+Family  
Jim   0   EE  
Brian   1   EE+Spouse  
Jon   1   EE+Child 

鶏には子供と配偶者しかいませんでした。 また、リストが常に従業員と扶養家族の順番で注文されることを忘れています。どんな助けでも大歓迎です!

+1

サウンド:その方法は、あなたがこのような何かを得るでしょう'if'ステートメントです。 – findwindow

+0

あるいは、 '' Select Case'(http://www.techonthenet.com/excel/formulas/case.php)を 'If'の代替案として調べてみてください。 – BruceWayne

+0

私はあなたが従業員を追跡する列を追加する方が良いと思いますすべての行についてしたがって、それぞれの配偶者と子供の行について、それは従業員を示します。同じテーブルを参照する外部キーによく似ています。これにより、レポートを生成するのがはるかに簡単になります。 – nbayly

答えて

0

を見つけるまで、あなたが後でテキストにそれを変更することができますカウントを維持するループ。あなたがより多くを必要とするよう

Sub dadada() 
    Dim data As Variant, output() As Variant, i As Long, j As Long, mb As VbMsgBoxResult 
    With Sheets("sheet1") 
    data = .[A1].Resize(.Cells(.Rows.Count, 1).End(xlUp).Row, 2).Value2 
    ReDim output(1 To UBound(data), 1 To 3) 
    output(1, 1) = "Name" 
    output(1, 2) = "# Dependents" 
    output(1, 3) = "Tier" 
    j = 1 
    For i = 1 To UBound(data) 
     If data(i, 2) = "Employee" Then 
     j = j + 1 
     output(j, 1) = data(i, 1) 
     output(j, 2) = 0 
     output(j, 3) = 0 
     ElseIf data(i, 2) = "Spouse" Then 
     output(j, 2) = output(j, 2) + 1 
     output(j, 3) = output(j, 3) Or 1 
     ElseIf data(i, 2) = "Child" Then 
     output(j, 2) = output(j, 2) + 1 
     output(j, 3) = output(j, 3) Or 2 
     ElseIf Len(data(i, 2)) Then '<- skip start 
     mb = MsgBox("Can't evaluate '" & data(i, 2) & "' at row " & i & " ('" & data(i, 1) & "')!", vbAbortRetryIgnore + vbApplicationModal + vbCritical, "Error") 
     If mb = vbAbort Then Exit Sub 
     If mb = vbRetry Then 
      If MsgBox("Is this a new employee?", vbYesNo) = vbYes Then 
      data(i, 2) = "Employee" 
      ElseIf MsgBox("Is this a new spose?", vbYesNo) = vbYes Then 
      data(i, 2) = "Spouse" 
      Else 
      MsgBox "'" & data(i, 2) & "' will be used as 'Child'." 
      data(i, 2) = "Child" 
      End If 
      i = i - 1 
     End If '<- skip end 
     End If 
    Next 
    For i = 2 To j 
     output(i, 3) = "EE" & Application.Choose(output(i, 3) + 1, "", "+Spouse", "+Child", "+Family") 
    Next 
    .[E1].Resize(i - 1, 3).Value = output 
    End With 
End Sub 

mb一部は(あなたがそれを好きではないので、もし、単に間のすべての行を削除し、skip startskip endを含む)はオプションです

1

私はそれを少しスピードアップするために配列を使うことに決めました。

これは、データをE1に入れて変更することもできます。

これは後方、それが数値に「ティア」を設定することで「従業員」

Sub foo() 
Dim inarr() As Variant 
Dim oarr() As Variant 
Dim ws As Worksheet 
Dim cnt As Long 
Dim spouse As Integer 
Dim child As Integer 


Set ws = ActiveSheet 

With ws 
    inarr = .Range("A2", .Cells(.Rows.Count, "B").End(xlUp)).Value 
    cnt = WorksheetFunction.CountIf(.Range("B:B"), "Employee") 
    ReDim oarr(1 To cnt, 1 To 3) 
End With 
cnt = 1 
For i = UBound(inarr, 1) To 1 Step -1 
    Select Case inarr(i, 2) 
     Case "Spouse" 
      spouse = spouse + 1 
     Case "Child" 
      child = child + 1 
     Case "Employee" 
      oarr(cnt, 1) = inarr(i, 1) 
      oarr(cnt, 2) = spouse + child 
      If spouse > 0 And child > 0 Then 
       oarr(cnt, 3) = "EE+family" 
      ElseIf spouse > 0 And child = 0 Then 
       oarr(cnt, 3) = "EE+Spouse" 
      ElseIf spouse = 0 And child > 0 Then 
       oarr(cnt, 3) = "EE+Child" 
      Else 
       oarr(cnt, 3) = "EE" 
      End If 
      spouse = 0 
      child = 0 
      cnt = cnt + 1 
    End Select 
Next i 
ws.Range("E1").Resize(UBound(oarr, 1), 3).Value = oarr 

End Sub 

enter image description here

+0

ありがとうございました - これはほぼ私が論理的に賢明な使い方をしたものです。カウンターを後方に移動すると、実際にはずっと簡単になります。 – Brian

+0

回答のチェックマークをクリックして、正しい印を付けることを検討してください。 @ブライアン –

関連する問題