2017-06-08 21 views
0

アクセスデータベースの2つのテーブル(VBAコードと同じデータベースファイル内)の値をループスルーして値を増やそうとしていますPART FIND NOが前のPART FIND NOと一致するときには、EQP_POS_CDフィールド。クエリ:レコードセットに配列をロードして値を増やしてVBAアクセスを増やす

SELECT CTOL.ID, CTOL.BOM_PART_NAME, CTOL.CII, CTOL.[PART FIND NO], CTOL.CSN, 
     CTOL.AFS, CTOL.EQP_POS_CD, CTOL.LCN, CTOL.POS_CT, CTOL.SERIAL_NO, 
     CTOL.PART_NO_LLP, [CTOL_Asbuilt].[PART-SN], [CTOL_Asbuilt].[PART-ATA-NO], 
     [CTOL_Asbuilt].[PW-PART-NO] 
FROM CTOL LEFT JOIN [CTOL_Asbuilt] ON CTOL.[PART FIND NO] = [CTOL_Asbuilt].[PART-ATA-NO]; 

コード:

Option Compare Database 
Option Explicit 




'Const adOpenStatic = 3 
'Const adLockOptimistic = 3 

Function queryDatabase() 

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim qdf As QueryDef 
'Dim rsQuery As DAO.Recordset 
Dim rows As Variant 


Dim part_find_no() As String 
Dim eqp_pos_no() As Integer 
'Dim strSQL As String 

Dim i As Integer 
Dim j As Integer 
'Set objConnection = CurrentDb.OpenRecordset("CTOL") 

Set db = CurrentDb 

Set qdf = db.QueryDefs("SicrProcess") 

Set rs = qdf.OpenRecordset(dbOpenDynaset) 

If rs.EOF Then GoTo Leave 
rs.MoveLast 
rs.MoveFirst 


For i = 0 To rs.RecordCount 
    part_find_no() = rs("PART FIND NO") 
    eqp_pos_no() = rs("EQP_POS_CD") 
    If part_find_no(i) = part_find_no(i - 1) Then 
     eqp_pos_no(i) = eqp_pos_no(i) + 1 
    End If 
    Debug.Print rs.Fields("PART FIND NO") & " " & rs.Fields("EQP_POS_CD") 
    rs.MoveNext 
Next i 

Leave: 
    On Error Resume Next 
    rs.Close 
    Set rs = Nothing 
    qdf.Close 
    Set qdf = Nothing 
    Set db = Nothing 
    db.Close 
    On Error GoTo 0 
    Exit Function 

ErrProc: 
    MsgBox Err.Description, vbCritical 
    Resume Leave 
End Function 

私はここで間違っているかわからないんだけど。それは配列を期待していますが、どういうわけかそれらの配列を初期化する必要がありますか?クエリによって生成された結果からこれらのフィールドを配列に設定するにはどうすればよいでしょうか?私はそのクエリの結果がロードされるだけで、これらのフィールドはPART FIND NOとEQP_POS_CDのような配列にロードされます。次に、現在のPART FIND NOが前のPART FIND NOと同じである場合、2つのフィールドの行をループしてEQP_POS_CDをインクリメントします。これをきれいにする方法に関するアドバイス?ありがとう。

+0

は、次元の配列を宣言する必要があります。要素の数が事前にわからない場合は、配列をReDimする必要があります。 http://patorjk.com/programming/tutorials/vbarrays.htmを確認してください – June7

+0

これはSQLを使うべきです。少なくともVBAを使用したい場合は、VBAロジックが機能するように、SQLでorder by句を追加する必要があります。それを除いて、配列は2つの変数を使う必要はありません。 –

答えて

1

私は配列オブジェクトが必要とは思わない。考えてみましょう:コードを実行した後

Sub SetSeq() 

Dim rs As DAO.Recordset, x As Integer, strPart As String, intSeq As Integer 
Set rs = CurrentDb.OpenRecordset("SELECT [Part Find No], EQP_POS_CD FROM CTOL ORDER BY [Part Find No], SERIAL_NO;") 

If rs.EOF Then GoTo Leave 

rs.MoveLast 
rs.MoveFirst 
strPart = rs![Part Find No] 
For x = 1 To rs.RecordCount 
    If rs![Part Find No] <> strPart Then 
     intSeq = 0 
     strPart = rs![Part Find No] 
    End If 
    intSeq = intSeq + 1 
    rs.Edit 
    rs!EQP_POS_CD = intSeq 
    rs.Update 
    rs.MoveNext 
Next x 

Leave: 
    On Error Resume Next 
    rs.Close 
    Set rs = Nothing 
    On Error GoTo 0 
    Exit Sub 

ErrProc: 
    MsgBox Err.Description, vbCritical 
    Resume Leave 
End Sub 

テーブル:

+------------+--------------+-----------+ 
| EQP_POS_CD | Part Find No | SERIAL_NO | 
+------------+--------------+-----------+ 
|   1 | a   | abc1  | 
|   2 | a   | abc2  | 
|   3 | a   | abc3  | 
|   1 | b   | abc4  | 
|   2 | b   | abc5  | 
|   1 | c   | abc6  | 
|   2 | c   | abc7  | 
|   3 | c   | abc8  | 
+------------+--------------+-----------+ 
+0

フィードバックありがとうございます。これはかなり良い見えます!私はそれをテストします。私はまだVBAに精通していますが、どのようにVBAモジュールのサブを呼びますか?私はモジュール内でVBAサブを呼び出す方法を探していましたが、私は混乱しています。私はSubの下に電話をかけ、コメントだけがEnd Subに続くことができるというエラーを投げます。もう一度ありがとう!:) – evvdogg

+0

心配しないで、私はちょうどマクロから関数として実行しようとします(それは動作しますか?)。私は今、次のエラーが表示されます: "Nullの無効な使用"。私はこのNull値がどこにあるかを調べようとしています。何か案は? – evvdogg

+0

これをトリガーするコードは次のとおりです。 strPart = rs![PART FIND NO] – evvdogg

関連する問題