循环遍历记录集并根据条件将记录写入特定行

Posted

技术标签:

【中文标题】循环遍历记录集并根据条件将记录写入特定行【英文标题】:Loop through recordset and write records to specific rows based on condition 【发布时间】:2021-05-05 10:54:32 【问题描述】:

我有一个记录集循环问题,我在这里没有看到我可以适应的解决方案,所以我问这个问题:

我有一个行项目列表的 Excel 模板,项目 1 到 20,列在模板的第 1 到 20 行中。单元格 A1 到 A20 的数值为“1”到“20”,并且永远不会改变。

我有一个 SQL Server 数据库表,其中包含所有专员的所有行项目。该表包含委员姓名和流水号等内容。

最初,如果委托了 10 个项目,它们位于模板的第 1 - 10 行,并在数据库中具有相应的运行编号。然后发生的情况是,这 10 件商品中的一些已售出,从清单中删除,并被删除或存档在数据库中。

因此,作为示例,我最终得到了一个运行编号为 1、3、4 和 7 的记录集。我需要的是,当我用数据库中的剩余记录填充 Excel 列表时,剩余的运行数字位于“他们的”行中,其中 A 行中的单元格值与运行记录数匹配。

我的代码循环通过记录集,只是将剩余的 4 条记录拍到第 1 到第 4 行。

但是我需要的是一个从模板的一行移动到下一行的循环,检查 A 列中的单元格值,检查记录集中是否有相应的运行数字值,如果true,并移至下一行。

也许我必须使“行”变量的值取决于我的记录集中的运行数值,但这感觉非常复杂,所以也许有更多经验的人有一个更简单的解决方案。

我的代码(这是一个简单的“将所有内容都放入”循环)如下所示:

在 SQL Query 中选择了专员,“row”变量在其他地方定义,只说明要开始的行号。

Sub test()
    Do While (Not rs1.EOF)
        Worksheets("Tabelle1").Select

        'I tried at different places (inside and outside of the Do...Loop)
        'If rs1!RunningNumber.Value = ActiveSheet.Range("A" & Row).Value Then
        'but that only had the effect of stopping the loop afetr the first record.
                               
        ActiveSheet.Range("B" & Row).Value = rs1!ArticleDescription.Value
        ActiveSheet.Range("F" & Row).Value = rs1!Size.Value
        ActiveSheet.Range("G" & Row).Value = rs1!CategoryID.Value
        ActiveSheet.Range("I" & Row).Value = rs1!Price.Value
        ActiveSheet.Range("L" & Row).Value = rs1!AdditionalInfo.Value
                    
        Row = Row + 1
      
        rs1.MoveNext
    Loop
End Sub

【问题讨论】:

【参考方案1】:

几个一般原则。 (1) 尽量避免在 VBA 代码中使用 Select。 Some examples of how to avoid select。 (2) 将不依赖于迭代器值的所有内容移出循环。

根据您的描述,听起来您应该将工作表目标行的值设置为数据库表中“运行编号”的值。试试这个,看看它是否适合你。

Sub test()

    Dim ws as worksheet

    Set ws = Worksheets("Tabelle1")

    Do Until rs1.EOF
                               
        Row = rs1!RunningNumber.Value
        ws.Range("B" & Row).Value = rs1!ArticleDescription.Value
        ws.Range("F" & Row).Value = rs1!Size.Value
        ws.Range("G" & Row).Value = rs1!CategoryID.Value
        ws.Range("I" & Row).Value = rs1!Price.Value
        ws.Range("L" & Row).Value = rs1!AdditionalInfo.Value
      
        rs1.MoveNext
    
    Loop
    
End Sub

【讨论】:

非常感谢,这让我走上了正轨。我没有想到使用 RunningNumber 值将循环直接指向我希望它放入数据的行,而是我只想检查每一行的所有运行数字。但有一件事:使用“Cell”时出现错误(从德语翻译)“运行时错误'5':无效的程序调用或无效参数。”这可能是什么原因?用像Worksheets("Tabelle1").Range("B" & Row).Value) 这样的工作表/范围引用替换“单元格”后,它现在可以按预期工作。再次感谢! 啊!感谢您的提醒。我已经更正了我的代码,以防其他有类似问题的人遇到这个答案并遇到相同的错误。很高兴你成功了。

以上是关于循环遍历记录集并根据条件将记录写入特定行的主要内容,如果未能解决你的问题,请参考以下文章

循环访问 Access 中的两个记录集并更新条目

循环记录集并添加到字典/集合:项目键存在

经典asp的性能提示?

获取特定子记录的 SQL 查询

如何遍历 spark 数据集并更新 Java 中的列值?

Apache Spark Java - 如何遍历行数据集并删除空字段