2013-03-31 32 views
5

Tôi có sổ làm việc với nhiều trang tính và mỗi trang có cùng một tập hợp các dải ô được đặt tên (IE chúng được sắp xếp theo trang tính chứ không phải bảng tính).Không thể truy vấn phạm vi được đặt tên trên trang tính với các khoảng trống trong tên trong Excel

Tôi muốn truy vấn dựa trên phạm vi được đặt tên trên bất kỳ trang tính nào. Một số trang tính có tên không có dấu cách và một số trang khác có tên bằng dấu cách.

Tôi có thể dễ dàng thực hiện việc này cho những người không có không gian, nhưng cú pháp để thực hiện việc này với dấu cách thoát khỏi tôi (và một giờ google-ing).

Dải ô có tên là "Thành phần" và một tấm được đặt tên "NoSpaces", người kia "Với Spaces"

Dưới đây là đoạn code mà hoạt động tốt cho "NoSpaces" tấm:

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dictNewRecipesToCheck(arrKeys(0)) & ";Extended Properties=""Excel 12.0;HDR=No;IMEX=1;""" 
strQuery = "Select * from [NoSpaces$Ingredients]" 
Set objConn = New ADODB.Connection 
Set objRecordSet = New ADODB.Recordset 
objConn.Open sConnString 
objRecordSet.Open strQuery, objConn 

tôi đã thử tất cả những điều sau đây cho tờ "Với Không gian":

strQuery = "Select * from [With Spaces$Ingredients]" 
strQuery = "Select * from ['With Spaces'$Ingredients]" 
strQuery = "Select * from ['With Spaces$'Ingredients]" 
strQuery = "Select * from [With_Spaces$Ingredients]" 

Mỗi lần, tôi nhận được lỗi "Cơ sở dữ liệu Microsoft Access không thể tìm thấy đối tượng ..." lỗi.

Như tôi đã đề cập, nó hoạt động tốt cho tất cả các trang không có khoảng trống trong tên.

Bất kỳ trợ giúp nào để làm việc này trên trang tính có dấu cách, sẽ được MUCH đánh giá cao.

Cảm ơn!

cập nhật dựa trên ý kiến ​​dưới đây:

Excel 2007

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;""" 

Khi chạy qua đoạn code schema được cung cấp bởi @shahkalpesh nó sẽ liệt kê TABLE_NAME như chỉ là "Thành phần" cho cả hai dãy tên (mặc dù từng là scoped đến một tờ khác nhau).
Với trình điều khiển này, ngay cả [NoSpaces $ Ingredients] không hoạt động.

sConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;""" 

Khi chạy qua mã lược đồ được cung cấp bởi @shahkalpesh, danh sách TABLE_NAME là "NoSpaces $ Ingredients" và "With Spaces '$ Ingredients". Với trình điều khiển này, [NoSpaces $ Ingredients] hoạt động tốt (không phải với trình điều khiển ACE).
Tuy nhiên, bằng cách sử dụng tên chính xác như được báo cáo theo lược đồ, ['With Spaces' $ Ingredients] không hoạt động.

Excel 2013

sConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileLoc & ";Extended Properties=""Excel 12.0 Macro;HDR=No;IMEX=1;""" 

Khi chạy qua đoạn code schema được cung cấp bởi @shahkalpesh nó sẽ liệt kê TABLE_NAME là "NoSpaces $ Thành phần" và " 'Với Spaces $' Thành phần". Với trình điều khiển này, [NoSpaces $ Ingredients] hoạt động tốt, nhưng ['With Spaces' $ Ingredients] không hoạt động.

Cuối cùng, hãy tham khảo http://db.tt/3lEYm2g1 cho một trang mẫu được tạo trong Excel 2007 có sự cố này trên (ít nhất) 2 máy khác nhau.

+0

Sử dụng Excel 2013 Tôi đã giải quyết vấn đề bằng cách giới thiệu một phạm vi thông thường (không phải dải ô được đặt tên) VÀ sử dụng dấu hai chấm (":"). Ví dụ. '[Report 1 $ A15]' sẽ không hoạt động, nhưng '[Report 1 $ A15: A15]' hoạt động. – ZygD

Trả lời

6

Có thể sử dụng phạm vi excel thay vì phạm vi được đặt tên không? Tôi có các công việc sau đây:

SELECT * FROM [Report 1$A4:P] 

Tôi lấy tên trang tính từ phương thức GetOleDbSchemaTable() và xóa dấu nháy đơn. Tên trang tính có dấu nháy đơn không hoạt động đối với tôi với dải ô.

if (tableName.Contains(' ')) 
      tableName = Regex.Match(tableName, @"(?<=')(.*?)(?=\$')", RegexOptions.None).Value + "$"; 
+0

Cảm ơn bạn. Tôi đã gặp vấn đề tương tự như OP và tôi có thể xác nhận xóa dấu ngoặc kép xung quanh trong trường hợp bạn đang chọn phạm vi hoạt động. – Rivka

0

Tên của tấm với các không gian tiếp theo loạt tên có thể được viết là [ 'My Tấm $' MyData]

