在同一张VBA中调用另一个子组件

在第一次,我试图运行我的代码在VBA,但它结束了错误,如“过程太大”。 所以我试图把它分成一些潜艇,当我在我的主要子目录中调用另一个子,它不起作用。 在分解总和之前,我的代码运行良好。

我试图在Private Sub Commandbutton2_Click()中调用Private sub Calca1()

这是我的代码

Private Sub Calca1() If flag60 = 1 Then Sheets("KPIAgent").Cells(trow2 + 1, 1).Value = "Agnes" CS_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("R4:R65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 30 CS_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("R4:R65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 3).Value = (CS_Yes + CS_No) / var60 HT_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("T4:T65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 20 HT_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("T4:T65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 4).Value = (HT_Yes + HT_No) / var60 H_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("V4:V65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 40 H_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("V4:V65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 5).Value = (H_Yes + H_No) / var60 RP_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("X4:X65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 10 RP_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("X4:X65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 6).Value = (RP_Yes + RP_No) / varreport60 trow2 = trow2 + 1 End If End Sub Private Sub CommandButton2_Click() Sheets.Add.Name = "KPIAgent" Sheets("KPIAgent").Activate Sheets("KPIAgent").Cells(1, 1).Value = "Agent Name" Sheets("KPIAgent").Cells(1, 2).Value = "AVG Score" Sheets("KPIAgent").Cells(1, 3).Value = "AVG Common Sense Score" Sheets("KPIAgent").Cells(1, 4).Value = "AVG Human Touch Score" Sheets("KPIAgent").Cells(1, 5).Value = "AVG Helpful Score" Sheets("KPIAgent").Cells(1, 6).Value = "AVG Reporting Score" Sheets("KPIAgent").Cells(1, 7).Value = "Satisfaction - STP" Sheets("KPIAgent").Cells(1, 8).Value = "Satisfaction - TP" Sheets("KPIAgent").Cells(1, 9).Value = "Satisfaction - P" Sheets("KPIAgent").Cells(1, 10).Value = "Satisfaction - SP" Sheets("KPIAgent").Columns("A:J").Select Selection.EntireColumn.AutoFit Sheets("KPIAgent").Range("A1:J1").Font.Bold = True Dim i As Integer Dim flag60 As Integer Dim trow As Integer Dim trow2 As Integer Dim var60 As Integer Dim varreport60 As Integer var60 = Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("K4:K65536"), "Agnes") varreport60 = Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("K4:K65536"), "Agnes", Sheets("RawData").Range("Q4:Q65536"), "Recording") trow = Sheets("RawData").UsedRange.Rows.Count trow2 = Sheets("KPIAgent").UsedRange.Rows.Count For i = 4 To trow If Sheets("RawData").Cells(i, 11).Value = "Agnes" Then flag60 = 1 End If Next i Dim CS_Yes As Integer Dim CS_No As Integer Dim CS As Integer Dim HT_Yes As Integer Dim HT_No As Integer Dim HT As Integer Dim H_Yes As Integer Dim H_No As Integer Dim H As Integer Dim RP_Yes As Integer Dim RP_No As Integer Dim RP As Integer Call Calca1 End Sub 

在这里我的数据库(RawData) 在这里输入图像说明

在这里我的预期结果在KPIAgent 在这里输入图像说明

这里来自我的问题的结果 在这里输入图像说明 先进的Thankyou!

