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

仍然不相信为什么 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 回答
1

Excel 在计算矩阵方面非常强大。我会使用 Excel 公式而不是代码来计算它。我将在右侧添加一列,它将添加一个进程使用的任务总数,如下面的矩阵所示。

    ABCDEFG
1 PID T1 T2 T3 T4 T5 总计
2 #11 1 1
3 #14 1 1 1 3
4 #21 1 1 1 1 1 5
5 #41 1 1 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 回答