Sau đây là cách bạn có thể liệt kê các bảng chứa trong workbook

1) Mã để có được danh sách các bảng trong bảng tính

dim i as Integer 

Set objRecordSet = objConn.OpenSchema(adSchemaTables) 
Do While Not objRecordSet.EOF 
    i = 1 
    For i = 0 To objRecordSet.Fields.Count - 1 
     Debug.Print objRecordSet.Fields(i).Name, objRecordSet.Fields(i).Value 
    Next 

    objRecordSet.MoveNext 
Loop 

EDIT: Đối với kịch bản của bạn, nó sẽ được

strQuery = "Select * from ['With Spaces$'Ingredients]" 

EDIT2: Tôi xin lỗi, tôi đã dán mã sai lần đầu tiên. Vui lòng sử dụng mã ở trên trong danh sách 1 và tìm kiếm TABLE_NAME trong cửa sổ ngay lập tức. Việc liệt kê các dải ô được đặt tên có tên trang tính sẽ được hiển thị trên TABLE_NAME (mà bạn có thể truy vấn).

Ngoài ra, hãy đảm bảo rằng dải ô được đặt tên được đặt ở phạm vi trang tính. Đảm bảo rằng vỏ của tên trang tính và tên dải ô khớp với truy vấn.

+0

Đó là những gì tôi cho là đúng. Tuy nhiên, nó vẫn ném cùng một lỗi khi tôi sử dụng SQL đó. Tương tự với 'trước $. Tôi bắt đầu nghĩ đây thực sự là một lỗi trong tài xế. Nếu tôi đổi tên trang tính thành "WithSpaces" và sử dụng "Select * from ['WithSpaces $' Ingredients]" nó hoạt động tốt. Đổi tên thành "With Spaces" và sử dụng "Select * from ['With Spaces $' Ingredients]" nó ném lỗi. – user2229491

+0

@ user2229491: Kiểm tra câu trả lời đã sửa đổi và thêm nhận xét của bạn nếu nhận xét đó không hữu ích. Cảm ơn. – shahkalpesh

+0

Sử dụng mã ở trên (hoặc thông qua adox.catalog.tables) nó cung cấp tên bạn mong đợi 'Với Không gian $' Thành phần. Nhưng sử dụng nó trong truy vấn vẫn còn ném lỗi. Ngoài ra, tôi chắc chắn nó không phải là một vấn đề với phạm vi hoặc mistyping, vv, bởi vì tôi có thể loại bỏ không gian (trong tên tờ thực tế và trong mã của tôi) và nó hoạt động tốt. Đặt nó trở lại và nó ném lỗi. – user2229491

0

Truy vấn bên dưới sẽ hoạt động. Chỉ cần đảm bảo phạm vi có tên Thành phần tồn tại trong trang tính Với Không gian. Cũng lưu sổ làm việc.

strQuery = "Select * from [Với Thành phần Spaces $]"

Hoặc bạn có thể sử dụng dưới đây

strQuery = "Select * from [Với" & Chr (32) & "Spaces $ Ingredients]"

+0

đó là điều đầu tiên tôi đã thử ... xem danh sách các truy vấn từ bài đăng gốc của tôi. Chr (32) không tạo nên sự khác biệt đáng tiếc. – user2229491

+0

@ user2229491 Hoạt động của nó ở phần cuối của tôi. Bạn đang sử dụng phiên bản excel nào? – Santosh

+0

Tôi đang sử dụng excel 2013 pro – user2229491

0

Một lối muộn để đảng ...

tôi không thể nhận được bất kỳ phản hồi ở đây để làm việc cho toàn bộ tấm, vì vậy tôi làm một loạt tên cho toàn bộ tấm (chọn tất cả tế bào và cung cấp cho họ một tên - tôi gọi họ POList) và gọi đó như sau:

UPDATE [POList] SET..... etc 

Vì vậy, không có dấu ngoặc kép duy nhất, không backticks, không có dấu hiệu $, thậm chí không tên sheet.

Có nói rằng, sổ làm việc được đề cập chỉ có một trang tính (trong đó có không gian trong tên).

này hoạt động sử dụng Excel 2002 (!) Và mã kết nối sau

Dim cn As ADODB.Connection 
Set cn = New ADODB.Connection 
With cn 
    .Provider = "Microsoft.Jet.OLEDB.4.0" 
    .ConnectionString = "Data Source=C:\Purchase Req No. List.xls; Extended Properties=Excel 8.0;" 
    .Open 
End With 

Rõ ràng điều này sẽ không làm việc cho tình hình của mọi người và là một chút của một workaround kludgey, nhưng có lẽ ai đó sẽ tìm thấy nó hữu ích. ..

0

Tôi đã gặp sự cố tương tự này và có thể giải quyết mà không có dải ô được đặt tên. Ngoài ra, như là một phần hai lần của những gì vấn đề của tôi, hãy chắc chắn rằng không có dấu cách không gian trong tên bảng tính. Hãy thử ...

strQuery = "Select * from ['With Spaces$']" 
Các vấn đề liên quan