Avatar billede steensommer Praktikant
10. december 2004 - 13:49 Der 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

    Selection.MoveUp Unit:=wdLine, Count:=2000

    Selection.MoveDown Unit:=wdLine, Count:=2000, Extend:=wdExtend
'Count:=106,
    Selection.Copy
  'ActiveDocument.Close False
    Documents.Add
("\\server\faelles\Index\dokumenter\Epikriseskabelon\Epikrise.dot")

Dim xlApp As Excel.Application
Dim xlWB As Excel.Workbook

    Set xlApp = CreateObject("Excel.Application")
    xlApp.ScreenUpdating = False
    WB = sPath & Cprnr & ".opr"
    Set xlWB = xlApp.Workbooks.Open(WB)

    With ActiveDocument
        .Bookmarks("Navn").Range.Text =
xlWB.Worksheets("Stamkort").Range("D6").Value
        .Bookmarks("Cpr").Range.Text = Cprnr
        .Bookmarks("Adr").Range.Text =
xlWB.Worksheets("Stamkort").Range("D8").Value
        .Bookmarks("PostBy").Range.Text =
xlWB.Worksheets("Stamkort").Range("D9").Value
        .Bookmarks("Hcv").Range.Text =
xlWB.Worksheets("Stamkort").Range("M6").Value
    End With

    xlWB.Close False ' close the workbook without saving
    xlApp.Quit ' close the Excel application
    Set xlWB = Nothing
    Set xlApp = Nothing

    Selection.MoveDown Unit:=wdLine, Count:=2000

    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph

    Selection.PasteAndFormat (wdPasteDefault)

    Selection.MoveUp Unit:=wdLine, Count:=2000

    AD.Close False

        'Så skal dokumentet gemmes med indholdet af cpr variable som filnavn
    ActiveDocument.SaveAs FileName:=pPath & Epi

End Sub
16. december 2004 - 23:12 #1
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
Avatar billede steensommer Praktikant
17. december 2004 - 22:17 #2
Hej Flemming
Undskyld at jeg først svarer nu - mailen var røget i spamfilteret! Jeg får lejlighed til at kigge på det i weekenden - tak for dit svar.

vh Steen
18. december 2004 - 00:03 #3
God fornøjelse - håber det virker. Passer det iøvrigt, hvis jeg siger, at jeg har hjulpet dig med et medizin regneark før?
Avatar billede steensommer Praktikant
18. december 2004 - 00:10 #4
Ja det er da vist helt korrekt :0)
Avatar billede steensommer Praktikant
18. december 2004 - 14:00 #5
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?

vh Steen
18. december 2004 - 15:46 #6
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
Avatar billede steensommer Praktikant
18. december 2004 - 17:05 #7
Perfekt - nu fungerer alt. Tak for hjælpen Flemming.

vh Steen
18. december 2004 - 18:33 #8
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Tag et kursus i Word og øg effektiviteten

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester