Dane z zamkniętego arkusza recordset adodb

Jak wyciągnąć dane z pliku?
Metod na to jest bez liku.
Może trochę przesadziłem,
Dwie, co najmniej, naliczyłem.
Można wyjąć bez patrzenia,
Warte jest to obczajenia.
Nie ma po co go otwierać,
Po zamkniętym można szperać.

referencje Adodb

'przy poocy takiej funkcji można na spokojności wysłać zapytanie SQL do zamkniętego pliku Excel
'i uzyskać w odpowiedzi żądane dane
'wywałać funkcję można w taki sposób:
'Set rst = GetRS(pełnaŚcieżka, stSQl, opcjonalnie nazwa pliku), gdzie definiujemy rst jako ADODB.Recordset (Dim rst As ADODB.Recordset)


Function GetRS(wbkTocopy As String, stsql As String, Optional e As String)
As ADODB.Recordset

Dim rst As ADODB.Recordset
Dim stcon As String
Set rst = New ADODB.Recordset

On Error GoTo errPR
stcon = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & wbkTocopy & ";" & _
"Extended Properties='Excel 12.0;HDR=YES'"

rst.Open stsql, stcon, adOpenStatic
If rst.EOF Or rst.BOF Then Exit Function ' sprawdzam czy są rekordy w recordsecie (czy nie jest pusty)

rst.MoveLast ''ten krok
rst.MoveFirst ''i ten służą do naprawienia błędu recotdset.count -1
Set GetRS = rst

Set rst = Nothing
stcon = Empty
normalExit:
Exit Function

errPR:
MsgBox "something went wrong, probably sheet name in: " & e, vbExclamation
End
End Function




Kod poniżej pokazuje,
Jak nagłówki uzyskuje,
Przy użyciu recordset’a –
Wiedza zaczerpnięta z neta.

‘dwie pętle, robiące dokładnie to samo
iFieldCount = rst.Fields.Count
For i = 1 To iFieldCount
objSheet.Range("A" & i) = rst.Field(i).Name
Next i

‘***********************************

‘’Call addHeadrers(ws, rst)
Sub addHeadrers(ws As Worksheet, rst As ADODb.Recordset)
Dim r
Dim a As Long
a = 1

For Each r In rst.Fields
ws.Cells(1, a).Value = r.Name
a = a + 1
Next

End Sub




Ile wierszy w recordset’cie?
Z tej komendy to weźmiecie.

Rst.recordcount ‘’’’jeżeli wychodzi -1, to warto zrobić rst.movelast, rst.move first, pomaga




Mam recordset, co z nim zrobić?
Jak na dane go przerobić?

Sheets(1).cells(1,1).copyfromrecordset rst ‘’’’ generalnie wybieramy pierszą komórkę, w którą zostaną wklejone dane




Chyba to ogarnąć zdołam.
Jak tę funkcję sam przywołam?

‘ jako from dajemy nazwę arkusza w danym pliku, w miejscu gwiazdki dajemy nazwy kolumn
stsql = "SELECT * from [Sheet1$]"

Set rst = GetRS(fullfilePath, stsql)




Jeszcze jedna mała sprawa -
Przez reordset to przeprawa.
Idąc przezeń wiersz, po wierszu
Się poczujesz jak na perszu.

For a = 1 to rst.recordcount
Rst.move a
‘’’’tu robimy akcję, jakąkolwiek, ja np dodawałem do słowniczka rzeczy do kontroli,
‘’ tak, losowałem sobie próbki do sprawdzenia przy pomocy recordset’a
‘’ gdy miałem wylosowane a, to sprawdzałem czy znajduje się w słowniczku (scripting dictionary)
‘’ if not d.exists , then d.add ….
‘’scripting.dictionary będzie w dalszej części
Rst.MoveFirst ‘ wracamy do początku
Next
'albo
rs.MoveFirst 'niekoniecznie musi być, ale warto wyrobić sobie taki nawyk :)
Do Until rs.EOF = True
'akcja np Debug.Print rs.Fields("nazwa Kolumny")
rs.MoveNext 'przechodzimy do kolejnego rekordu
Loop




Recordsetem po zakresie?
Szybciej dane wyciągnie się :)

lastcolumn = Data_sht.Cells(1, Data_sht.Columns.Count).End(xlToLeft).Column ‘ ostatnia kolumna w pierwszym wierszulastrow = Data_sht.Cells(Data_sht.Rows.Count, 13).End(xlUp).Row ‘ ostatni wiersz w 13 kolumnie (M)




