循环访问表和每个包含数据的列

时间:2014-06-23 19:05:11

标签: loops ms-access access-vba

我认为这应该很简单,但我找不到正确的方法。我有一个带有ID号列的表,其后面有10行,标记为问题#1,问题#2,依此类推。

没有重复的ID号,但每个ID号可能有多行问题。

我想获取ID行,并在适用的每个不同问题中创建一个具有相同ID的新行。因此,如果ID号在问题#1和问题#2下列出了问题,我想为该ID号创建一个副本并且在一列下列出两个问题让我们称之为“总问题”,并按其分组身份证号码。这可以通过创建一个新表来完成。

示例:

来自:

+-------+---------------------------+---------------------------+
|  ID   |        Question #1        |        Question #2        |
+-------+---------------------------+---------------------------+
| 11111 | Was it notated correctly? | Was it completed on time? |
+-------+---------------------------+---------------------------+

+-------+-------------------------------------+
|  ID   | Total Questions                     |
+-------+-------------------------------------+
| 11111 | Was it notated correctly?           |
| 11111 | Was it completed on time?           |
+-------+-------------------------------------+

2 个答案:

答案 0 :(得分:1)

使用DAO

的简单解决方案
sub SomeProcedure()
    Dim db as DAO.Database, recIn as DAO.Recordset, recOut as DAO.Recordset

    Set db = currentdb()
    Set recIn = db.openRecordset("yourQuestionsInputTable", dbOpenDynaset, dbReadOnly)
    Set recOut = db.openRecordset("yourQuestionsOutputTable", dbOpenDynaset, dbEditAdd)

    with recIn
        .moveFirst
        do
            for i = 1 to .Fields.count
                if left(.Fields(i).Name, 8) = "Question" then
                    recOut.addNew
                        recOut.Fields("Id") = .fields("Id")
                        recOut.Fields("Total Questions") = .Fields(i)
                    recOut.update
                end if
            next i
            .moveNext
        loop until .EOF
    end with
    recIn.close
    recOut.close
    db.close
end sub

解释:

我正在做的是:

  1. 从输入表中读取每条记录
  2. 对于名称以"Question"开头的每一列,请在输出表中创建一条新记录,其中包含输入表的Id和所选列的值。

  3. 这只是一个草案。您需要调整代码以满足您的需求。

    希望这有帮助。


    <强>替代

    在稍微思考之后,我可能会替换你在评论中提到的问题。

    我认为你可以像这样改变循环:

    ' You'll need a variable of type Field
    Dim f as DAO.Field ' Check if this is right
    ' Some code
    with recIn
        .moveFirst
        do
            for f in .Fields
                if left(f.Name, 8) = "Question" then
                    recOut.addNew
                        recOut.Fields("Id") = .Fields("Id").Value
                        recOut.Fields("Total Questions") = .Fields(f.Name).Value
                    recOut.update
                end if
            next f
            .moveNext
        loop until .EOF
    end with
    ' More code
    

    不是使用索引在Fields集合上进行迭代,而是使用其中的任何Field成员进行迭代。这应该避免在集合中找不到&#34;项目#34;问题。

    警告: 未经过测试

答案 1 :(得分:0)

尝试这样的几个查询:

SELECT ID, Question1 AS TotalQuestions
INTO NewTable
FROM OriginalTable;

SELECT ID, Question2 AS TotalQuestions
INTO NewTable
FROM OriginalTable;