Använda OWC Spreadsheet


Office Web Components (OWC) är en samling ActiveX kontroller som Microsoft har gjort tillgänglig sedan version 2000. Dessa komponenter används företrädesvis för Web-applikationer men kan användas både i MS Visual Basic 6.0 och i VBA.

I detta tips används komponenten Spreadsheet, vilken har hela 262144 rader och 700 kolumner. Komponenten har ett flertal intressanta funktioner såsom Autofilter, exportera data till Excel samt att skapa anpassade kolumnhuvuden.

Komponenten kan hämta data från ett flertal källor då den stödjer ODBC / ADO / ADO.NET:

Även om komponenten till sitt yttre liknar Excels arbetsblad finns många olikheter och för att förstå komponenten rekommenderas att läsa hjälpfilen som medföljer OWC.

Spreadsheet-komponenten kan också användas i Excel och då i första hand i formulär. Detta kan komma väl till pass om behov finns att temporärt arbeta med större datamängder. Dock måste vi medvetna om att ett säkerhetsmeddelande visas när en arbetsbok med komponenten i sig öppnas.

Ha för vana att alltid använda den senaste versionen av OWC oavsett vilken version av Office som används, vilken finns tillgänglig på Microsoft Downloads. Den senaste versionen (11.0) finns tillgänglig här:

Office Web Components

I detta tips hämtas data från ett Excel arbetsblad och om ändringar görs skrivs data tillbaka till arbetsbladet. En bugg i egenskapen dirty hos komponenten gör att vi inte kan kontrollera om data har blivit ändrad eller inte via denna egenskap. Det gör att vi måste lösa det på annat sätt, vilket exemplet visas.

Arbetsbladet består av tre kolumner, Department, Numbers och Changed. Den sistnämnda används enbart i komponenten för att kontrollera om data har blivit ändrad eller inte.

För att exemplet ska fungera krävs att en referens anges till Microsoft Excel 9.0 Object Library eller senare.

 

Följande bild visas formuläret vid exekvering av nedanstående kod:

 

 

 

 

 

Option Explicit

'© 2005 Alla rättigheter XL-Dennis

 

Private Sub Form_Load()

  Const stCon As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

                          "Data Source= c:\Data.xls;" & _

                          "Extended Properties='Excel 8.0;HDR=Yes'"

  Const stSQL As String = "SELECT Department, Numbers, Changed FROM [Data$]"

 

  'Sätter värden för ett flertal egenskaper hos Spreadsheet-komponenten.

  With Me.Spreadsheet1

    .DisplayOfficeLogo = False

    .DisplayToolbar = False

    'Dölj Changed-kolumnen, vilket också kan göras direkt i källbladet.

    .Columns(3).Hidden = True

    With .ActiveWindow

      .DisplayColumnHeadings = False

      .DisplayRowHeadings = False

      .DisplayWorkbookTabs = False

      .DisplayZeros = True

    End With

    'Ansluter till datakällan.

    With .ActiveSheet

      .ConnectionString = stCon

      .CommandText = stSQL

    End With

  End With

 End Sub

 

Private Sub Form_Unload(Cancel As Integer)

  Dim rnChanges As OWC11.Range, rnFind As OWC11.Range

  Dim vaChanges As Variant

  Dim iUpdate As Integer, i As Integer, iLastRow As Integer

 

  With Me.Spreadsheet1

    iLastRow = .Range("A65536").End(xlUp).Row

    Set rnChanges = .Range("C2:C" & iLastRow)

  End With

 

  'Läser in värdena i Changed-kolumnen till en variant array.

  vaChanges = rnChanges.Value

 

  With rnChanges

    Set rnFind = .Find(What:="C")

    If Not rnFind Is Nothing Then

      iUpdate = MsgBox("The data have been change." & vbCrLf & _

                "Do You want to update the source?", vbYesNo + vbInformation)

 

      If iUpdate = 6 Then

        Dim vaData As Variant

        Dim xlApp As Excel.Application

        Dim xlWBook As Excel.Workbook

        Dim xlWSheet As Excel.Worksheet

        Dim stName As String

 

        'Läser in värdena i Department- och Numbers-kolumnerna till en variant array.

        With Me.Spreadsheet1.ActiveSheet

          vaData = .Range(.Range("A2"), .Range("B65536").End(xlUp)).Value

        End With

 

        stName = "c:\Data.xls"

 

        Set xlApp = New Excel.Application

        Set xlWBook = xlApp.Workbooks.Open(stName)

        Set xlWSheet = xlWBook.Worksheets("Data")

 

        'Skriver tillbaka de posters vars värden har blivit ändrade till

        'källbladet.

        With xlWSheet

          For i = 1 To UBound(vaChanges)

            If vaChanges(i, 1) = "C" Then

              .Cells(i + 1, 1).Value = vaData(i, 1)

              .Cells(i + 1, 2).Value = vaData(i, 2)

            End If

          Next i

        End With

 

        'Om all data ska skrivas tillbaka kan följande ansats användas.

        'With xlWSheet

        '  .Range("A2:B" & UBound(vaData)).Value = vaData

        'End With

 

        With xlWBook

          .Save

          .Close

        End With

 

        xlApp.Quit

 

        Set xlWSheet = Nothing

        Set xlWBook = Nothing

        Set xlApp = Nothing

      End If

    End If

  End With  

End Sub

 

Private Sub Spreadsheet1_SheetChange(ByVal Sh As OWC11.Worksheet, _
                                    
ByVal Target As OWC11.Range)

  'Vid ändring av posternas värden anges C i den dolda kolumnen.

  If Not Target.Row = 1 Then Spreadsheet1.Cells(Target.Row, 3).Value = "C"

End Sub