Работа со строками в Excel для проверки согласованности данных - PullRequest
1 голос
/ 01 июня 2010

Справочная информация: - Есть около 7000 человек, и есть данные об их производительности в одном, двух или трех тестах.

Каждый человек прошел 1-й тест (назовем его Тест М ). Некоторые из тех, кто прошел Тест М, также прошли Тест I , а некоторые из тех, кто сдал Тест I, также прошли Тест В .

Для первых двух тестов (M и I) учащиеся могут набрать оценки I, II или III . В зависимости от оценок им присуждается баллов - 3 для I класса, 2 для II, 1 для III .

Последний тест B - это всего лишь прохождение или неудачный результат без оценок. Те, кто проходит этот тест, получают 1 балл без баллов за неудачу. (Ну, на самом деле, оценки присуждаются, но все оценки получают 1 балл).

Любитель ввел данные для представления этих учеников и их оценок в файле Excel. Проблема в том, что этот человек сделал худшую возможную вещь - он разработал свою собственную запись и ввел всю тестовую информацию в одну клетку - и сделал мою жизнь адом.

В файле изначально было два текстовых столбца, один для идентификатора индивидуума и второй для тестовой информации, если можно так назвать.

альтернативный текст http://i48.tinypic.com/5tv0bl.png Это ужасно, я знаю, и я страдаю. На изображении, если вы видите «M-II-2 I-III-1», это означает, что человек получил оценку II в тесте M за 2 балла и оценку III в тесте I за 1 балл. Некоторые прошли только один тест, некоторые два, а некоторые три.

Когда файл пришел ко мне для обработки и анализа успеваемости учащихся, я отправил его обратно с инструкциями, чтобы вставить 3 дополнительных столбца с оценками только для трех тестов. Файл теперь выглядит следующим образом. Столбцы C и D представляют I, II и III классы с использованием 1,2 и 3 соответственно. Столбец C предназначен для Теста M, столбец D для Теста I. В столбце E указано BA (B Достигнуто!), Если человек прошел Тест B.

альтернативный текст http://i50.tinypic.com/16c0yvr.png

Теперь, когда у вас есть вышеуказанная информация, давайте перейдем к проблеме. Я не доверяю этому и хочу проверить, совпадают ли данные в столбце B с данными в столбцах C, D и E.

То есть я хочу изучить строку в столбце B и выяснить, правильны ли цифры в столбцах C, D и E.

Вся помощь очень ценится.

P.S. - Я экспортировал это в MySQL через ODBC, и поэтому вы видите эти NULL. Я тоже пытался сделать это в MySQL, и действительно приму решение MySQL или Excel, у меня нет предпочтений.

Редактировать: - См. Файл с образцами данных

1 Ответ

0 голосов
/ 01 июня 2010

Чтобы создать плоский файл из исходных данных:

Sub GetData()
    Dim cn As Object
    Dim rs As Object
    Dim strFile As String
    Dim strCon As String
    Dim strSQL As String
    Dim s As String, t As Variant, x As Variant
    Dim i As Integer, j As Integer, k As Integer

    ''This is not the best way to refer to the workbook
    ''you want, but it is very conveient for notes
    ''It is probably best to use the name of the workbook.

    strFile = ActiveWorkbook.FullName

    ''Note that if HDR=No, F1,F2 etc are used for column names,
    ''if HDR=Yes, the names in the first row of the range
    ''can be used.
    ''This is the Jet 4 connection string, you can get more
    ''here : http://www.connectionstrings.com/excel

    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    ''Late binding, so no reference is needed

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")


    cn.Open strCon

    strSQL = "SELECT * " _
           & "FROM [Sheet1$] "

    ''Open the recordset for more processing
    ''Cursor Type: 3, adOpenStatic
    ''Lock Type: 3, adLockOptimistic
    ''Not everything can be done with every cursor type and
    ''lock type. See http://www.w3schools.com/ado/met_rs_open.asp

    rs.Open strSQL, cn, 3, 3

    ''Pick a suitable empty worksheet for the results

    With Worksheets("Sheet2")

        ''Fill headers into the first row of the worksheet


        .Cells(1, 1) = "ID"
        .Cells(1, 2) = "Exam"
        .Cells(1, 3) = "Grade"
        .Cells(1, 4) = "Points"

        ''Working with the recordset ...

        ''Counter for Fields/Columns in Recordset and worksheet
        ''Row one is used with titles, so ...
        i = 1

        Do While Not rs.EOF


            ''Store the ID to a string (if it is a long,
            ''change the type) ...

            s = rs!ID

            t = Split(rs!testinfo, " ")

            For j = 0 To UBound(t)
                ''(Counter)
                i = i + 1

                .Cells(i, 1) = s

               x = Split(t(j), "-")

                For k = 0 To UBound(x)
                    If t(j) = "BA-1" Then
                        .Cells(i, 2) = "B"
                        .Cells(i, 3) = "A"
                        .Cells(i, 4) = 1
                    Else
                        .Cells(i, k + 2) = x(k)
                    End If
                Next
            Next


            ''Keep going 
            rs.MoveNext

        Loop

   ''Finished with the sheet
   End With

   ''Tidy up
   rs.Close
   Set rs = Nothing
   cn.Close
   Set cn = Nothing
End Sub

Чтобы проверить дополнительные столбцы:

Sub CheckData()
    Dim cn As Object
    Dim rs As Object
    Dim strFile As String
    Dim strCon As String
    Dim strSQL As String
    Dim s As String, t As Variant, x As Variant
    Dim i As Integer, j As Integer, k As Integer
    Dim BAErr, MErr, IErr

    strFile = ActiveWorkbook.FullName

    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _
        & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")

    cn.Open strCon

    strSQL = "SELECT * " _
           & "FROM [Sheet1$] "

    rs.Open strSQL, cn, 3, 3

    Do While Not rs.EOF

        t = Split(rs!testinfo, " ")

        For j = 0 To UBound(t)
           x = Split(t(j), "-")

           Select Case x(0)
                Case "BA"
                    If rs![test b] <> "BA" Then
                        BAErr = BAErr & "," & rs!ID
                    End If
                Case "M"
                    If String(rs![test m], "I") <> x(1) Then
                        MErr = MErr & "," & rs!ID
                    End If
                Case "I"
                    If String(rs![test i], "I") <> x(1) Then
                        IErr = IErr & "," & rs!ID
                    End If
           End Select
        Next

        rs.MoveNext

    Loop


   ''Tidy up
   rs.Close
   Set rs = Nothing
   cn.Close
   Set cn = Nothing

   If BAErr <> "" Then
      MsgBox Mid(BAErr, 2), , "B Errors"
   End If

   If MErr <> "" Then
      MsgBox Mid(MErr, 2), , "M Errors"
   End If

   If IErr <> "" Then
      MsgBox Mid(IErr, 2), , "I Errors"
   End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...