Jak zapisać Excel jako?
Spróbuj użyć funkcję taką.

Set Destwb = thisworkbook
Scieżka = “C:\”
Name = “przykładowaNazwaPliku”
‘spradzamy z której wersji excela korzystamy
With Destwb
If Val(Application.Version) < 12 Then ‘ 97-2003
FileExtStr = ".xls": FileFormatNum = -4143
Else
'2007-2016
Select Case Sourcewb.FileFormat
Case 51: FileExtStr = ".xlsx": FileFormatNum = 51
Case 52:
If .HasVBProject Then
FileExtStr = ".xlsm": FileFormatNum = 52
Else
FileExtStr = ".xlsx": FileFormatNum = 51
End If
Case 56: FileExtStr = ".xls": FileFormatNum = 56
Case Else: FileExtStr = ".xlsb": FileFormatNum = 50
End Select
End If
End With

Destwb.SaveAs scieżka < name < FileExtStr, FileFormat:=FileFormatNum




Tylko odczyt? Nie chcę tak,
Czyś otwarty? Daj mi znak.

Function IsWorkBookOpen(FileName As String) As Boolean
Dim ff As Long, ErrNo As Long

On Error Resume Next
ff = FreeFile()
Open FileName For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0

Select Case ErrNo
Case 0: IsWorkBookOpen = False 'nikt nie używa pliku
Case 70: IsWorkBookOpen = True ' plik jest w użyciu
Case Else: Error ErrNo
End Select
End Function




Kiedyś była taka sprawa
I co miesiąc z nią zabawa.
Skrót miesiąca do komórki,
A za miesiąc znów powtórki ;/

'przy użyciu tej pętli można w żadane komórki wrzucić skróconą nazwę miesiąca, pisaną wielką literą, z dwukropkiem oraz ją pogrubić i zmienić kolor na niebieski
For a = 2 To lastrow ''lastrow = ostatni wiersz :)
ws.Cells(a, 3).Value = VBA.Format(VBA.Now, "Mmm") & ":"
ws.Cells(a, 3).Characters(1, 1).Caption = VBA.UCase(ws.Cells(a, 3).Characters(1, 1).Caption)
If Not c.Characters.Count < 3 Then

ws.Cells(a, 3).Characters(1, 3).Font.Bold = True
ws.Cells(a, 3).Characters(1, 3).Font.Color = RGB(16, 16, 146)

End If
Next




Sub InsertCheckBoxes()

Dim Rng As Range
Dim WorkRng As Range
Dim Ws As Worksheet
'poniższa procedura wstawia w każdą komórkę tabeli 'tblOferta' 'L.P', checkbox, idealnie dopasowany do rozmiaru komórki, oraz łączy dany checkbox z komórką w w kolumnie "n" w tym samym wierszu (dopóki komórka 4 kolumny w prawo nie będzie pusta)
Set Ws = ThisWorkbook.Sheets("Oferta")
Application.ScreenUpdating = False
Application.EnableEvents = False


For Each Rng In Ws.Range("tblOferta[L.P.]").Cells
If Rng.Offset(, 4).Value = "" Then Exit For
With Ws.CheckBoxes.Add(Rng.Left, Rng.Top, Rng.Width, Rng.Height)
.Characters.Text = ""
.Value = xlOff
.LinkedCell = "$N$" & Rng.Row
.Display3DShading = False
End With

Next
Set Ws = Nothing
Set Rng = Nothing

Application.EnableEvents = True

Application.ScreenUpdating = True
End Sub




Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'pracedurka, która dla komórek w danem zakresie (u mnie tabela "tblOferta") będzie wciskać f2 - innymi słowy single click cell edit (jeżeli arkusz nie jest zabezpieczony Oraz zaznaczona jest jedna komórka)
On Error GoTo exitssusfd
If Target.Cells.Count = 1 Then
If Not Intersect(Target, Me.Range("tblOferta")) Is Nothing And Intersect(Target, Me.Range("tblOferta[rabat?]")) Is Nothing And Target.Value <> "" Then

If Me.ProtectContents = True Then
>If> Target.Locked = False Then
SendKeys "{F2}"
End If
Else
SendKeys "{F2}"
End If
End If

End If
exitssusfd:
End Sub