在一张纸中查找一个值,计算它并将结果粘贴到另一张纸中

Posted

技术标签:

【中文标题】在一张纸中查找一个值,计算它并将结果粘贴到另一张纸中【英文标题】:Look for an value in a sheet count it and paste the result in another sheet 【发布时间】:2017-12-03 04:49:50 【问题描述】:

我有两张表格 sheet1 和 sheet2

在 sheet1 的 AX 列中,我使用公式打印了我当前的一周。我正在寻找 sheet1、T 列和 U 列,并计算两列中 1 的数量。

两列的 1 计数应粘贴到 sheet2 中,查看 AX 列中 sheet1 的周数。如果 AX 列的第 24 周,那么它应该沿着 sheet2、A 列运行 24 并粘贴 B 列中 T 的计数值和 C 列中 U 的计数值,并计算两者的百分比并粘贴到 C和 D。

我尝试了一个代码,我经常得到它为 0,我在我错的地方感到震惊。既不检查计数也不检查周数。

Sub test()
Dim col As Range
Dim row As Range
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Dim T As Integer
Dim U As Integer
Dim wk As String

Set sh1 = Sheets("BW")
Set sh2 = Sheets("Results")



For Each col In sh2.Columns 'This loops through all populated columns in row one
    If sh2.Cells(1, col.Column).Value = "" Then
        Exit For
    End If

    wk = sh2.Cells(1, col.Column).Value

    For Each rw In sh1.Rows
        If sh1.Cells(rw.row, 50).Value = "" Then
            Exit For
        End If

        If sh1.Cells(rw.row, 50) = wk And sh1.Cells(rw.row, 20) = 1 Then
            T = T + 1
        End If

        If sh1.Cells(rw.row, 50) = wk And sh1.Cells(rw.row, 21) = 0 Then
            U = U + 1
        End If
    Next rw

sh2.Cells(2, col.Column) = T 'put counters into 2nd and 3rd row under each week, you can adjust this to put the number in a different cell.
sh2.Cells(3, col.Column) = U

T = 0 'reset counters to start looking at next week.
U = 0

Next col

End Sub

【问题讨论】:

@pnuts 对不起。我不太明白你的意思 您之前的许多问题都有尚未接受的答案 - 他们没有提供问题的解决方案吗? @paulbica 不,它们不是我期望的解决方案。大多数我有解决方案,我已经接受并标记为绿色。 @paulbica 你能帮我为这种情况或上面的代码有什么问题提供答案吗? 我不太清楚你想要完成什么。您能否展示一个小样本,说明 sheet1 现在的外观以及 sheet2 的外观?当前数据和预期结果 - 我想复制你正在做的事情 【参考方案1】:

从问题中可以看出,A 列中指示的给定周的“结果”表在 B 列和 C 列中分别显示另一张表的 T 和 U 列中的 1 计数。

解决此问题的一种方法是,对于“结果”表中的每一行,计数器都会查看“AX”列中指示的那一周“BW”表的所有行,以从 T 和 U 列中获取计数。

这会给你一些想法:

Sub test()
    Dim i As Integer, j As Integer, cntT As Integer, cntU As Integer, ws As Worksheet
    Set ws = Sheets("Results")
    Sheets("BW").Select
    For i = 2 To WorksheetFunction.CountA(ws.Columns(1))
        If ws.Range("A" & i) = Val(Format(Now, "ww")) Then Exit For
    Next i
    ws.Range("B" & i & ":" & "E" & i).ClearContents
    cntT = 0
    cntU = 0
    For j = 5 To WorksheetFunction.CountA(Columns(50))
        If ws.Range("A" & i) = Range("AX" & j) And Range("AA" & j) <> "" Then
            If Range("T" & j) = 1 Then cntT = cntT + 1
            If Range("U" & j) = 1 Then cntU = cntU + 1
        End If
    Next j
    If cntT <> 0 Then ws.Range("B" & i) = cntT
    If cntU <> 0 Then ws.Range("C" & i) = cntU
    If cntT + cntU <> 0 Then
        ws.Range("D" & i) = cntT / (cntT + cntU)
        ws.Range("E" & i) = cntU / (cntT + cntU)
    End If
    ws.Range("D" & i & ":E" & i).NumberFormat = "0%"
End Sub

更新:根据与@Mikz 的后续讨论,将以下标准添加到上述更新代码中:

    它只会覆盖当前周,因此对于 2017 年 7 月 2 日,如果在“结果”表的“A 列”中找到它只会覆盖当前周 27 如果 is 输出为 0,则将目标单元格保留为空白 如果“BW”表的AA列的各个单元格为空白,则该行将不计入1s 工作表“BW”数据从第 5 行开始

【讨论】:

您提供的代码效果很好。但是,我不希望我的 sheet2“结果”中的先前列或其余列被评估为 0 。因为这是一种评估记录。所以我上周进行了评估。本周 26 我正在进行新的评估,这意味着,我希望将新的 Count 值存储为一周,而前一周应该保持原样。 抱歉不是很清楚。您不希望结果表评估为 0,因此如果计数为 0,它是否应在结果表中显示为空白而不是 0?如果您不想对结果表中的旧数据进行任何更改,那么新增的标识符是什么?一个例子将有助于澄清 我已经添加了一个澄清图像和描述。可能是清楚的。或者我会解释一下 感谢@Curious 澄清我的问题。谢谢你 使用上面的代码,我正在检查 AA 列是否为空,如果为空我不想要来自 T 和 U 的 Count 值,如果不为空,那么我需要来自 T 和 U 的 Count 值. 为此,我使用了行“ If ws.Range("AA" & i) = "" Then GoTo nextrow ,在 J= 2 之后,我收到一个错误 Label not defined

以上是关于在一张纸中查找一个值,计算它并将结果粘贴到另一张纸中的主要内容,如果未能解决你的问题,请参考以下文章

将每个唯一值从一张纸复制并粘贴到另一张纸上

宏 - 如果值满足条件复制粘贴到另一张纸

从范围循环中的每个单元格复制数据并将其粘贴到另一张纸上

使用多个单元格从另一张纸中搜索数据吗?

根据查找值将值从一张表匹配并粘贴到另一张表中

可以将行中的数据从一张纸复制到另一张纸吗?