Kapalı dosyadan veri almak

Katılım
20 Ekim 2005
Mesajlar
476
sevgili haluk üstadın ado ile veri alma makrolarını kendime uyarlamaya çalıştım ama bir türlü beceremedim.
C nin içinde bulunan Demirbaş klasörünün içindeki Demirbaş.xls dosyasından a1:l1200 arası verileri listboxa birtürlü yüklemiyor ve
The source file or source range invalid hatası veriyor.


Dim NewSh
'
Const SourceFile As String = "C:\Demirbaş\Demirbaş.xls"
Const SourceSheet As String = "Sayfa11"
Const SourceRange As String = "A1:L1200"
'
Private Sub CommandButton1_Click()
Dim MyArr
Dim Start As Double, Finnish As Double
Start = Timer
If SheetExists("DataSheet") = True Then
Application.DisplayAlerts = False
Sheets("DataSheet").Delete
Application.DisplayAlerts = True
End If
Set NewSh = Sheets.Add(After:=Sheets(Sheets.Count))
NewSh.Name = "DataSheet"
NewSh.Visible = False
Call GetDataFromClosedWorkbook(SourceFile, SourceRange)
ListBox1.ColumnCount = 5
MyArr = Sheets("DataSheet").Range("A1:E5000").Value
ListBox1.List = MyArr
Application.DisplayAlerts = False
NewSh.Delete
Application.DisplayAlerts = True
Finnish = Timer
MsgBox "ListBox is loaded in " & Format(Finnish - Start, "00") & " seconds !"
End Sub
'
Private Sub GetDataFromClosedWorkbook(SourceFile As String, SourceRange As String)
Dim dbConnection As Object, rs As Object
Dim dbConnectionString As String
Set dbConnection = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.recordset")

Dim TargetCell As Range, i As Integer
dbConnectionString = "DRIVER={Microsoft Excel Driver (*.xls)};" & _
"ReadOnly=1;DBQ=" & SourceFile
On Error GoTo InvalidInput
dbConnection.Open dbConnectionString
Set rs = dbConnection.Execute("[" & SourceSheet & "$" & SourceRange & "]")
Set TargetCell = NewSh.Cells(1, 1)
TargetCell.CopyFromRecordset rs
rs.Close
dbConnection.Close
Set TargetCell = Nothing
Set rs = Nothing
Set dbConnection = Nothing
On Error GoTo 0
Exit Sub
InvalidInput:
MsgBox "The source file or source range is invalid!", vbExclamation
End Sub
'
Private Function SheetExists(sname) As Boolean
Dim x As Object
On Error Resume Next
Set x = ActiveWorkbook.Sheets(sname)
If Err = 0 Then
SheetExists = True
Else
SheetExists = False
End If
End Function


kodlarda düzelme yapan arkadaşlara şimdiden teşekkürler
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Kodlar gayet güzel çalışıyor ve veriler kapalı durumdaki C:\Demirbaş\Demirbaş.xls dosyasının Sayfa11 isimli sayfasında A1:L1200 aralığındaki verileri getiriyor, hiçbir problem yok.

Sadece, sizin veri alanınıza göre aşağıdaki düzeltmeleri yapmak gerekiyor.

Kod:
ListBox1.ColumnCount = 12
MyArr = Sheets("DataSheet").Range("A1:L1200").Value
Kodlarda adı geçen klasör ve dosya yolları ile sayfa isimlerinin doğru olduğunu kontrol edin.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bir de, yaşadığınız sorun kullandığınız Office versiyonu ile ilgili olabilir.

Profilinizde, kullandığınız Office versiyonu belirtilmemiş.

Kodlarda CopyFromRecordset metodu kullanılmaktadır ki, bunun için en az Office2000 veya üzeri bir versiyon gereklidir.
 
Katılım
20 Ekim 2005
Mesajlar
476
bu konuda bir problemim var test dosyasından Sheet1 deki verileri d2 den itibaren alıyor bunu listboxa d1 yani başlık metinlerinide almak için nasıl düzeltme yapılabilir
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
C:\Demirbaş\Demirbaş.xls dosyasında verilerin olduğu sayfada en üstünde bir satır ilave edip, buradaki 1nci satırın hücrelerine (A1:L1) ilgisiz bazı metinler girin. Örneğin bu hücrelerin hepsine WEB yazın.

Daha sonra kodu aynen, çalıştırın. (Sonradan ilave ettiğiniz 1nci satır ListBox'da gözükmez, merak etmeyin.)
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
airborne,

Bu kadar ısrarla soruyordunuz, işinize yaradı mı ?
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Sizden henüz bir cevap yok ama, ben bir alternatif daha getireyim.

Bu yöntemde, ListBox'ın sütun adedi de kodda sizin belirttiğiniz veri alanına göre otomatik olarak ayarlanmakta (Const SourceRange As String = "A1:L1200" satırındaki hücre referansına göre) ve belirttiğiniz gibi, veri alanında ilk satırdaki veriler de ListBox üzerinde listelenmektedir. Kodlar da gayet hızlı çalışmaktadır.

Artık gerisini siz bilirsiniz, benden bu kadar ... :mrgreen:
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Yok canım, o kadar abartmayın.

Ama, fena değilimdir ... :mrgreen:
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
Merhabalar.
Sn: Haluk hocam.Dosyanızı indirim.
Const SourceRange As String = "A1:L1200" ile A1:L1200 aralığı Listboxta listeleniyor.
Bu kodu A sütununda Son dolu hücreye göre nasıl düzenleyebiliriz?
:hey:
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Veriler A1:L1200 değil de A1:L60 aralığında ise, sadece o kadarı görünür.

İşi garantiye almak isterseniz, A1:L65536 olarak değiştirin. Bu alanda ne varsa, onu getirir.
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
Merhabalar.
Teşekkürler hocam.Konuyu şimdi dağa iyi anladım.
Bir de ,SpreadSheet'te Nasıl gösterebiliriz bu alanı acaba?(kusura bakmayın Biraz fazla soruyorum galiba, ama bu kapalı dosyadan veri alma veri okuma değişiklik yapma konularına biraz kafayı taktımda)
:hey:
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Önce sayfa üzerine dataları alın, sonra da Spreadsheet nesnesine aktarın. Sonra da, sayfayı temizleyin.

Yani kabaca, aşağıdaki değişikliği yapın ...

İsterseniz bunu gizli bir sayfada yapıp, işi biraz daha abartabilirsiniz ... :mrgreen:


[vb:1:6d8ab1011b] dbConnection.Open dbConnectionString
Set Rs = dbConnection.Execute("[" & SourceSheet & "$" & SourceRange & "]")
Set TargetCell = Range("A1")
TargetCell.CopyFromRecordset Rs
Spreadsheet1.Cells.Range("A1:L1200").Value = Range("A1:L1200").Value
ActiveSheet.UsedRange.Clear

[/vb:1:6d8ab1011b]
 

Orion1

Uzman
Uzman
Katılım
1 Mart 2005
Mesajlar
22,254
Excel Vers. ve Dili
Win7 Home Basic TR 64 Bit

Ofis-2010-TR 32 Bit
Merhabalar.
Teşekkür ederim Haluk hocam.
TargetCell.CopyFromRecordset Rs
Anladığım kadarı ile Yukarıdaki kod ile Kopyalama işlemi yapılarak kapalı dosyadan açık aktif dosyaya veri aktarımı yapalıyor.
İyi çalışmalar dilerim.
:hey:
 
Üst