2009-05-27 24 views
15

Tüm yapmaya çalıştığım bir excel sayfası (yani adlandırılmış aralığı, hatta A1: F100) standart bir aralıkta almak ve üzerinde bazı sql sorguları çalıştırmak ve VBA içinde adım olabilir bir recordset dönmek Aynı çalışma kitabında kod yazabilir veya başka bir sayfaya yapıştırabilirsiniz.SQL deyimlerini excel sayfasındaki adlandırılmış bir aralıkta nasıl çalıştırabilirim?

ADODB'yi kullanmak bir düşüncedir, ancak geçerli çalışma kitabındaki bazı noktalara işaret etmek için bağlantıları nasıl ayarlayabilirim?

Microsoft sorgu sihirbazını kullanmadan önce, ideal olmayan, ancak işe yarayacağını biliyorum. Bunu, sayfanın içindeki bir aralığa, sadece diğer excel dosyalarına başvurmak için göremiyorum.


Burada bıraktığım işlev var. Birkaç kez çalıştırdığımda, excel kaynakların her zamanki hata iletisi ile çöküyor. Bu işlevi e-tablomdan kaldırdım ve her şey kesintisiz olarak birkaç kez çalışır, dolayısıyla kesinlikle buradaki koddan kaynaklanır.

Tüm nesneleri temizledim (doğru mu?). Kimsenin neyin yanlış gidebileceği konusunda bir fikri var mı? Bağlantı dizesinde tweaked olabilecek bir şey olabilir veya GetRows yönteminden döndürülen varyantla ilgili bir şey olabilir mi?

MS ADO 2.8 kullanıyorum ve 2.5 aynı davranışı denedim. Hepiniz bulacaksınız

Function getTimeBuckets() As Collection 

Dim strFile As String 
Dim strCon As String 
Dim strSQL As String 
Dim dateRows As Variant 
Dim i As Integer 
Dim today As Date 

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 
Set getTimeBuckets = New Collection 

strFile = ThisWorkbook.FullName 
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 
cn.Open strCon 

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] where [Instrument Type] = 'LSTOPT'" 

rs.Open strSQL, cn 


dateRows = rs.GetRows 
rs.Close 

'today = Date 
today = "6-may-2009" 

For i = 1 To UBound(dateRows, 2) 
    If (dateRows(0, i) >= today) Then 
     getTimeBuckets.Add (dateRows(0, i)) 
    End If 
Next i 

Set dateRows = Nothing 
Set cn = Nothing 
Set rs = Nothing 
End Function 

cevap

16

Sadece ismi kullanabilirsiniz.Buna karşılık

Dim cn As ADODB.Connection 
Dim rs As ADODB.Recordset 

strFile = Workbooks(1).FullName 
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile _ 
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

Set cn = CreateObject("ADODB.Connection") 
Set rs = CreateObject("ADODB.Recordset") 

cn.Open strCon 

''Pick one: 
strSQL = "SELECT * FROM DataTable" ''Named range 
strSQL = "SELECT * FROM [Sheet1$A1:E346]" ''Range 

rs.Open strSQL, cn 

Debug.Print rs.GetString 

size sql değiştirmek mümkün olmalıdır yüzden, yalnızca bugünün kayıtlarını istiyoruz fark part 2

soruya:

strSQL = "SELECT DISTINCT(Expiration) FROM [PositionSummaryTable] " _ 
& "where [Instrument Type] = 'LSTOPT' AND [Expiration]=#" _ 
& Format(Date(),"yyyy/mm/dd") & "#" 

Sen kapatmamışsanız bağlantı:

( )
Set rs=Nothing 
Set cn=Nothing 
+0

Teşekkürler, harika çalışıyor. Bağlantı dizgisi ile farklı bir şey yapmak zorunda kaldığımı düşünen başka bir şey yanlış olmalıyım (yukarıdaki yoruma bakınız). – cOrOllArY

+0

Kaydetmediyseniz, ADO ile ilgili sorunlarla karşılaşabilirsiniz. – Fionnuala

+0

Her şey mükemmel çalışıyor, ancak bir tür bellek sızıntısı oluyor. Aşağıdaki işlevi, yorum için çok uzun olduğu için göndereceğim. – cOrOllArY

0

Aşağıdaki gerekir:

İlk bağlantı, VB.NET içindir 2 bağlantılar - 6 VBA içindir.

One

Two

Three

Four

Five

Six

Tüm google'da bulundu, yaklaşık 2 - 4 dakika.

+1

Merhaba praavDa: '$

örneğin kullanın. Açtığım dosyadan, ayrı bir Excel belgesi değil, bunu yapmanın bir yolunu arıyorum. İhtiyacım olan tek şey bağlantı dizesini nasıl yapılandıracağınızdır, böylece VBA kodunu aradığınız geçerli belgeye başvurur veya bu mümkün olsa bile. Teşekkürler, Mike – cOrOllArY

+0

Merhaba Mike. Anladığım kadarıyla, başvurulan belge, veri kaynağı olarak başvurulan belgedir. Dim stCon Dize stCon = "Sağlayıcı = Microsoft.Jet.OLEDB.4.0;" _ & "Veri Kaynağı = c: \ VBExtreme.xls;" _ & "Gelişmiş Özellikler =" "Excel 8.0; HDR = YES" ";;" aktif çalışma kitabının yolu ile acheived edilebilir Başlarken: yol = a.path & "\" & yol seti ile a.Name ActiveWorkbook = wb Set Çalışma Kitabı gibi Dim wb, sağ con dize istiyorum gibi: Dim stCon As String stCon = "Sağlayıcı = Microsoft.Jet.OLEDB.4.0;" _ & "Veri Kaynağı =" & yol _ & "Gelişmiş Özellikler =" "Excel 8.0; HDR = YES" ";;" – praavDa

+0

Ve eğer yanılmıyorsam, dizenin son kısmı Excel'in VBA editöründe araçlar/Referanslar menüsünde sahip olduğunuz kütüphanenin versiyonudur (büyük olasılıkla Excel 2003 sürümü için 11 veya 2007 sürümü için 12). Sonunda biçimlendirme için üzgünüm, ben bilmiyordum, yorumlarda satır sonları kullanamadım :) – praavDa

0

VBA bilmem ama kod

SELECT * FROM [SheetName$A1:B2] 

bunu denediniz biçimini kullanır Delphi ve C# çevrimiçi vardır?

+1

VBA'da böyle bir ifadeyi nasıl uygularsınız? – cOrOllArY

1

Nasıl GİBİ maddenin kullanımı hakkında?

ben kullanmaya çalıştı:

select * from [PES$] where PID_TAG = 'PIT5400001' 

ama bu benim istediğim değil:

başarılı olamadı
select * from [PES$] where PID_TAG like '*5400001' 

....

bu çalışır. Eğer powershell kullanıyorsanız

DÜZENLEME

hummm .... biz ... , * kullanım%

0

kullanmayın çalışmak için joker değiştirmeniz gerekir, $ bir iç karakterdir . Bütün bu aynı bağlantıları bulundu

"Select * from [VM`$A3:F30]" 
İlgili konular