【问题标题】:Call Another Sub in The Same Sheet VBA在同一张表VBA中调用另一个子
【发布时间】:2016-02-01 20:12:15
【问题描述】:

起初,我尝试在 VBA 中运行我的代码,但最终出现“程序太大”之类的错误。所以我试图把它分成一些子,当我在我的主子中调用另一个子时,它不起作用。在我划分 sum subs 之前,我的代码运行得很好。

我试图在 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 中的预期结果

这是我的问题的结果 谢谢你的高级!

【问题讨论】:

  • @DirkReichel 我试过你的方法,但结果是错误“找不到方法或数据成员”。顺便说一句,为什么要使用“Me.”?我是 VBA 的新手。
  • 您能否发布您的代码而不是您的代码图片 - 然后可以复制并粘贴到 Excel 中进行测试。
  • @DarrenBartrup-Cook 我已经发布了我的代码。一探究竟。 :D
  • “它不起作用”究竟是什么意思?会发生什么?
  • @DirkReichel 如果例程标记为私有,则不能使用Me.calcal

标签: vba excel


【解决方案1】:

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

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 之后(自我解释)
  • 仅使用 1 次的已跳过变量
  • 直接执行第二个子
  • 搜索匹配Match

【讨论】:

  • Ya... 将其更改为仅在 flag60 为 1 时才调用 sub
【解决方案2】:

将您在 Calca1 子中使用的所有变量声明为全局变量,如下所示。这样你就不需要传递变量,而且你的变量发生的变化也会传递给 Main sub。希望它可以帮助您,而不需要对您的代码进行太多更改

Public CS_Yes As Integer 

【讨论】:

【解决方案3】:

在查看了您的代码并试图弄清楚您的目标之后,我更新了我的答案。
我添加了代码来获取代理名称的唯一列表(注意 - 这在 Excel 2003 或更早版本中不起作用 - 如果在 RemoveDuplicates 上失败,请告诉我)
最后一个块使用 R1C1 引用单元格样式将COUNTIFS 公式添加到您的报告表中。希望您能够从中找出其他公式的工作原理。
R1C1 表示法(可以在这里使用指向 StackOverflow 答案的链接): http://www.numeritas.co.uk/2013/09/the-%E2%80%98dark-art%E2%80%99-of-r1c1-notation/

我已经添加了部分答案,因为我不确定你在追求什么。顶部将创建您的新工作表并给出标题。
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

【讨论】:

  • 我的子 Calca1 怎么样?您是否建议将所有代码合并到一个子中?如果我将两者结合起来,最终会出现“程序太大”之类的错误。因为那个错误,我决定把我的代码分成一些子。我希望代码以与第一个条件相同的顺序运行(合并所有代码)
  • Calca1 中的数据可以合并到您的点击事件代码中 - 我不知道您为什么会收到“程序太大”错误。根据我阅读的内容,它似乎并不太大 - stackoverflow.com/questions/11450232/…。不过,像这样的行让我感到困惑:(Application.WorksheetFunction.CountIfs(Sheets("RawData").Range("R4:R65536"), "No", Sheets("RawData").Range("K4:K65536"), "Agnes")) * 0。如果你数数然后乘以 0,最终的答案肯定是 0 吗? 10 x 0 = 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多