Εμφάνιση ενός μόνο μηνύματος
  #2  
Παλιά 22-06-13, 23:04
Το avatar του χρήστη Tasos
Tasos Ο χρήστης Tasos δεν είναι συνδεδεμένος
Διαχειριστής
Όνομα: Τάσος Φιλοξενιδης
Έκδοση λογισμικού Office: Ms-Office 365
Γλώσσα λογισμικού Office: Ελληνική, Αγγλική, Γερμανική
 
Εγγραφή: 21-10-2009
Μηνύματα: 2.028
Προεπιλογή

Καλησπέρα Θανάση!

Δεν είχα τη δυνατότητα να δοκιμάσω τον παρακάτω κώδικα σε Excel 2003.

Ωστόσο νομίζω ότι είναι συμβατός με Excel 2003 και 2010.

Επίσης ο κώδικας δεν περιλαμβάνει ρουτίνες αποσφαλμάτωσης.

Με την εντολή CreateQueryTable() μπορεί να δημιουργηθεί ερώτημα που επιστρέφει τα
δεδομένα σε περιοχή του φύλλου ("παλαιού τύπου" - συμβατό με όλες τις εκδόσεις Excel).

Με την εντολή SetQueryConnection() τροποποιείται κατ΄επιλογή η σύνδεση ODBC καθώς και το
κείμενο SQL ενός υπάρχοντος ερωτήματος ("παλαιού τύπου" - όχι ListObject.QueryTable) στο τρέχον φύλλο.

Κώδικας:
Option Explicit

Sub CreateQueryTable()
    Dim QT As QueryTable
    Dim TheDir As String
    Dim tmpString As String
    Dim MyConnectionString As Variant
    Dim MySQLString As Variant
    Dim ChoosenFile As Variant
    Dim wks As Worksheet
    Dim DestCell As Range
    Dim fso As Object
    Dim ExtensionLen As Integer
    
    On Error Resume Next

    Set DestCell = Application.InputBox( _
                   "Where do you want to put the data?", _
                   "Select First data cell...", "$A$1", _
                   Application.Width / 2, Application.Height / 2, , , 8)
                   
    If Not DestCell Is Nothing Then
        Set DestCell = DestCell(1)
        Set wks = DestCell.Parent
    Else
        Exit Sub
    End If
    
    On Error GoTo 0
    
    Set fso = CreateObject("Scripting.FileSystemObject")

    ChoosenFile = Application.GetOpenFilename _
                  (Title:="Please choose source file", _
                   FileFilter:="Excel Files *.xls* (*.xls*),")
    If ChoosenFile = False Then
        MsgBox "No file selected.", vbExclamation, "!!!"
        Exit Sub
    Else
        MsgBox "Source file will be:" & vbLf & ChoosenFile
    End If

    ExtensionLen = Len(fso.GetExtensionName(ChoosenFile)) + 1

    TheDir = fso.GetParentFolderName(ChoosenFile)

    tmpString = "SELECT `Φύλλο1$`.col1, `Φύλλο1$`.col2, `Φύλλο1$`.col3, " _
                & "`Φύλλο1$`.col4, `Φύλλο1$`.col5, `Φύλλο1$`.col6 " _
                & "FROM `" & Left(ChoosenFile, Len(ChoosenFile) - ExtensionLen) & "`.`Φύλλο1$` `Φύλλο1$`"

    MySQLString = StringToArray(tmpString)

    tmpString = "ODBC;DSN=Excel Files;DBQ=" & ChoosenFile & ";DefaultDir=" & TheDir & _
                ";DriverId=790;MaxBufferSize=2048;PageTimeout=5;"
                
    MyConnectionString = StringToArray(tmpString)
    
    Set QT = wks.QueryTables.Add(Connection:=Array(MyConnectionString), Destination:=DestCell)
    
    QT.CommandType = xlCmdSql
    QT.CommandText = Array(MySQLString)
    QT.Refresh BackgroundQuery:=False
    wks.Activate
End Sub

Sub SetQueryConnection()
    Dim QT As QueryTable
    Dim TheDir As String
    Dim tmpString As String
    Dim MyConnectionString As Variant
    Dim MySQLString As Variant
    Dim ChoosenFile As Variant
    Dim fso As Object
    Dim ExtensionLen As Integer

    ChoosenFile = Application.GetOpenFilename _
                  (Title:="Please choose source file", _
                   FileFilter:="Excel Files *.xls* (*.xls*),")

    If ChoosenFile = False Then
        MsgBox "No file selected.", vbExclamation, "!!!"
        Exit Sub
    Else
        Set fso = CreateObject("Scripting.FileSystemObject")
        MsgBox "Source file will be:" & vbLf & ChoosenFile
    End If

    ExtensionLen = Len(fso.GetExtensionName(ChoosenFile)) + 1

    TheDir = fso.GetParentFolderName(ChoosenFile)

    Set QT = ActiveSheet.QueryTables(1)

    tmpString = "SELECT `Φύλλο1$`.col1, `Φύλλο1$`.col2, `Φύλλο1$`.col3, " _
                & "`Φύλλο1$`.col4, `Φύλλο1$`.col5, `Φύλλο1$`.col6 " _
                & "FROM `" & Left(ChoosenFile, Len(ChoosenFile) - ExtensionLen) & "`.`Φύλλο1$` `Φύλλο1$`"

    MySQLString = StringToArray(tmpString)

    tmpString = "ODBC;DSN=Excel Files;DBQ=" & ChoosenFile & ";DefaultDir=" & TheDir & _
                ";DriverId=790;MaxBufferSize=2048;PageTimeout=5;"
    'Debug.Print QT.Connection
    'Debug.Print tmpString
    If QT.Connection <> tmpString Then
        MyConnectionString = StringToArray(tmpString)
    Else
        MsgBox "There is already a data connection to this file!", vbInformation
        Exit Sub
    End If

    QT.Connection = Array(MyConnectionString)
    QT.CommandType = xlCmdSql
    QT.CommandText = Array(MySQLString)
    QT.Refresh BackgroundQuery:=False

End Sub

Function StringToArray(Qry As String) As Variant
' Source: http://support.microsoft.com/kb/816562
    Const StrLen = 127
    Dim NumElems As Integer
    Dim i As Double
    Dim Temp() As String

    NumElems = (Len(Qry) / StrLen) + 1
    ReDim Temp(1 To NumElems) As String

    For i = 1 To NumElems
        Temp(i) = Mid(Qry, ((i - 1) * StrLen) + 1, StrLen)
    Next i
    StringToArray = Temp
End Function
Ελπίζω να σε βοηθήσει.

Τα λέμε.

Τάσος
__________________
Ms-Office Development Team
Ανάπτυξη επαγγελματικών εφαρμογών

Τελευταία επεξεργασία από το χρήστη Tasos : 23-06-13 στις 12:31.
Απάντηση με παράθεση