我是一名博士生。我现在正在写关于质数的论文,但我在编程方面有困难。我希望外面有人能帮我解决这个问题。以下是场景:
假设我有一个主要空白点列表:
1
2
2
4
2
4
2
4
6
2
6
4
2
4
6我想知道数字2后面跟着4的实例数。在上面的例子中,2后面跟着4的实例数是4倍。我还想知道数字4后面跟着6的次数,等等。
在上面的数据中,只有15个,但是如果你有大量的数据,就很难计数了。目前我已经有283,146个数据,如果没有程序,我很难做到这一点。
发布于 2015-11-06 16:20:59
列表在A列,选择的第一个和第二个值分别在B1和C1中:
=COUNTIFS(A1:A1048575,B1,A2:A1048576,C1)
请注意,对于几乎所有其他数组处理函数,引用这种大小的范围根本不是一个好主意。然而,COUNTIF(S)/SUMIF(S)使用隐式检测来自传递的任何范围的已用范围,因此仅在这些单元格上操作,因此当引用任意大范围时,性能损失很小或没有损失。
问候
发布于 2015-11-06 19:27:03
@XOR LX答案是完美的,正如@Jeeped所说,它优化了偏移范围的使用。但是,您必须手动定义B:C列中的值列表,并且如果您必须重复多次分析,并且满足条件的唯一素数的范围永远不会相同,则可能会有点单调乏味。如果您想在30秒内实现自动结果。对于100万行,您可以尝试以下VBA代码。
唯一的假设是数据在列A中。如果不是这样,最好的选择是将包含数据的列复制到新工作表的列A中。使用这种数据结构,应该不会有问题。
代码:
Option Explicit
Sub countPrimes()
Dim LRC As Long, LRPrimes As Long, count As Integer, lRowB As Long, Rng As Range
Application.ScreenUpdating = False
LRC = 0
Range("A1").Activate
While Not ActiveCell = ""
If ActiveCell.Value = ActiveCell.Offset(1).Value - 2 Then
LRC = LRC + 1
Range("B" & LRC).Value = ActiveCell.Value
End If
ActiveCell.Offset(1, 0).Activate
Wend
Range("B1", Range("B1").End(xlDown)).Copy Destination:=Range("C1")
Range("C1", Range("C1").End(xlDown)).RemoveDuplicates Columns:=1, Header:=xlNo
Range("C1", Range("C1").End(xlDown)).Sort key1:=Range("C1"), order1:=xlAscending, Header:=xlNo
lRowB = Range("B" & Rows.count).End(xlUp).Row
Set Rng = Range("B1:B" & lRowB)
Range("C1").Activate
While Not ActiveCell = ""
count = Application.WorksheetFunction.CountIf(Rng, ActiveCell.Value)
ActiveCell.Offset(0, 1).Value = count
ActiveCell.Offset(1, 0).Activate
Wend
Range("B1", Range("B1").End(xlDown)).Delete
Application.ScreenUpdating = True
End Sub它是如何工作的?
它遍历列A并将列(x)中的每个单元格与它下面的单元格(y)进行比较。If x = y -2,然后将x的值复制到列B中的第一个空行。在迭代完整个列之后,它将在列C中生成一个唯一素数列表。在这个新列中,有另一个迭代,但这一次,它计数列C中的每个值在列B中出现的次数,并将值放在列D中。列B被删除,因为它不再有用。结果是:
如何在Excel中实现?
如果您从未使用过宏,this official website可以帮助您完成此操作。
https://stackoverflow.com/questions/33562144
复制相似问题