【问题标题】:VBA How to count instances of a value in column x by date in column y?VBA如何按y列中的日期计算列x中的值的实例?
【发布时间】:2015-07-24 23:07:33
【问题描述】:

我有一个关于如何实现目标的问题。我正在尝试以我可以通过 Excel VBA 宏与 Minitab 一起使用的格式获取数据。基本上,我有来自机器的测试数据,它收集各种属性和变量数据。我有兴趣找到满足多个标准的项目数量,并计算该数量。因此,更具体地说,在我的 1stTimeYield 列中,我想为显示的每个日期计算每个输入了“1”的序列号(失败以“X”开头)。查看下面的屏幕截图,对于 2015 年 2 月 1 日,我的总数应该是 3。我还需要计算该日期的序列号总数,在本例中为 4。我的目标是在 2 月 1 日的 5 次数据收集中达到 75% 的第一次通过率。 然后,我需要将此数据输入到我在代码中创建的工作表上的相应行/列中(我将在此文本下方粘贴代码)。在找到一种方法将我收集计数的日期与我制作的表格中列出的日期进行比较之后,我提出的计数的粘贴应该相对简单。如果您有这些问题,请提出澄清问题。 从本质上讲,我对如何有效地获取我需要的数据感到有点困惑。

Sub Main()

    Dim iNumSheets As Long
    'Add new Worksheet; check if exists already
    Sheets.Add After:=Sheets(Sheets.Count)
    iNumSheets = Sheets.Count
    If SheetExist("FPY Data") Then
        Application.DisplayAlerts = False
        Sheets(iNumSheets).Delete
        Application.DisplayAlerts = True
        End
    Else
        Sheets(iNumSheets).Name = "FPY Data"
    End If

    'Create and Format the Date and Yield Comments
    Dim sDate As String
    Dim sYield As String
    Sheets("FPY Data").Select
    Cells(1, 1).Value = "Date"
    Cells(1, 2).Value = "First Pass"
    Cells(1, 3).Value = "Total Pass"
    Cells(1, 4).Value = "FPY (%)"
    Columns("A:A").ColumnWidth = 10.33
    Columns("B:B").ColumnWidth = 10.33
    Cells.Select
    With Selection
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Cells(1, 1).Select

    'Find Dates and copy to Yield Worksheet
    Dim iRow As Long
    Dim wSheet As Worksheet
    Set wSheet = ThisWorkbook.Worksheets(1)
    iRow = wSheet.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

    'Copy first date in data
    Dim iTemp As Long
    iTemp = 3
    Worksheets("FPY Data").Cells(2, 1).Value = Worksheets(1).Cells(2, 2).Value
    For iCounter = 3 To iRow        'Loop through data for dates

        If Worksheets(1).Cells(iCounter, 2).Value = Worksheets(1).Cells(iCounter - 1, 2).Value Then
            'Do not copy new date to FPY data
        Else
            'Copy Date to next available cell & increment counter
            Worksheets("FPY Data").Cells(iTemp, 1).Value = Worksheets(1).Cells(iCounter, 2).Value
            iTemp = iTemp + 1
        End If

    Next iCounter

    'Count number of First Time Passes


End Sub

Function SheetExist(strSheetName As String) As Boolean
    Dim i As Integer

    For i = 1 To Worksheets.Count
        If Worksheets(i).Name = strSheetName Then
            SheetExist = True
            Exit Function
        End If
    Next i
End Function

【问题讨论】:

  • 你不能使用COUNTIFS()内置函数来获取计数吗?

标签: vba excel


【解决方案1】:

我了解您一直在研究 VBA 解决方案,但如果可以使用公式,可以应用一些有效的非数组标准公式来实现您的结果¹。

        

您首先需要的是唯一日期列表。 Excel 将日期视为数字,因此您可以在 F2 中检索以此公式开头的排名唯一列表,

=SMALL($B:$B, COUNTIF($B:$B, "<="&$F1)+1)

接下来是COUNTIFS function,它将您在 G2 中的所有条件都考虑在内。

=COUNTIFS($B:$B, $F2,$D:$D, 1,$C:$C, "<>X*")

您经过大量编辑的数据未回答包含重复项的序列号列的问题,因此我认为可能存在重复项。 H2的公式是,

=SUMPRODUCT(($B$2:$B$9999=$F2)/COUNTIF($C$2:$C$9999, $C$2:$C$9999&""))

您的叙述不清楚该计数是否应包含以 X 开头的序列号,因此这里是与 X 在 I2 中排除的相同计数,

=SUMPRODUCT((($B$2:$B$9999=$F2)*(LEFT($C$2:$C$9999,1)<>"X"))/COUNTIF($C$2:$C$9999,$C$2:$C$9999&""))

根据需要填写。当您用完日期以拉入 F 列时,您将收到 #REF! 错误。别再往下填了。

¹fwiw,如果我在 VBA 中执行此操作,我会使用 Application.WorksheetFunction 将其中几个函数混搭到 VBA 代码中,以提高代码效率和权宜性。

【讨论】:

  • 所以,我正在尝试消化这个问题。首先,我想完全自动化宏,因为我将不止一次这样做。其次,没有重复的序列号。可能发生的唯一方法是机器错误。第三,以“X”开头的行不是序号,不应该计算在内。他们是失败者。我正在严格查看 AU 行的总数,以了解有多少序列号。稍后我会进一步消化。
  • 刚刚看到最后一段代码考虑了所有的序列号,留下了失败。
  • 我修改了你的公式,并使用 VBA 将它们粘贴进去。这就是我所做的:
【解决方案2】:
'Find Last Row of FPY Data Worksheet
Set wSheet = ThisWorkbook.Worksheets("FPY Data")

'Fill First Pass Column
Cells(2, 2).Activate
ActiveCell.FormulaR1C1 = "=COUNTIFS(PartData!C,'FPY Data'!RC[-1],PartData!C[20],1,PartData!C[1],""<>X*"")"
iRow = wSheet.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row
ActiveCell.Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:A" & iRow - 1)

'Fill Total Pass Column
Cells(2, 3).Activate
ActiveCell.FormulaR1C1 = "=COUNTIFS(PartData!C[-1],'FPY Data'!C[-2],PartData!C,""<>X*"")"
ActiveCell.Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:A" & iRow - 1)

'Fill Percentage field
Cells(2, 4).Activate
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-1]*100"
ActiveCell.Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:A" & iRow - 1)
Range(Cells(2, 4), Cells(iRow, 4)).Select
Selection.NumberFormat = "0.00"

【讨论】:

    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多