保持你的代码不变(只是为了使其工作):

 Private Sub Calca1(trow2, var60, varreport60) Dim CS_Yes As Integer Dim CS_No As Integer Dim CS As Integer Dim HT_Yes As Integer Dim HT_No As Integer Dim HT As Integer Dim H_Yes As Integer Dim H_No As Integer Dim H As Integer Dim RP_Yes As Integer Dim RP_No As Integer Dim RP As Integer Sheets("KPIAgent").Cells(trow2 + 1, 1).Value = "Agnes" CS_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("R4:R65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 30 CS_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("R4:R65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 3).Value = (CS_Yes + CS_No) / var60 HT_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("T4:T65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 20 HT_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("T4:T65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 4).Value = (HT_Yes + HT_No) / var60 H_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("V4:V65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 40 H_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("V4:V65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 5).Value = (H_Yes + H_No) / var60 RP_Yes = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("X4:X65536"), "Yes", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 10 RP_No = (Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("X4:X65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0 Sheets("KPIAgent").Cells(trow2 + 1, 6).Value = (RP_Yes + RP_No) / varreport60 trow2 = trow2 + 1 End Sub Private Sub CommandButton2_Click() Sheets.Add.Name = "KPIAgent" Sheets("KPIAgent").Activate Sheets("KPIAgent").Cells(1, 1).Value = "Agent Name" Sheets("KPIAgent").Cells(1, 2).Value = "AVG Score" Sheets("KPIAgent").Cells(1, 3).Value = "AVG Common Sense Score" Sheets("KPIAgent").Cells(1, 4).Value = "AVG Human Touch Score" Sheets("KPIAgent").Cells(1, 5).Value = "AVG Helpful Score" Sheets("KPIAgent").Cells(1, 6).Value = "AVG Reporting Score" Sheets("KPIAgent").Cells(1, 7).Value = "Satisfaction - STP" Sheets("KPIAgent").Cells(1, 8).Value = "Satisfaction - TP" Sheets("KPIAgent").Cells(1, 9).Value = "Satisfaction - P" Sheets("KPIAgent").Cells(1, 10).Value = "Satisfaction - SP" Sheets("KPIAgent").Columns("A:J").Select Selection.EntireColumn.AutoFit Sheets("KPIAgent").Range("A1:J1").Font.Bold = True Dim i As Integer Dim flag60 As Integer Dim trow As Integer Dim trow2 As Integer Dim var60 As Integer Dim varreport60 As Integer var60 = Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("K4:K65536"), "Agnes") varreport60 = Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("K4:K65536"), "Agnes", Sheets("RawData").Range("Q4:Q65536"), "Recording") trow = Sheets("RawData").UsedRange.Rows.Count trow2 = Sheets("KPIAgent").UsedRange.Rows.Count For i = 4 To trow If Sheets("RawData").Cells(i, 11).Value = "Agnes" Then flag60 = 1 End If Next i If flag60 = 1 Then Calca1 trow2, var60, varreport60 End Sub 

编辑

这就像我会写代码:

 Option Explicit Private Sub CommandButton2_Click() Sheets.Add.Name = "KPIAgent" With Sheets("KPIAgent") .Activate With .Range("A1:J1") .Value = Array("Agent Name", "AVG Score", "AVG Common Sense Score", "AVG Human Touch Score", "AVG Helpful Score", "AVG Reporting Score", _ "Satisfaction - STP", "Satisfaction - TP", "Satisfaction - P", "Satisfaction - SP") .Font.Bold = True .EntireColumn.AutoFit End With End With With Sheets("RawData") If IsNumeric(Application.Match("Agnes", .Range("K4:K" & Sheets("RawData").UsedRange.Rows.Count).Value, 0)) Then Calca1 2, Application.WorksheetFunction.CountIf(.Range("K4:K65536"), "Agnes"), _ Application.WorksheetFunction.CountIfs(.Range("K4:K65536"), "Agnes", .Range("Q4:Q65536"), "Recording") End If End With End Sub Private Sub Calca1(ByVal tRow As Long, ByVal var60 As Long, ByVal varreport60 As Long) With Sheets("RawData") Sheets("KPIAgent").Cells(tRow, 1).Value = "Agnes" Sheets("KPIAgent").Cells(tRow, 3).Value = (Application.WorksheetFunction.CountIfs(.Range("R4:R65536"), "Yes", .Range("K4:K65536"), "Agnes") * 30) / var60 Sheets("KPIAgent").Cells(tRow, 4).Value = (Application.WorksheetFunction.CountIfs(.Range("T4:T65536"), "Yes", .Range("K4:K65536"), "Agnes") * 20) / var60 Sheets("KPIAgent").Cells(tRow, 5).Value = (Application.WorksheetFunction.CountIfs(.Range("V4:V65536"), "Yes", .Range("K4:K65536"), "Agnes") * 40) / var60 Sheets("KPIAgent").Cells(tRow, 6).Value = (Application.WorksheetFunction.CountIfs(.Range("X4:X65536"), "Yes", .Range("K4:K65536"), "Agnes") * 10) / varreport60 End With End Sub 
  • 标题为数组 – >只是更快
  • .AutoFit后自动.Bold (自我解释)
  • 跳过的variables只能使用一次
  • 直接执行第二个子
  • search匹配Match

声明你在Calca1子目录中使用的所有variables为全局variables,如下所示。 这样你就不需要传递variables,而且variables也会发生变化,并且会传递给Main子类。 希望它能帮助你,而不必对代码做太多的改变

 Public CS_Yes As Integer 

我已经更新了我的答案后,仔细查看你的代码,并试图找出你在做什么。
我已经添加了代码来获取代理名称的唯一列表(请注意 – 这不适用于Excel 2003或更早版本 – 请告诉我是否在RemoveDuplicates失败)
最后一个块使用引用单元格的R1C1样式将COUNTIFS公式添加到报告表单中。 希望你能弄清楚这个方法是如何工作的。
R1C1符号(可以做一个链接到一个StackOverflow答案在这里): http ://www.numeritas.co.uk/2013/09/the-%E2%80%98dark-art%E2%80%99-of- R1C1表示法/

我已经添加了一个部分的答案,因为我不知道你在做什么。 最上面的部分将创build您的新工作表并给出标题。
rLastCell查找原始数据表中K列中的最后一个单元格。 之后,你开始计数的东西 – 但在一些你然后乘以0的结果会给你0 – 所以我很困惑。

 Private Sub CommandButton2_Click() Dim wrkSht As Worksheet Dim wrkShtTmp As Worksheet Dim rLastCell As Range Dim rLastKPICell As Range Dim var60 As Integer Dim varReport60 As Integer 'Add the new sheet and give headings. Set wrkSht = ThisWorkbook.Worksheets.Add With wrkSht .Name = "KPIAgent" .Range("A1:J1") = Array("Agent Name", "AVG Score", "AVG Common Sense Score", _ "AVG Human Touch Score", "AVG Helpful Score", "AVG Reporting Score", _ "Satisfaction - STP", "Satisfaction - TP", "Satisfaction - P", _ "Satisfaction - SP") With .Range("A1:J1") .EntireColumn.AutoFit .Font.Bold = True End With End With With ThisWorkbook.Worksheets("Raw Data") 'Find last cell on raw data sheet. Set rLastCell = .Cells.Find("*", , , , , xlPrevious) If Not rLastCell Is Nothing Then 'Get unique list of agent names and paste into KPIAgent sheet. Set wrkShtTmp = ThisWorkbook.Worksheets.Add .Range(.Cells(3, 11), .Cells(rLastCell.Row, 11)).Copy _ Destination:=wrkShtTmp.Cells(1, 1) wrkShtTmp.Range(wrkShtTmp.Cells(1, 1), wrkShtTmp.Cells(rLastCell.Row, 1)) _ .RemoveDuplicates Columns:=1, Header:=xlNo wrkShtTmp.Range(wrkShtTmp.Cells(1, 1), wrkShtTmp.Cells(rLastCell.Row, 1)).Copy _ Destination:=wrkSht.Range("A2") Application.DisplayAlerts = False wrkShtTmp.Delete Application.DisplayAlerts = True End If End With 'Add figures to the report. With wrkSht 'Find last cell on KPI sheet. Set rLastKPICell = .Columns(1).Find("*", , , , , xlPrevious) 'Add formula to column 3 (C) of reporting sheet. .Range(.Cells(2, 3), .Cells(rLastKPICell.Row, 3)).FormulaR1C1 = _ "=COUNTIFS('Raw Data'!R2C11:R" & rLastCell.Row & "C11,RC1, " & _ "'Raw Data'!R2C14:R" & rLastCell.Row & "C14,""Recording""," & _ "'Raw Data'!R2C15:R" & rLastCell.Row & "C15,""Yes"")*30" End With End Sub