10. december 2004 - 13:49Der er
7 kommentarer og 1 løsning
VBA og Word
Hej eksperter
Nedenstående VBA (placeret i Normal.dot) fungerer egentlig nogenlunde men det er ikke speciel flot programmering så jeg håber at en eller anden kan gøre den bedre. Meningen er som følger:
- Worddokumentet (gemt som cpr.nr med ekstensionen: .epi) hvorfra makroen skal aktiveres består af 2 sider - Først skal dokumenterne kopieres - Der skal startes et nyt dokument fra skabelonen Epikrise.dot bestående af 2 "ark" - De kopierede dokumenter skal indsættes efter de nye dokumenter men således at de starter på et nyt ark og ikke midt i et allerede eksisterende ark - Herefter skal dokumentet gemmes som det hedder det samme som de første dokumenter (Cpr.nr med ekstensionen: .epi) - Ovenstående skulle gerne kunne gentages et større antal gange (det kan man IKKE med det jeg har konstrueret)
Pyh jeg håber at ovenstående er forståeligt og at en ekspert gider at gøre et forsøg.
vh Steen
Sub NyEpikrise1()
' NyEpikrise Makro ' Makro indspillet 06-12-2004 af Steen Sommer Andersen
'Vi erklærer lige nogen variable Dim Navn As String Dim Cpr As String Dim Hcv As String Dim Adr As String Dim PostBy As String Dim IDato As String
Dim Cprnr As String, sPath As String, WB As String, Epi As String, AD As Document 'On Error Resume Next
Set AD = ActiveDocument Epi = ActiveDocument.Name Cprnr = Left(ActiveDocument.Name, 11) sPath = "\\server\faelles\index data\patientmapper\" pPath = "\\server\faelles\index data\epikriser\"
Dim B As Bookmark For Each B In ActiveDocument.Bookmarks ActiveDocument.Bookmarks(B).Delete Next B
Da du skriver din kode virker, så har jeg ikke checket om den gør det du beskriver, men blot lavet det til lidt pænere kode... (efter min smag)
Public Sub NyEpikrise1() ' Constants Const sPathPatient As String = _ "\\server\faelles\index data\patientmapper\" Const sPathEPI As String = _ "\\server\faelles\index data\epikriser\" Const sEPI_DOT As String = _ "\\server\faelles\Index\dokumenter\Epikriseskabelon\Epikrise.dot" ' Variable Dim sCprNr As String Dim sDocName As String Dim docAD As Document Dim docNew As Document Dim oBM As Bookmark Dim xlApp As Excel.Application Dim xlWB As Excel.Workbook Dim xlWS As Excel.Worksheet Dim lCount As Long
'On Error Resume Next
' Information from ActiveDocument Set docAD = ActiveDocument sDocName = docAD.Name sCprNr = Left(docAD.Name, 11)
' Delete bookmarks For Each oBM In docAD.Bookmarks docAD.Bookmarks(oBM).Delete Next oBM ' Locate thing to copy Selection.MoveUp Unit:=wdLine, Count:=2000 Selection.MoveDown Unit:=wdLine, Count:=2000, Extend:=wdExtend Selection.Copy
' Create a new doc based on Epikrise.dot Set docNew = Documents.Add(sEPI_DOT)
' Get Excel documents Set xlApp = CreateObject("Excel.Application") xlApp.ScreenUpdating = False Set xlWB = xlApp.Workbooks.Open(sPathPatient & sCprNr & ".opr") Set xlWS = xlWB.Worksheets("Stamkort") ' Insert information into the new document With docNew .Bookmarks("Navn").Range.Text = xlWS.Range("D6").Value .Bookmarks("Cpr").Range.Text = sCprNr .Bookmarks("Adr").Range.Text = xlWS.Range("D8").Value .Bookmarks("PostBy").Range.Text = xlWS.Range("D9").Value .Bookmarks("Hcv").Range.Text = xlWS.Range("M6").Value End With ' Close Excel xlWB.Close False ' close the workbook without saving xlApp.Quit ' close the Excel application
' Finish new document docNew.Activate Selection.MoveDown Unit:=wdLine, Count:=2000 For lCount = 1 To 17 Selection.TypeParagraph Next lCount ' Paste information from original document into the new document Selection.PasteAndFormat (wdPasteDefault) Selection.MoveUp Unit:=wdLine, Count:=2000
' Close the original document docAD.Close False
'Så skal dokumentet gemmes med indholdet af cpr variable som filnavn docNew.SaveAs FileName:=sPathEPI & sDocName
' Clean Up Set oBM = Nothing Set docAD = Nothing Set xlWS = Nothing Set xlWB = Nothing Set xlApp = Nothing End Sub
Hej Flemming Det ser ud som om koden fungerer som den skal. Jeg ved ikke om du har nærlæst koden vedr de mange Moveup og movedown. Disse er lavet for henholdsvis at ende i toppen og bunden af dokumentet. Kan det ikke gøre smartere? Når det kopierede dokument skal indsættes laves 17 stk TypeParagraph (for at komme til en tom side)men det forudsætter at dokumentet er af samme størrelse hver gang hvilket ikke nødvendigvis er tilfældet. Kan det lade sig gøre at kopiere ind i næte tomme side?
Hvis dette For lCount = 1 To 17 Selection.TypeParagraph Next lCount blot skal give en ny side, så kan alle 2 linier udskiftes med denne linie
Selection.InsertBreak Type:=wdPageBreak
Hvis dine Selection.Move... blot skal flytte dig til toppen eller til bunden, så kan en af disse linie bruges istedet.... Selection.HomeKey Unit:=wdStory TOP Selection.EndKey Unit:=wdStory END
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.