Nån som vet hur man kan snabba upp bearbetningen av tabeller i word? Axel, Några tips är:<br> Håller Med ANdreas. Hej, Axel, Hej igenSnabba upp Word ifrån VB dll
För att vara mer exakt:
Jag har en dll (gjort i VB) som jag anropar inifrån en applikation (mathematica). Denna dll gör insert på tabeller samt utför formattering på tabellen, kolumn för kolumn (kan vara individuellt formatterade).
I vb-dll:en använder jag mig av Word 9 typelibraryt, där jag skriver tillexempel
for i=1 to minwordapp.selection.tables(1).columns.count
with minwordapp.selection.tables(1).columns(i).font
.name=minfontarray(i)
.bold=minboldarray(i)
.italic=minitalicarray(i)
end with
next
...etc
Problemet är att word traverserar tabellen oerhört långsamt. Har prövat med ranges, screenupdating=false. Nån som har tips hur man kan snabba upp words bearbetning av tabeller?
Har även provat med DDE vilket visat sig gått snabbare än COM (OLE) konversation mellan mathematica word, tyvärr är dde opålitligt och saknar felhantering så det måste vara i OLE.Sv: Snabba upp Word ifrån VB dll
Men om du prövar utifrån följande sample, vilka är hämtade direkt från två lösningar jag har gjort i MS Word:
Application.Visible = False
With ActiveDocument.Tables(1).Columns(1).Cells.Font
.Name
.Bold
.Italic
End With
Application.Visible = True
En annan variant är
Sub RangeTable()
Dim MyRange As Range
Dim i As Integer
i = ActiveDocument.Tables(1).Rows.Count
Set MyRange = ActiveDocument.Range(ActiveDocument.Tables(1).Cell(1,
1).Range.Start, _
ActiveDocument.Tables(1).Cell(i, 1).Range.End)
Application.StatusBar = "Message"
MyRange.Shading.BackgroundPatternColorIndex = wdBlue
End Sub
Blir det snabbare då?
Mvh
XL-DennisSv: Snabba upp Word ifrån VB dll
* Använd inte Selection objektet.<br>
* Använd For each<br>
* Gör så få anrop som möjligt. Typ att loopa ett recordset är ej att rekomendera.<br>
<br>
Skulle skrivit då här. Om det var så att Column objektet stöde font egenskapen:
<code>
Dim MyWord As Word.Application
Dim MyDoc As Word.Document
Dim MyTable As Word.Table
Dim MyColumn As Word.Column
Dim Font As StdFont
Dim I As Long
Set MyWord = New Word.Application
Set MyWord = MyWord.Documents.Add("C:\MyTemplate.doc")
Set MyTable = MyWord.Tables(1)
For Each MyColumn In MyTable.Columns
Set Font = New StdFont
Font.Name = MinFontArray(I)
Font.Bold = MinBoldArray(I)
Font.Italic = MinItalicArray(I)
Set MyColumn.Font = Font
I = I + 1
Next
</code>Sv: Snabba upp Word ifrån VB dll
Selection-Objektet är en enda enormt stor och klumpig, seg och oöverskådlig massa.
Här är det "direktaccess" som gäller.
Det är ju rätt vanligt att man recordar ett macro för att se hur koden ser ut så man vet ungefär hur man skall progga. I Macron får man nästan uteslutande selectionobjektet.
Jämför exvis dessa rader för Excel.
sheets("Blad1").Select
Range("A1").Select
With Selection
.Interior.Color=rgb(0,0,0)
.Font.Color=rgb(255,255,255)
End With
Mot denna
Sheets("Blad1").cells(1,1).Interior.Color = rgb(0,0,0)
Sheets("Blad1").cells(1,1).Font.Color = rgb(255,255,255)
Den sistnämnda går avsevärt mycket snabbare att exekvera.
/peterhSv: Snabba upp Word ifrån VB dll
Men hur definierar man en range som sträcker över sig en kolumn??
Följande trodde jag skulle funka, men det visar sig på något konstigt sätt definiera hela tabellen i sin range...
dim curRange as range
set curRange = curTable.Range
with curTable
curRange.SetRange Start:=.cell(1, colIndex).range.Start, _
End:=.cell(.Rows.Count, colIndex).range.End
end With
Faktum är att om jag byter t ex font för alla celler i rangen, (låt oss säga att vi är på kolumn 1 (colIndex=1)) så byter denna kolumns alla celler font = helt OK
MEN, om jag t ex vill lägga decimaltabbar för samma range, så blir av någon anledning HELA tabellen (alla kolumner) försedda med decimaltabben för första kolumnen....när jag sen är på colIndex=2 så ligger decimaltabben från kolumn 1 kvar, varvid kolumn 2 får 2 decimaltabbar...
Hade varit käckt om det gick att lösa enligt
curRange.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(Xtab.GetCol(colIndex - 1, ";")), _
Alignment:=wdAlignTabDecimal, Leader:=wdTabLeaderSpaces
...men det finns en implicit referans till hela tabellen
..vilket gör att jag måste sätta decimaltabbar med selection objektet enligt:
curColumn.Select
Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(Xtab.GetCol(colIndex - 1, ";")), _
Alignment:=wdAlignTabDecimal, Leader:=wdTabLeaderSpaces
...några förslag??
DESSUTOM, vad gäller hastigheten så har jag klockat det nu, med minimalt antal selection object referenser (selection.tables(1).columns(x).select)) osv och det är några hundradelar snabbare. Selection objektet var alltså inte så mycket långsammare trots att jag pillar bort selection på massa ställen.Sv: Snabba upp Word ifrån VB dll
Här får du ytterligare ett uppslag att bygga vidare på:
Tabell: 2 kolumner 5 rader
[Kod]
Dim tbl As Table
Dim oRng As Range
Set tbl = ActiveDocument.Tables(1)
Set oRng = ActiveDocument.Range _
(Start:=tbl.Range.Columns(1).Range.Start, _
End:=tbl.Range.Columns(2).Range.End - 1)
With oRng
.Cells(1).Range.Style = "Heading"
.Cells(2).Range.Shading.ForegroundPatternColor = wdColorBrightGreen
End With
[/Kod]
Vad beträffar hastigheten så blir skillnaden större ju större datamängd vi hanterar ;-)
Mvh
XL.-Dennis
www.xldennis.comSv: Snabba upp Word ifrån VB dll
Columns verka rinte ha något range object.
<code>
Set oRng = ActiveDocument.Range _
(Start:=tbl.Range.Columns(1).Range.Start, _
End:=tbl.Range.Columns(2).Range.End - 1)
</code>
funkar alltså inte, tbl.range.columns(1).range finns inte..
tacksam för fler exempel. Frågeställningen är hur man väljer en column som en range (se ovan) ...fonter etc går att sätta för en range som defnierar en kolumn, medans decimaltabbar etc inte funkar utan sätts för hela tabellen.