Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA-循环处理多个数据变量的更简单方法_Vba_Excel - Fatal编程技术网

Excel VBA-循环处理多个数据变量的更简单方法

Excel VBA-循环处理多个数据变量的更简单方法,vba,excel,Vba,Excel,有趣的问题,除了“否”之外可能没有其他答案。我有下面填写电子表格的代码。解释这一行: CACsatSummary.Range("B2") = WorksheetFunction.CountIfs(name, var01, score, "1") 等号左边是明显的(图纸和范围)。右边是CountIfs函数。后面是“名称”,它是C列的一个范围。Var01-Var07是存在于C列中的7个分析师名称(dim'd并设置在我提供的名称之上)。score是另一个范围,这次是d列。而“1”(同样,2、3、4和

有趣的问题,除了“否”之外可能没有其他答案。我有下面填写电子表格的代码。解释这一行:

CACsatSummary.Range("B2") = WorksheetFunction.CountIfs(name, var01, score, "1")
等号左边是明显的(图纸和范围)。右边是CountIfs函数。后面是“名称”,它是C列的一个范围。Var01-Var07是存在于C列中的7个分析师名称(dim'd并设置在我提供的名称之上)。score是另一个范围,这次是d列。而“1”(同样,2、3、4和5)是存在于d列中的值

整个代码所做的是循环遍历一个数据表,计算每个分析师(var01-var07)每个分数(1-5)的实例数,并将它们放入一个新表中,该表汇总了所有数据。虽然下面的代码工作得很好,但我觉得可能有更好的方法来编写它,而不是现在的40多行代码

感谢您的帮助

'Fill in data
    Dim var01, var02, var03, var04, var05, var06, var07 As String
    var01 = "A,  Person"
    var02 = "B,  Person"
    var03 = "C,  Person"
    var04 = "D,  Person"
    var05 = "E,  Person"
    var06 = "F,  Person"
    var07 = "G,  Person"

    Dim CACsatSummary As Worksheet, CACsatDetails As Worksheet, name As Range, score As Range
    Set CACsatSummary = Sheets("CSAT Summary")
    Set CACsatDetails = Sheets("CSAT Details")
    Set name = Sheets("CSAT Details").Range("C2:C10000")
    Set score = Sheets("CSAT Details").Range("D2:D10000")

'Find the values
    CACsatSummary.Range("B2") = WorksheetFunction.CountIfs(name, var01, score, "1")
    CACsatSummary.Range("B3") = WorksheetFunction.CountIfs(name, var02, score, "1")
    CACsatSummary.Range("B4") = WorksheetFunction.CountIfs(name, var03, score, "1")
    CACsatSummary.Range("B5") = WorksheetFunction.CountIfs(name, var04, score, "1")
    CACsatSummary.Range("B6") = WorksheetFunction.CountIfs(name, var05, score, "1")
    CACsatSummary.Range("B7") = WorksheetFunction.CountIfs(name, var06, score, "1")
    CACsatSummary.Range("B8") = WorksheetFunction.CountIfs(name, var07, score, "1")
    CACsatSummary.Range("C2") = WorksheetFunction.CountIfs(name, var01, score, "2")
    CACsatSummary.Range("C3") = WorksheetFunction.CountIfs(name, var02, score, "2")
    CACsatSummary.Range("C4") = WorksheetFunction.CountIfs(name, var03, score, "2")
    CACsatSummary.Range("C5") = WorksheetFunction.CountIfs(name, var04, score, "2")
    CACsatSummary.Range("C6") = WorksheetFunction.CountIfs(name, var05, score, "2")
    CACsatSummary.Range("C7") = WorksheetFunction.CountIfs(name, var06, score, "2")
    CACsatSummary.Range("C8") = WorksheetFunction.CountIfs(name, var07, score, "2")
    CACsatSummary.Range("D2") = WorksheetFunction.CountIfs(name, var01, score, "3")
    CACsatSummary.Range("D3") = WorksheetFunction.CountIfs(name, var02, score, "3")
    CACsatSummary.Range("D4") = WorksheetFunction.CountIfs(name, var03, score, "3")
    CACsatSummary.Range("D5") = WorksheetFunction.CountIfs(name, var04, score, "3")
    CACsatSummary.Range("D6") = WorksheetFunction.CountIfs(name, var05, score, "3")
    CACsatSummary.Range("D7") = WorksheetFunction.CountIfs(name, var06, score, "3")
    CACsatSummary.Range("D8") = WorksheetFunction.CountIfs(name, var07, score, "3")
    CACsatSummary.Range("E2") = WorksheetFunction.CountIfs(name, var01, score, "4")
    CACsatSummary.Range("E3") = WorksheetFunction.CountIfs(name, var02, score, "4")
    CACsatSummary.Range("E4") = WorksheetFunction.CountIfs(name, var03, score, "4")
    CACsatSummary.Range("E5") = WorksheetFunction.CountIfs(name, var04, score, "4")
    CACsatSummary.Range("E6") = WorksheetFunction.CountIfs(name, var05, score, "4")
    CACsatSummary.Range("E7") = WorksheetFunction.CountIfs(name, var06, score, "4")
    CACsatSummary.Range("E8") = WorksheetFunction.CountIfs(name, var07, score, "4")
    CACsatSummary.Range("F2") = WorksheetFunction.CountIfs(name, var01, score, "5")
    CACsatSummary.Range("F3") = WorksheetFunction.CountIfs(name, var02, score, "5")
    CACsatSummary.Range("F4") = WorksheetFunction.CountIfs(name, var03, score, "5")
    CACsatSummary.Range("F5") = WorksheetFunction.CountIfs(name, var04, score, "5")
    CACsatSummary.Range("F6") = WorksheetFunction.CountIfs(name, var05, score, "5")
    CACsatSummary.Range("F7") = WorksheetFunction.CountIfs(name, var06, score, "5")
    CACsatSummary.Range("F8") = WorksheetFunction.CountIfs(name, var07, score, "5")

你的问题是正确地循环。控制这个循环。通常,您必须在Excel中循环浏览列和行,并从包含一些变量的工作表函数中为它们提供一些值。为了简化,我将编写
var01
var02
var07
到一个名为
myPeople
的数组(),我将循环遍历它们,将每个数组分配给一个单元格

与其解释,不如观察和测试:

Sub TestMe()

    Dim myPeople    As Variant
    Dim cntRows     As Long
    Dim cntCols     As Long
    Dim cntArr      As Long        

    myPeople = Array("A", "B", "C", "D", "E", "F", "G")

    For cntCols = 2 To 7        'column B to G
        For cntRows = 2 To 8    'row 2 to row 8
            With Worksheets(1)
                .Cells(cntRows, cntCols) = myPeople(cntArr Mod UBound(myPeople))
            End With
            cntArr = cntArr + 1
        Next cntRows
    Next cntCols

End Sub
任务中棘手的部分是找到一种方法,在
myPeople
数组中循环,一旦到了末尾,就从头开始。这可以通过
Mod
功能+递增计数器轻松实现。因此,在代码末尾,您将实现以下目标:

这不是你想要的,但它有两个主要任务的答案:

  • 如何在单元格中循环
  • 如何循环遍历数组

从那里到您的
工作表函数。CountIfs
如果您尝试30分钟左右,那么道路应该是畅通的。

我使用了一个select case来更改分析师名称,并使用了两个for循环来循环不同的行和列。您可以从Vityata的答案中替换出数组的Select Case。然后用变量i(mypeople(i))增加数组


也许使用透视表。您也可以在vba中创建一个。因此,如果我有一个包含(比方说)1000行数据的表。每个人都在不同的地方,有不同的分数。摘要表(与上面粘贴的表类似)的列标题为1-5,行标签为A-G(分析师名称)。所以从理论上讲,您提供的代码应该(希望)连续循环并列出每个分析师的每个分数的实例数?只是想确保我正确理解了您提供的内容。@sbagnato-只需打开一个新的Excel文件并尝试一下即可。更糟糕的情况是,你需要在结束前喝杯咖啡。哈哈。嗯,它“起作用了”,而且很快。但是,它没有提供每个分析师每个分数的实例数,而是提供了您提供的屏幕截图的精确副本。因此,我将不得不对它进行一些操作,以使它产生我以前得到的结果。@sbagnato-很高兴听到它以某种方式起作用了。通常,您在
工作表功能中有两个变化变量,分别是
var05
等和
1
2
3
。对于后者,您可以在外环上使用计数器,它将起作用。祝你好运,玩得开心
    Dim CACsatSummary As Worksheet, CACsatDetails As Worksheet, name As Range, score As Range
    Set CACsatSummary = Sheets("CSAT Summary")
    Set CACsatDetails = Sheets("CSAT Details")
    Set Names = Sheets("CSAT Details").Range("C2:C10000")
    Set score = Sheets("CSAT Details").Range("D2:D10000")

'Find the values
For x = 1 To 5
   For i = 1 To 7
    Select Case i
    Case 1
    varN = "A,  Person"
       Case 2
    varN = "B,  Person"
        Case 3
    varN = "C,  Person"
        Case 4
    varN = "D,  Person"
        Case 5
    varN = "E,  Person"
        Case 6
    varN = "F,  Person"
        Case 7
    varN = "G,  Person"
    End Select
CACsatSummary.Cells(i + 1, x + 1) = WorksheetFunction.CountIfs(Names, varN, score, x)
  Next i
  Next x