アクセスデータベースの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をインクリメントします。これをきれいにする方法に関するアドバイス?ありがとう。
は、次元の配列を宣言する必要があります。要素の数が事前にわからない場合は、配列をReDimする必要があります。 http://patorjk.com/programming/tutorials/vbarrays.htmを確認してください – June7
これはSQLを使うべきです。少なくともVBAを使用したい場合は、VBAロジックが機能するように、SQLでorder by句を追加する必要があります。それを除いて、配列は2つの変数を使う必要はありません。 –