Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 6
  • 349

Napisałem makro, które pozwala mi wykonać na zaznaczonej tabeli operację SQL i zwrócić pojedynczą wartość. Jeżeli jest tych wartości więcej, są one przedstawione, jako łańcuch tekstowy w jednej komórce.

Jak uwzględnić możliwość zwrócenia przez moją funkcję więcej niż jednej wartości? Zwrócić tablicę/array do sąsiadujących komórek?

Wiem, że funkcja nie może modyfikować komórek sąsiednich tak jak procedura, może zmodyfikować tylko wartość komórki, w której się znajduje. Ale może da się zaznaczyć zakres i dla całego wprowadzić jedną formułę, i Ctrl+Shift+Enter (jak dla formuł tablicowych)? Jak powinna w takiej sytuacji wyglądać:

- deklaracja typu zwracanego przez funkcję i,

- jak inaczej zwrócić wartości z Recordset, by do komórek została zwrócona tablica (najchętniej z nagłówkami). Poniżej mój kod, załączam też plik:

Function SQL(dataRange As Range, CritA As String)

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



currAddress = ActiveSheet.Name & "$" & dataRange.Address(False, False)

strFile = ThisWorkbook.FullName
strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile _
& ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"

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

cn.Open strCon


strSQL = "SELECT * FROM [" & currAddress & "]" & _
         "WHERE [A] =  '" & CritA & "'  " & _
         "ORDER BY 1 ASC"

rs.Open strSQL, cn

SQL = rs.GetString

End Function

 

Załączniki

  • xlsm

    sql_udf_JacekKotowski.xlsm ( 20K )
Jacek_Kotowski
  • Zapytał
  • @ Jacek_Kotowski | 06.03.2015
    • lider
    • laureat
    • ekspert
    • 60
    • 54
    • 94

Odpowiedź (1)

  • 6

Można napisać procedurę, która wykorzystując metodę CopyFromRecordset, która wrzuci dane z rekordsetu do dowolnej komórki. Nagłówki trzeba sobie pobrać osobno np. pętlą For Each korzystając z kolekcji Fields rekordsetu.

  • Odpowiedział
  • @ | 17.07.2015
  • TRENER ALTKOM AKADEMII