excel - 如何将一张表中的单元格内容动态复制到另一张表中?

标签 excel vba

我正在制作一个我在类里面使用的家庭作业问题数据库。这些存储在名为“Qu Data”的工作表中。我有一个名为“仪表板”的前页。此工作表包含几个下拉菜单,用于过滤和搜索主题。当我选择了一个主题后,我使用索引匹配从 Qu Data 表中提取问题并将它们显示在 Dashboard 表上。
实际问题位于通过工作簿超链接的 Word 文档中。仪表板上显示的是问题标题、描述、难度级别等。其中一列称为“已使用”,我的计划是根据我今年是否给学生这个问题做作业,这会在 Y 和 N 之间变化.
当我将在仪表板表上查看和选择这些问题列表时,我将在那里更改 Y 和 N。
我的目标是在 Qu 数据表中复制这种更改。所以下次我使用 Dashboard 上的下拉菜单并从 Qu 数据表中提取问题列表时,我可以找出我以前是否使用过它们。
我尝试在 VBA 中这样做;

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Range("M20") Then
    If [M20] = "N" Then
        Sheets("Qu Data").Range("K8") = "N"
    ElseIf [M20] = "Y" Then
        Sheets("Qu Data").Range("K8") = "Y"
    End If
End If
这是我的尝试,因为我将在仪表板上列出 10、20 或 25 个问题,例如,这些问题已与 Qu 数据表中的索引匹配。我计划根据我当时选择的问题将两个或三个 N 更改为 Y。然后这些必须反射(reflect)回 Qu 数据表,因此当它们在不同的日子再次被拉出时,我知道不再使用它们。

最佳答案

你的尝试并不遥远。
我将向您展示一种使其正常工作的方法(只要我了解您的要求),然后我将对更改进行一些解释。
尝试将代码更改为:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Target.Address(False, False) = "M20" Then
        Exit Sub
    Else
        If Target.Value = "N" Then
            Sheets("Qu Data").Range("K8") = "N"
        ElseIf Target.Value = "Y" Then
            Sheets("Qu Data").Range("K8") = "Y"
        End If
    End If
End Sub
这将
  • 检查 Target.Address是(好吧,不是)"M20"
  • 如果不是 "M20"退出子程序,这可以防止代码不必要地执行,例如,当它分配 K8 时与 "Y""N" .
  • 其余部分在逻辑上没有变化,尽管我更喜欢避免像 [M20] 这样的引用。并且喜欢使用 `Range("M20") 代替。

  • 文档:
  • Worksheet.Range Property
  • Range.Address Property
  • Not Operator

  • 为什么您的版本没有按预期工作?
    几个关键的事情:
    根据 Range object (Excel)文档:

    The default member of Range forwards calls without parameters to the Value property ...


    所以这意味着
    If Target.Range("M20") Then
    
    是相同的
    If Target.Range("M20").Value Then
    
    我假设您打算让代码评估 TargetRange("M20")而不是该范围的值是TrueFalse .
    然而,还有比这更深层次的问题 - This answer on my question about unexpected results using Target.Resize对此有所启发。
    如果您要创建一个新工作表并输入 Debug.Print Target.Range("M20").AddressWorksheet_Change()事件,您将看到上述链接答案所讨论内容的示例。
    例如,如果您更改单元格 M20你会看到 $Y$39在即时窗口中。
    这是因为 Target.Address$M$20然后我们用 $M$20 引用另一个范围作为起点 - $Y$39M 右侧的 12 列(M 是 A 右侧的 12 列)和向下 20 行(包括第 20 行 - 与第 1 行的第 20 行相同的偏移量)。
    所以这意味着你的代码版本,If Target.Range("M20") Then正在检查 Range("Y39") 的值.除非 ValueY39True , 你的第一个 If Then语句计算为 False因此什么也没有发生。

    关于excel - 如何将一张表中的单元格内容动态复制到另一张表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67920350/

    相关文章:

    python - 如何使用 openpyxl 普通工作簿查找列中的最后一行?

    c# - 如何通过 COM Interop 在 Excel 中获取特定范围?

    python - 访问 Excel 单元格的标题字符串值

    excel - Excel 中按总和分组

    java - 从 ColdFusion 服务器执行 Excel 宏

    vba - 想要在 Excel 中将两个 VBA 宏循环在一起,但我想我只是错过了一些非常小的东西

    ms-access - 如何在 MS Access 中重载 Form_MouseWheel()?

    excel - 循环遍历单元格并更改字体

    excel - VBA 中出现错误并带有消息框

    vba - 如何使用 VBA 将公式添加到单元格