【问题标题】:Excel score sheetExcel成绩单
【发布时间】:2019-03-23 05:55:53
【问题描述】:

所以,我还没有弄清楚如何做到这一点。

基本上,我想要这样的东西:

P1    P2    P3                TOTAL SCORE
--    --    --                P1   P2   P3
21    /     13                 1    2    0
/     17    10
6      7    /

因此,三列必须相互比较(“/”表示玩家没有玩过该游戏,但不必打印),三列中最大的得到+1总分标签中的值。

另外,有没有比比较一个单元格和另一个单元格更简单的方法呢?我的意思是,是否有可能拖动并标记所有三列上的所有单元格,并确保它们只比较同一行中三列中的单元格?

【问题讨论】:

  • 您喜欢 VBA 代码吗?
  • 我没有使用 VBA,但我总是乐于学习新事物,而且我只是想拥有这种类型的成绩单,所以请随时向我展示
  • 我对代码进行了一些更改。请立即尝试。

标签: excel comparison cell


【解决方案1】:

让我们假设数据在 Sheet1 中显示为如图所示(不要更改结构):

  1. 打开 Excel
  2. 按 ALT 和 F11 打开可视化编辑器
  3. 从 > 插入(在上方工具栏中)- 模块(第三个选项)添加模块
  4. 粘贴以下代码并执行 Sub Evaluation()(当光标在 Sub Evaluation 时按 F5)
  5. 要存储 lastrow 以便从下一条记录继续,我使用 sheet2 range A1

试试:

Option Explicit

Public Sub Process_Data(ByVal I_Value As Long)

Dim LastRow As Long
Dim i As Long
Dim CA As Integer
Dim CB As Integer
Dim CC As Integer

With Sheet1

    LastRow = .Range("A" & Rows.Count).End(xlUp).Row

    For i = I_Value To LastRow '<= Lets say that the first score is at sheet1 column A row 3.LastRow represent the row of the last data in column A
        CA = 0
        CB = 0 '<= Every time that i change value we zero our variables to get the new value
        CC = 0
        If .Range("A" & i).Value = "/" Then '<= Check if there is a number or "/".if there is "/" we zero variable
            CA = 0
        Else
            CA = .Range("A" & i).Value
        End If
        If .Range("B" & i).Value = "/" Then
            CB = 0
        Else
            CB = .Range("B" & i).Value
        End If
        If .Range("C" & i).Value = "/" Then
            CC = 0
        Else
            CC = .Range("C" & i).Value
        End If

        If CA > CB And CA > CC Then ' <= Check which number is bigger
            .Range("E3").Value = .Range("E3").Value + 1 '<= At one point to each category
        ElseIf CB > CA And CB > CC Then
            .Range("F3").Value = .Range("F3").Value + 1
        ElseIf CC > CA And CC > CB Then
            .Range("G3").Value = .Range("G3").Value + 1
        End If
    Next i
End With

End Sub

Sub Evaluation()

Dim Value As Long
Dim LastRow As Long

LastRow = Sheet1.Range("A" & Rows.Count).End(xlUp).Row

If (LastRow = 2) Or (LastRow = Sheet2.Range("A1").Value) Then '<= Check if the table has new data
    Exit Sub
Else
    If Sheet2.Range("A1").Value = "" Then '<=Check which value will adopt be i
        Value = 3
    Else
        Value = Sheet2.Range("A1").Value + 1
    End If
End If

Call Process_Data(I_Value:=Value)

Sheet2.Range("A1").Value = Sheet1.Range("A" & Rows.Count).End(xlUp).Row '<= Record the lastrow processed out

End Sub

【讨论】:

  • 好的,这确实产生了想要的结果,但是当我输入下一个分数时它不会更新。我必须再次重复您的步骤,但结果乘以 2
  • @m164 您必须导入一次结果,然后运行代码以获取结果。如果您打算在现有数据集中添加更多结果,我们必须更改代码。请明确您的需求修改代码。
  • 我认为很明显我打算将其用作工作分数跟踪表,这意味着我会经常向其中添加新分数,所以我试图获得一些关于如何做到这一点的建议在 excel 的代码中,所以它会自动更新......不过,你的回答确实让我感受到了对 VBA 代码的掌握,我感谢你
【解决方案2】:

使用 LARGE 函数查找左侧单个游戏的最大数字。然后使用右边的 IF 语句来检查 LARGE 函数的值是否与玩家的游戏分数相匹配。如果匹配 (TRUE),则指定值 1。如果不匹配 (FALSE),指定值 0。然后使用 IF 函数对您指定的每个玩家的修饰符求和。

如果个别游戏得分可能出现平局,您还需要嵌套另一个 IF 函数来处理这种可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多