我有一个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> 1给出计数为4
<> <> 1< 1>将计数为3
1 1&lt; 1&gt;我会将<>
用来代表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))
问题:
我无法计算没有连续值的行的空白列。因此,我无法正确计算数量。
EDIT1
这里的问题仍然是我无法计算左边的空白单元格,因为那些也被认为是用过的列,其他行可以有值。那么需要找出最右边的列哪个已被行使用,之后任何行都没有使用任何列。希望我能够清楚我要找的东西:
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))
谢谢,
答案 0 :(得分:1)
Excel在计算Matrix方面非常强大。我会使用Excel公式而不是代码来计算它。我会在右边添加一列,这将添加进程使用的任务总数,如下面的矩阵所示。
A B C D E F G 1 PID T1 T2 T3 T4 T5 Total 2 #11 1 1 3 #14 1 1 1 3 4 #21 1 1 1 1 1 5 5 #41 1 1 2
然后我将编写两个Array Formulas来计算进程使用的最大任务数以及该进程的名称。
计算示例中使用的最大任务的公式:= 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中添加数组公式,您需要输入公式然后按&#34; Ctrl + Shift + Enter&#34;使该公式成为一个数组公式。
希望这会有所帮助。 Vikas B
----------------- EDIT ----------------------------- ------------------------
在此处添加代码。我只是使用了样本,如矩阵所示,并产生了正确的结果。
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
答案 1 :(得分: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
结果: