2016-09-24 68 views
5

Tôi đang cố gắng sử dụng Excel làm Cơ sở dữ liệu và tôi đang làm theo hướng dẫn từ this site.Lỗi OLE khi chạy VBA trong Excel 2016?

Vấn đề là, bất cứ khi nào tôi cố gắng "Cập nhật Drop Downs" trong tệp dưới đây, tôi nhận được lỗi này: "Microsoft đang chờ một ứng dụng khác hoàn thành một hành động OEL".

Tôi đang thiếu gì hoặc làm sai ở đây và làm thế nào để tôi nhận được quyền này?

Tôi đang sử dụng Excel 2016 Home & Học sinh đang phát triển. Tôi cũng cho phép Macros khi mở Workbook.

Cùng một tệp chạy hoàn hảo khi mở trong Excel 2007. Tôi cũng nhận thấy rằng Microsoft ActiveX Data Objects 6.0 Library tham chiếu đến "msado60.dll" trong ví dụ, trong khi đó, tệp "msado60.tlb" trong Excel 2016 (mà tôi sử dụng).

Link to Excel File

Private Sub cmdShowData_Click() 
    'populate data 
    strSQL = "SELECT * FROM [data$] WHERE " 
    If cmbProducts.Text <> "" Then 
     strSQL = strSQL & " [Product]='" & cmbProducts.Text & "'" 
    End If 

    If cmbRegion.Text <> "" Then 
     If cmbProducts.Text <> "" Then 
      strSQL = strSQL & " AND [Region]='" & cmbRegion.Text & "'" 
     Else 
      strSQL = strSQL & " [Region]='" & cmbRegion.Text & "'" 
     End If 
    End If 

    If cmbCustomerType.Text <> "" Then 
     If cmbProducts.Text <> "" Or cmbRegion.Text <> "" Then 
      strSQL = strSQL & " AND [Customer Type]='" & cmbCustomerType.Text & "'" 
     Else 
      strSQL = strSQL & " [Customer Type]='" & cmbCustomerType.Text & "'" 
     End If 
    End If 

    If cmbProducts.Text <> "" Or cmbRegion.Text <> "" Or cmbCustomerType.Text <> "" Then 
     'now extract data 
     closeRS 

     OpenDB 

     rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 
     If rs.RecordCount > 0 Then 
      Sheets("View").Visible = True 
      Sheets("View").Select 
      Range("dataSet").Select 
      Range(Selection, Selection.End(xlDown)).ClearContents 

      'Now putting the data on the sheet 
      ActiveCell.CopyFromRecordset rs 
     Else 
      MsgBox "I was not able to find any matching records.", vbExclamation + vbOKOnly 
      Exit Sub 
     End If 

     'Now getting the totals using Query 
     If cmbProducts.Text <> "" And cmbRegion.Text <> "" And cmbCustomerType.Text <> "" Then 
      strSQL = "SELECT Count([data$].[Call ID]) AS [CountOfCall ID], [data$].[Resolved] " & _ 
      " FROM [Data$] WHERE ((([Data$].[Product]) = '" & cmbProducts.Text & "') And " & _ 
      " (([Data$].[Region]) = '" & cmbRegion.Text & "') And (([Data$].[Customer Type]) = '" & cmbCustomerType.Text & "')) " & _ 
      " GROUP BY [data$].[Resolved];" 

      closeRS 
      OpenDB 

      rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 
      If rs.RecordCount > 0 Then 
       Range("L6").CopyFromRecordset rs 
      Else 
       Range("L6:M7").Clear 
       MsgBox "There was some issue getting the totals.", vbExclamation + vbOKOnly 
       Exit Sub 
      End If 
     End If 
    End If 
End Sub 

Private Sub cmdUpdateDropDowns_Click() 
    strSQL = "Select Distinct [Product] From [data$] Order by [Product]" 
    closeRS 
    OpenDB 
    cmbProducts.Clear 

    rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 
    If rs.RecordCount > 0 Then 
     Do While Not rs.EOF 
      cmbProducts.AddItem rs.Fields(0) 
      rs.MoveNext 
     Loop 
    Else 
     MsgBox "I was not able to find any unique Products.", vbCritical + vbOKOnly 
     Exit Sub 
    End If 

    '---------------------------- 
    strSQL = "Select Distinct [Region] From [data$] Order by [Region]" 
    closeRS 
    OpenDB 
    cmbRegion.Clear 

    rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 
    If rs.RecordCount > 0 Then 
     Do While Not rs.EOF 
      cmbRegion.AddItem rs.Fields(0) 
      rs.MoveNext 
     Loop 
    Else 
     MsgBox "I was not able to find any unique Region(s).", vbCritical + vbOKOnly 
     Exit Sub 
    End If 
    '---------------------- 
    strSQL = "Select Distinct [Customer Type] From [data$] Order by [Customer Type]" 
    closeRS 
    OpenDB 
    cmbCustomerType.Clear 

    rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic 
    If rs.RecordCount > 0 Then 
     Do While Not rs.EOF 
      cmbCustomerType.AddItem rs.Fields(0) 
      rs.MoveNext 
     Loop 
    Else 
     MsgBox "I was not able to find any unique Customer Type(s).", vbCritical + vbOKOnly 
     Exit Sub 
    End If 
End Sub 

enter image description here

+0

'OpenDB' có tạo kết nối cơ sở dữ liệu mới không? – Comintern

+0

@Comintern Vâng, đúng vậy. – Norman

+0

Thực hiện việc này mà không cần VBA có thể dễ dàng hơn https://www.youtube.com/watch?v=P9cUYpXIKsU – Slai

Trả lời

2

mỗi ý kiến, phương pháp OpenDB của bạn đang mở một kết nối ADO. Bạn có vẻ không phải là đóng ở bất cứ đâu.

Bạn đang cố gắng mở lại kết nối đã mở. Lỗi máy chủ OLE cho bạn biết rằng máy chủ (Excel) đang bận vì đã có một kết nối ADO khác gắn với nó. Tất cả những gì bạn cần làm là đảm bảo rằng bạn chỉ mở kết nối sau khi và sau đó đóng nó khi bạn đang làm việc với nó.

+0

Umm ... Làm thế nào để bạn làm điều đó, và nó sẽ đi đâu? – Norman

+0

@Norman - Loại bỏ tất cả các dòng với 'OpenDB' ngoại trừ dòng đầu tiên trong mỗi phụ. Sau đó, thêm 'cnn.Close' vào cuối mỗi phụ. – Comintern

+0

Đó là không sử dụng: (Tôi đã thử gỡ bỏ các phương pháp OpenDB và thêm những gì bạn đề nghị, nhưng nó vẫn như cũ. – Norman

2

Tôi đã gặp sự cố tương tự. Điều này làm việc cho tôi:
1. Trên menu Công cụ, bấm Tùy chọn.
2. Nhấp vào tab Chung.
3. Thay đổi Bỏ qua các ứng dụng khác sử dụng hộp kiểm Dynamic Data Exchange (DDE), sau đó bấm OK.

Tôi chỉ khuyên bạn nên thay đổi cài đặt này trong khi làm việc với hướng dẫn của bạn. Trong khi nó giải quyết vấn đề này cho tôi, nó cũng khiến Excel hành xử kỳ lạ trong một số trường hợp khác.

Nếu bạn cho rằng vấn đề được gắn với phiên bản ADO cụ thể của bạn, bạn cũng có thể thử sử dụng tham chiếu đến phiên bản cũ hơn (chẳng hạn như Thư viện Microsoft ActiveX Data Objects 2.8).

+0

Tôi đã thử. – Norman

1

Tôi vừa thử nghiệm mã của bạn (Excel 2013 được cài đặt) và mọi thứ đều tốt. Không có lỗi xảy ra hoặc một cái gì đó như thế. Tôi cũng đã kiểm tra tham chiếu đến Thư viện đối tượng dữ liệu ActiveX của Microsoft và nó cũng là ".tlb" cho tôi. Vì vậy, tôi nghĩ rằng đây không phải là vấn đề.

Nhưng có một vấn đề mà tôi nghĩ có thể là lý do cho lỗi lầm của mình:

Khi mã của bạn dòng rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic được gọi là mã vĩ mô có thể có thể tiếp tục chạy và gọi dòng tiếp theo trong khi SQL truy vấn không phải là chưa xong. Vì vậy, gọi số rs.RecordCount trong dòng tiếp theo có thể dẫn đến lỗi nếu truy vấn vẫn đang chạy.

Vì tôi không thể tạo lại lỗi của bạn, tôi không thể thực hiện thêm kiểm tra để giải quyết vấn đề của bạn.Vì vậy, hy vọng ý tưởng của tôi có thể giúp bạn hoặc bất kỳ ai khác giải quyết vấn đề của bạn.

Các vấn đề liên quan