0

私は以下のようなExcelマトリックスを持っています:

PID#      T1    T2   T3    T4    T5   T6    T7

11        1                1      
14        1     1          1     
21                   1     1     
41        1          1     1     1
71                   1     
88        1          1           1

PID#プロセスに他なりません。すべてのプロセスは複数のタスクで構成されています。ただし、すべてのプロセスがすべてのT1 - T5タスクを使用する必要はありません。このようなシナリオでは、PID#最大のタスクを使用したものを取得することが可能です。1タスクが使用されたかどうかを示すために使用されます。ここで、PID#41と88は、最大のタスクを使用し5ました。必要なのは、最大使用列数と、その数の列を使用した行番号のいずれかだけです。

ノート

ここで私1はデータがあると言っていましたが、実際にはさまざまな種類のデータがあります。どの行が最大列を使用しているかを調べる必要がありますが、行のセルがblank左側にある場合は、カウントに含める必要があります。たとえば-

<> 1<>1は4としてカウントを与えます

<> <>1<>は3としてカウントされます

1 1 <>は、カウントを2'として与えます。ここで<>は、no values

編集

Option Explicit

Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList")
Dim i,colcount

i=2
Do while i < = objExcel1.Application.WorksheetFunction.CountA(ob.Rows(1))

colcount=objExcel1.Application.WorksheetFunction.CountA(ob.Rows(i))
ArrayListTaskDetails.Add(colcount)

i=i+1
Loop

ArrayListTaskDetails.Sort()
i=ArrayListTaskDetails.Count
MsgBox("HighestColumnNumner:" & ArrayListTaskDetails(i-1))

問題:

連続した値を持たない行の空白の列を数えることができません。したがって、カウントは私によって正しく生成されません。

編集1

ここで問題となるのは、左の空白のセルがあれば数えられないことです。これらのセルも使用済みの列と見なされ、他の行に値が含まれる可能性があるため、使用された右端の列を見つける必要があります。行ごとに、その後はどの行でも列が使用されていません。私が探しているものをクリアできることを願っています:

Option Explicit

Dim objExcel1
Dim strPathExcel1
Dim objSheet1,objWB,ColCount
Dim ArrayListTaskDetails : Set ArrayListTaskDetails = CreateObject("System.Collections.ArrayList")

Set objExcel1 = CreateObject("Excel.Application")
strPathExcel1 = "D:\AravoVB\.xlsx"
Set objWB = objExcel1.Workbooks.open(strPathExcel1)

Set objSheet1 = objExcel1.ActiveWorkbook.Worksheets(1)

Do Untill count > objExcel1.Application.WorksheetFunction.CountA(objSheet1.Rows(1)) 

Range = objSheet1.("count:count")
ColCount=objExcel1.Application.WorksheetFunction.CountIf(Range,<> "")
ArrayListTaskDetails.Add(ColCount)

Loop

ArrayListTaskDetails.Sort()
MsgBox(ArrayListTaskDetails(ArrayListTaskDetails.Count - 1))

ありがとう、

4

2 に答える 2

1

Excelは、行列の計算において非常に強力です。計算には、コードの代わりにExcelの数式を使用します。次のマトリックスに示すように、右側に列を追加します。これにより、プロセスで使用されるタスクの総数が追加されます。

    ABCDEFG
1 PID T1 T2 T3T4T5合計
2#11 1 1
3#14 1 1 1 3
4#21 1 1 1 1 1 5
5#41 1 1 2

次に、2つの配列数式を記述して、プロセスで使用されるタスクの最大数とそのプロセスの名前を計算します。

例で使用される最大タスクを計算する式:= SUM(IF($ G $ 2:$ G $ 5 = MAX($ G $ 2:$ G $ 5)、G2:G5,0))

最大タスクを使用した価格を見つける式:= OFFSET(A1、SUM(IF($ G $ 2:$ G $ 5 = MAX($ G $ 2:$ G $ 5)、ROW(G2:G5)-1,0) )、0,1,1)

配列数式を使用したことを述べたことに注意してください。Excelで配列数式を追加するには、数式を入力してから「Ctrl + Shift + Enter」を押して、その数式を配列数式にする必要があります。

お役に立てれば。ビカスB

- - - - - - - - -編集 - - - - - - - - - - - - - - - - ---------------------

ここにコードを追加します。マトリックスに示されているように、サンプルを使用して正しい結果を生成しました。

    Sub FindMax()

'assuming column 1 is the task ID and Row one has the headings.

Const LastColumn As Integer = 7 ' you can use xl end to get the last used column in the range
Const LastRow As Integer = 5


Dim rowCounter As Integer
Dim prevValue As Integer
Dim rngToTotal As Range
Dim sht As Worksheet
Dim maxRowName As String
Dim value As Integer
Dim maxValue As Integer

Set sht = ActiveSheet 

For rowCounter = 2 To LastRow
    Set rngToTotal = sht.Range(sht.Cells(rowCounter, 2), sht.Cells(rowCounter, LastColumn))
    value = WorksheetFunction.Sum(rngToTotal)

    If value > prevValue Then
        maxRowName = sht.Cells(rowCounter, 1).value
        maxValue = value
    End If
    prevValue = value
Next rowCounter

MsgBox "Process name " & maxRowName & "  =  " & maxValue

End Sub
于 2012-12-31T17:37:39.257 に答える
1

なぜVikasの答えがうまくいかないのかまだ確信が持てません。このコードを試してください。最後の最大値が強調表示されます。PID唯一の欠点は、同じ最大値を持つすべてを追跡しないことです。必要に応じてコードを改善することもできます。

コード:

Option Explicit

Sub getRealUsedColumns()
Dim rngInput As Range
Dim arrInput As Variant, arrRowTotal As Variant
Dim i As Integer, j As Integer, counter As Integer, iTemp  As Integer
Dim iPID As Integer, maxRowNum As Integer

    arrInput = Application.WorksheetFunction.Transpose(Sheets(3).Range("B3:I8").Value2)
    ReDim arrRowTotal(LBound(arrInput, 2) To UBound(arrInput, 2))

    For i = LBound(arrInput, 2) To UBound(arrInput, 2)
        counter = 0
        For j = LBound(arrInput) + 1 To UBound(arrInput)
            If arrInput(j, i) <> "" Or Not IsEmpty(arrInput(j, i)) Then
                counter = counter + 1
            End If
        Next j

        '-- most recent max value (if you have two of the same, this doens't catch)
        '-- you need to save in a proper array to catch multiple PIDs with same max value
        If iTemp <= counter Then
            iTemp = counter
            iPID = arrInput(1, i)
            maxRowNum = i
        End If

        arrRowTotal(i) = counter
    Next i

    '-- Row total into the sheet output
    Sheets(3).Range("J3").Resize(UBound(arrRowTotal)) = _
                     Application.WorksheetFunction.Transpose(arrRowTotal)

    '-- highlight the max total row.
    With Sheets(3).Range("B3").Offset(maxRowNum - 1, 0).Resize(1, UBound(arrInput, 1) + 1)
        .Interior.Color = 200
    End With

End Sub

結果:

ここに画像の説明を入力してください

于 2013-01-01T07:39:40.953 に答える