1

在手动扫描 90 条记录后,我意识到除非我使用自动化,否则这将是痛苦和乏味的。

我有这组数据,大约 4000 条记录以我想要跟踪的模式出现。第一列是重要的。我想浏览该列并在新列中记录该数字出现的次数。是否可以在 Excel 中以编程方式执行此操作?

注意:我不只是在寻找单一模式或模式的单一出现。

例如,在这个样本中,313 出现了 1 次,314 出现了 6 次,315 出现了 2 次,以此类推。

在事件结束时,我希望它看起来像

--- Desired Output -------

313 1       343  1
314 1   344  
314 2   344 
314 3   344
314 4   344
314 5   344  
314 1   345  6
315 2   345  
315 1   346  2


-- Sample Data ------------------------------------
313 1   343
314 1   344
314 2   344
314 3   344
314 4   344
314 5   344
314 1   345
315 2   345
315 1   346
316 2   346
316 1   347
317 2   347
318 1   348
318 2   348
319 1   349
319 2   349
319 3   349  

5/23/13 数据由空格分隔。它不是全部在一个单元格中。我不知道如何在这里创建网格图片。最左边的单元格是我要计算的单元格。

所需的输出是我想要的示例。314 有六次出现,我希望将计数汇总单元格编译在最后一次出现的行中。

4

4 回答 4

1

我备份了,放慢了速度,然后学习了一些基本的编程原则,就像他们有时感觉的一样慢。

  1. 流程图
  2. 伪代码
  3. 原型
  4. 测试
  5. 根据需要重复 3 和 4。

我发现以下代码完全符合我的需要。我分享给任何关注的人。

Sub countFoo()
Dim startCell As Range
Dim preCell As Range
Dim counter As Integer
Dim startPoint As Range, endPoint As Range
Dim fileName As String, delimitingCharacter As String, SQLpre As String, SQLpost As String
Dim SQL As String
Dim outfile As Integer

fileName = "update_foo.sql"
SQLpre = "UPDATE foo SET foodata = "
SQLpost = " WHERE details = '"
outfile = FreeFile()
Open fileName For Output As outfile
counter = 1

Set startPoint = Cells(2, 4)
startPoint.Activate

Debug.Print "Start Point:" & startPoint.Address
Debug.Print startPoint.Value

Set startCell = ActiveCell
Set preCell = startCell.Offset(-1, 0)


Do While startCell.Value <> "END"

If (startCell.Value = preCell.Value) Then
  counter = counter + 1
  Set preCell = startCell
  Set startCell = startCell.Offset(1, 0)
ElseIf ((startCell.Value <> preCell.Value) Or (startCell.Value = "END")) Then
  startCell.Offset(-1, 3).Value = counter
  If counter > 1 Then
    startCell.Offset(-1, 0).Interior.Color = 5296274
    startCell.Offset(-1, 1).Interior.Color = 5296274
    startCell.Offset(-1, 2).Interior.Color = 5296274
    startCell.Offset(-1, 3).Font.Bold = True
    With startCell.Offset(-1, 3).Interior
      .Pattern = xlGray8
      .PatternColor = 65535
      .Color = 5296274
    End With
  End If
  SQL = SQLpre & counter & SQLpost & startCell.Offset(-1, 0).Value & "';"
  Print #outfile, SQL
  counter = 1
  Set preCell = startCell
  Set startCell = startCell.Offset(1, 0)
End If
Loop
Close #outfile
End Sub
于 2013-06-03T06:06:16.377 回答
0

如果您要做的就是计算某个数字在某个范围内的出现次数,您所要做的就是使用 COUNTIF(range,criteria)

其中范围是您要检查的单元格(根据您的说法,它将是“A1:A4000”),标准是您正在寻找的数字,它也可以是像“> 55”这样的计算单元格该值大于 55。

希望它有帮助,布鲁诺

我在评论中提到的代码:

CurrentRowA = 1
LastRowA = Range("A50000").End(xlUp).Row
Dim r As Range
While CurrentRowA <= LastRowA
    CurrentRowB = 1
    LastRowB = Range("B50000").End(xlUp).Row
    Do While CurrentRowB <= LastRowB
        If Cells(CurrentRowA, "A").Value = Cells(CurrentRowB, "B").Value Then
            Exit Do
        Else
        CurrentRowB = CurrentRowB + 1
        End If
    Loop
    If CurrentRowB > LastRowB Then
        Cells(CurrentRowB, "B").Value = Cells(CurrentRowA, "A").Value
        Set r = Range("A1", "A" & LastRowA)
        Cells(CurrentRowB, "C").Value = Application.CountIf(r, Cells(CurrentRowA, "A").Value)
    End If
    CurrentRowA = CurrentRowA + 1
