2

状況は次のとおりです。

データベース内の機関データを検証しています。各機関には、関連付けられたコードがあります。データベース内のコードが正しいことを確認し、データベース内の名前にエラーがないことも確認したい. これは手動で行いますが、チェックするレコードが 1200 ほどあります。

すべてのデータが 1 つのワークブックに含まれています。

  • 最初のシートは、データベースからの情報です。機関名は列 B に、コードは列 K に表示されます。コードは数値として格納されます。
  • 2枚目は最新情報です。機関名は列 A、コードは列 D です。コードは番号としても保存されます。
  • 3 番目のシートは結果用に設定されています

最初のシートのコードと 2 番目のシートのコードを照合し、結果を 3 番目のシートに出力したい。各コードには、シート 1 の機関名、コード、および 2 番目のシートの機関名を含む行が必要です。コードが有効であること、データベース内のコードが正しい機関に対応していること、そして最後に機関名の形式やその他の不一致を確認できるようにするために、これを行いたいと考えています。

ここに私の問題があります:

  1. 元のワークブックを使用して何らかの形でデータを破損するのではなく、コピーを作成してコードをテストしました。テスト ファイルで動作するプログラムを書きましたが、元のファイルにコピーして適切な変更を加えると、コードが動作しなくなります。 これはなぜでしょうか?
  2. コードをコピーすると問題が発生するように思われたので、コードをそのまま元のファイルに再入力しました。出来た。しかし、ちょっとだけ。コードは実行されましたが、条件に含まれるコードの一部しか実行されませんでした。ブロックの最初の行が実行されますが、残りはスキップされ、条件には二度と入りません。 すべてが適切にインデントされているため、これが発生する原因は何ですか?
  3. これらすべての問題が発生する理由を検出するために、F8 キーを使用してプログラムをステップ実行してみました。ステップスルーしますが、条件に入ることはありません。ループを通過するだけです。 ステップ イン (F8) コマンドを使用すると、IF ステートメントが評価されませんか?
  4. すべてのレコードを実行して待機するのではなく、ループが適切に機能しているかどうかをテストするために、FOR ループの条件を 1170 から 11 に変更します。ループの実行回数以外は何も変更していません。しかし、プログラムはもはや実行されません。番号を元に戻すと、機能します。 これはなぜでしょうか?

これが私のコードです。最適ではないかもしれませんが、比較を 1 回だけ実行する必要があります。2 時間かかったとしても、すべて手作業でチェックするよりは手間がかかりません。テストファイルで動作するようになったので、このコードが動作することはわかっています。しかし、オリジナルではなぜ機能しないのでしょうか? 機能させるにはどうすればよいでしょうか?

Sub FindMatches()

    Dim oldRow As Integer
    Dim newRow As Integer
    Dim i As Integer

    i = 2

    For oldRow = 2 To 1170
        For newRow = 2 To 1170
            If Worksheets("Sheet1").Cells(oldRow, 9) = Worksheets("Sheet2").Cells(newRow, 4) Then

                Worksheets("Sheet3").Cells(i, 1) = Worksheets("Sheet1").Cells(oldRow, 2)
                Worksheets("Sheet3").Cells(i, 2) = Worksheets("Sheet1").Cells(oldRow, 9)
                Worksheets("Sheet3").Cells(i, 3) = Worksheets("Sheet2").Cells(newRow, 1)

                i = i + 1

                Exit For
            End If
        Next newRow
    Next oldRow

End Sub
4

2 に答える 2

3

間違った列を参照していると思います。列 K は 9 ではなく 11 です

于 2013-03-27T19:41:49.010 に答える
1

内側のループの代わりに Find() を使うかもしれません:

Sub FindMatches()

    Dim shtOld As Worksheet, shtNew As Worksheet, shtMatch As Worksheet
    Dim oldRow As Integer
    Dim newRow As Integer
    Dim i As Integer, id, f As Range

    i = 2

    Set shtOld = ThisWorkbook.Sheets("Sheet1")
    Set shtNew = ThisWorkbook.Sheets("Sheet2")
    Set shtMatch = ThisWorkbook.Sheets("Sheet3")

    For oldRow = 2 To 1170

        id = shtOld.Cells(oldRow, 9)

        Set f = shtNew.Range("D2:D1170").Find(id, , xlValues, xlWhole)
        If Not f Is Nothing Then
            With shtMatch.Rows(i)
                .Cells(1).Value = shtOld.Cells(oldRow, 2)
                .Cells(2).Value = id
                .Cells(3).Value = f.EntireRow.Cells(1)
            End With
            i = i + 1
        End If

    Next oldRow

End Sub
于 2013-03-27T19:51:21.577 に答える