非常简单的模块失败。错误:91,对象变量或未设置块变量

时间:2015-08-12 18:16:21

标签: vba ms-access ms-access-2007

此代码只是从表中提取信息,并将其插入临时表中。从那里,它使用与给定的程序ID相关的正确程序名更新行,这是它失败的地方。

我不确定为什么这个简单的模块不能运行,我已经声明了变量,并初始化了它。查询也非常简单。任何帮助都将不胜感激 - 我已经找不到一些非常明显的东西。

Dim year As String
Dim month As String
Dim contract As String
Dim programId As String
Dim ConsumerId As String
Dim programName As String

Dim db As Database

Dim Records As DAO.recordset
Dim Records2 As DAO.recordset


year = Forms!formAllentownMasterGeneration!cboYear
month = Forms!formAllentownMasterGeneration!cboMonth
contract = Forms!formAllentownMasterGeneration!cboContract

'Empty temporary table
strSQL = "DELETE * FROM billing_days_allentown1_temp"

 DoCmd.RunSQL (strSQL)

 'Gather and insert consumer information into temp table
 strSQL = "INSERT INTO Billing_days_allentown1_temp (consumer_id, program_id, lname, fname, dob, transport_type, memo) SELECT consumer_info.consumer_id, consumer_info.program_id, consumer_info.lname, consumer_info.fname, consumer_info.dob, consumer_info.transport_type, consumer_info.memo FROM consumer_info WHERE contract_name = [contract]"

DoCmd.RunSQL (strSQL)

'Get ID's of all consumers in temp table so we can find program names
strSQL = "SELECT consumer_id, program_id FROM Billing_days_allentown1_temp"

Set Records = db.OpenRecordset("SELECT consumer_id, program_id FROM billing_days_allentown1_temp")

While Not Records.EOF

ConsumerId = Records!Fields(0)
programId = Records!Fields(1)

strSQL2 = "SELECT name FROM program_info where program_id = [programId]"
Set Records2 = db.OpenRecordset("SELECT name FROM program_info where program_id = [programId]")

programName = Records2!Fields(0)

strSQL2 = "UPDATE billing_days_allentown1_temp SET program_name = [ProgramName] WHERE program_id = programId and consumer_id = [consumerId]"
DoCmd.RunSQL (strSQL2)

Records.MoveNext

Wend

DoCmd.Close acForm, "formAllentownMasterGeneration"

另外(但不可否认的是我还没有考虑过的问题),它提示我输入合同名称,尽管在表格中提供了它。我确定我在查询中引用了错误的变量;但我的VBA很生疏。如果这是一个快速修复,我会很感激有人指出这一点,否则这是我将在适当的时候自己解决的问题。

谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个......它应该稍微清理你的SQL语句......并传递变量,而不是[变量]

Dim year As String
Dim month As String
Dim contract As String
Dim programId As String
Dim ConsumerId As String
Dim programName As String
Dim strSQL As String
Dim strSQL2 As String
Dim db As Database

Dim Records As DAO.recordset
Dim Records2 As DAO.recordset

year = Me.cboYear   '<--- Assuming you are on Forms!formAllentownMasterGeneration - you can use Me.
month = Me.cboMonth
contract = Me.cboContract

'Empty temporary table
strSQL = "DELETE * FROM billing_days_allentown1_temp"

 DoCmd.RunSQL (strSQL)

 'Gather and insert consumer information into temp table
 strSQL = "INSERT INTO Billing_days_allentown1_temp (consumer_id, program_id, lname, fname, dob, transport_type, memo) " & _
          "SELECT consumer_info.consumer_id, consumer_info.program_id, consumer_info.lname, consumer_info.fname, consumer_info.dob, consumer_info.transport_type, consumer_info.memo " & _
          "FROM consumer_info " & _
          "WHERE contract_name =" & contract

DoCmd.RunSQL (strSQL)

'Get ID's of all consumers in temp table so we can find program names
strSQL = "SELECT consumer_id, program_id " & _
         "FROM Billing_days_allentown1_temp"

Set Records = db.OpenRecordset(strSQL)

While Not Records.EOF
  ConsumerId = Records!Fields(0)
  programId = Records!Fields(1)

  strSQL2 = "SELECT name " & _
            "FROM program_info " & _
            "WHERE program_id = " & programId
  Set Records2 = db.OpenRecordset(strSQL2)

  ProgramName = Records2!Fields(0)

  strSQL2 = "UPDATE billing_days_allentown1_temp " & _
            "SET program_name = " & ProgramName & " " & _
            "WHERE program_id = " & programId & " and consumer_id = " & consumerId
  DoCmd.RunSQL (strSQL2)

  Records.MoveNext

Wend

DoCmd.Close acForm, "formAllentownMasterGeneration"