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:
Alla typer av databaser, inklusive Excels arbetsböcker.
Textfiler (CSV och TXT)
URL- / HTML-filer
XML-filer
Ä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:
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