Excel输出循环结果到循环的每一行的新单元格

Excel输出循环结果到循环的每一行的新单元格,excel,vba,new-operator,Excel,Vba,New Operator,我不熟悉Excel宏,我正在尝试使用Countif函数来确定“字符串”在数组中出现的次数(c1:I100)。然后将此结果作为整数输出到单独工作表上的单元格中。我想在一个循环中计算7个不同的“字符串”,并将其输出到同一列中的一个新单元格,作为每个已计算的新“字符串”的第一个输出。这就是我所拥有的,它会导致excel在用第一个计数的字符串值填充所有输出单元格后冻结 Sub LayerIssue_CountIf() Dim SubRange As Range Dim Output1, Output2,

我不熟悉Excel宏,我正在尝试使用Countif函数来确定“字符串”在数组中出现的次数(c1:I100)。然后将此结果作为整数输出到单独工作表上的单元格中。我想在一个循环中计算7个不同的“字符串”,并将其输出到同一列中的一个新单元格,作为每个已计算的新“字符串”的第一个输出。这就是我所拥有的,它会导致excel在用第一个计数的字符串值填充所有输出单元格后冻结

Sub LayerIssue_CountIf()
Dim SubRange As Range
Dim Output1, Output2, Output3, Output4, Output5, Output6, Output7, Output8 As Range
Dim Lookupname As String

Set SubRange = Range("C1:I100")
Set Output1 = Sheet4.Range("C2")
Set Output2 = Sheet4.Range("C3")
Set Output3 = Sheet4.Range("C4")
Set Output4 = Sheet4.Range("C5")
Set Output5 = Sheet4.Range("C6")
Set Output6 = Sheet4.Range("C7")
Set Output7 = Sheet4.Range("C8")
Set Output8 = Sheet4.Range("C9")

y = 2

Do While y = 2
  If Cells(y, 3) = "" Then
  Lookupname = "Jans .5"
  Output1 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 3 Then
  Lookupname = "Jans .4"
  Output2 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 4 Then
  Lookupname = "Jans .3"
  Output3 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 5 Then
  Lookupname = "Jans .2"
  Output4 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 6 Then
  Lookupname = "Jans .1"
  Output5 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 7 Then
  Lookupname = "Jans .05"
  Output6 = WorksheetFunction.CountIf(SubRange, Lookupname)
  
  ElseIf y = 8 Then
  Lookupname = "Jans .01"
  Output7 = WorksheetFunction.CountIf(SubRange, Lookupname)
End If
Loop
End Sub

在VBA编程中不需要使用太多的IFs。精选案例将是首选武器。但是如果结果可以在没有条件的情况下确定,那么效率会更高。此外,考虑使用数组而不是多个变量。

您的代码并不完全清楚您要在哪个基础上处理输出。但是,下面的过程确实说明了您应该采取的方法

Option Explicit

Sub LayerIssue_CountIf()

    Dim SubRange        As Range
    Dim Output(1 To 7)  As Long
    Dim LookupName()    As Variant
    Dim i               As Long                 ' loop counter: Output index
    
    ' The array will be 0-based. To match Output() 0 is added and left unused.
    LookupName = Array(0, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05, 0.01)
    Set SubRange = Range("C2:I100")
    
    ' count from 1 to 7
    For i = LBound(Output) To UBound(Output)
        Output(i) = WorksheetFunction.CountIf(SubRange, "Jans " & Format(LookupName(i), ".0#"))
    Next i
    
    ' cell C3 is included in SubRange. Not sure you want to write there.
    With Cells(2, "B")
        If .Value = "" Then
            .Resize(UBound(Output), 1).Value = Application.Transpose(Output)
        End If
    End With
End Sub

在您的代码中,y=2,此后不会更改。因此,循环将永远持续下去。还要注意,只有
Output8
被声明为范围。默认情况下,同一行中的所有其他输出都声明为变量。我是否必须将输出列表放在括号中才能将它们全部定义为一个范围?我在哪里可以将y=2更改为y=y+1?没有办法。最好是每行声明一个变量。如果必须在一行中包含多个,则可以省略后续的
Dim
,但必须声明每个数组的数据类型,如
Dim Output1为Range,Output2为Range
,除非您使用该名称声明一个数组,如下所示。用
y=y+1
更改y,或在For。。。下一个循环如下所示。在循环中,
Next i
命令使计数器前进。谢谢您的代码。我不知道有这么多不同的命令。我已经干了一个星期了。我将能够从这段代码中学到很多东西。