Wend
LastRowB = Range("B50000").End(xlUp).Row
Range("B2", "C" & LastRowB).Cut
Range("B1").Select
ActiveSheet.Paste

如果我在我的最新评论中描述的是你真正想要的,你所要做的就是将此公式粘贴到 B1 =COUNTIF($A$1:A1;A1) 并将其拖到最后一个单元格或双击那个黑色方块B1底角,如果是自动计算就完成了,如果是手动的你现在必须点击计算就完成了

希望它有帮助,布鲁诺

于 2013-05-19T21:40:42.683 回答
0

将其粘贴到 D1 中并向下拖动。

=IF(A2<>A1,COUNTIF($A$1:$A$100000,A1),"")

根据需要调整范围。这个公式假设前 3 位数字在自己的单元格中。

如果您的样本数据都在一列中,那么您将不得不使用Sumproduct带有函数的Left函数来代替 countif。在这种情况下,您可以使用以下公式,但如果您的示例数据在 3 列中,请务必使用我的快速公式。

=IF(LEFT(A1,3)<>LEFT(A2,3),SUMPRODUCT(--(LEFT($A$1:$A$100000,3)=LEFT(A1,3))),"")

编辑根据您的评论和回答,我已就使用该countif方法制定了完整指南,因为如果可能,应始终避免使用 VBA。您遇到问题是因为您在问题中提供的示例数据不包含标题/列标签这里是固定指南。

从带有标题的 3 列开始,我将在您希望使用内置名称管理器的计数的列上创建一个命名范围,然后单击新建:

名称管理器新

然后从此将名称设置为CountColumn并在公式中使用以下内容:

=OFFSET($A$2,0,0,COUNTA($A$2:$A$1000000),1)

名称管理器公式

现在使用我的原始答案的修改版本在单元格中键入以下内容D2

=IF(A3<>A2,COUNTIF(CountColumn,A2),"")

公式

如上所示,这与您在 中提出的原始问题相同Desired Output

现在为了进一步了解您的 VBA 代码看起来的亮点,我将使用以下内容。

回到名称管理器,就像我们对 所做的那样CountColumn,创建另一个名为的新命名范围Sums,然后将所有A引用更改为D如下所示:

=OFFSET($D$2,0,0,COUNTA($D$2:$D$1000000),1)

总和命名

您的名称管理器应如下所示:

名称管理器2

现在在名称框(公式栏旁边的左上框)中输入单词Sums以选择整个总和区域,以便我们对其进行格式化:

总和

然后****当sums区域突出显示时***转到条件格式~~>新规则:

在此处输入图像描述 并使用内置的无空白功能:

没有空白

然后对于格式使用填充和您想要的颜色,根据您发布的公式,我使用了绿色:

填充绿色

现在您应该完成了,您的数据应该如下图所示:

结束

于 2013-05-20T00:44:30.207 回答
0

以下假设您的数据都在一列中(例如:"315 1 344"是一个单元格)

它将从 A1 开始查看 sheet1,生成唯一单元格值列表并计算任何重复项。检查完所有记录后,它将结果输出到 sheet2。

Sub Main()
' this requires you to add a reference to "Microsoft Scripting Runtime" (usefull if you do not know the methods of scripting.dictionary)
'Dim Results As New Scripting.Dictionary
' the line does not require you to add any extra references (there is no code-completion, you must know the methods and their arguments)
Dim Results As Object: Set Results = CreateObject("Scripting.Dictionary")
Dim Data As Variant
Dim Key As Variant
Dim Source As Worksheet: Set Source = ThisWorkbook.Worksheets("Sheet1") ' the sheet where your data is
Dim Destination As Worksheet: Set Destination = ThisWorkbook.Worksheets("Sheet2") ' where the results will be put
Dim Row As Long: Row = 1 ' the row number to start from
Dim Item As String
Data = Source.UsedRange.Value2
' iterate over the data
Do
    Item = Data(Row, 1)
    If Results.Exists(Item) = True Then
        Results(Item) = Results(Item) + 1
    Else
        Results(Item) = 1
    End If
    Row = Row + 1
Loop While Not Data(Row, 1) = ""
' display the output
Destination.Cells.Clear ' reset the worksheet
For Each Key In Results.Keys ' loop through the results
    Destination.Range("A1:B1").Insert xlShiftDown ' move the previous results down
    Destination.Cells(1, 1) = Key
    Destination.Cells(1, 2) = Results(Key)
Next Key

End Sub
于 2013-05-20T01:54:53.663 回答