Just nu i M3-nätverket
Gå till innehåll

MvS

Medlem
  • Antal inlägg

    134
  • Gick med

  • Senaste besök

Foruminlägg postade av MvS


  1. 2 timmar sedan, skrev MvS:

    Hej!
    Stort tack för ditt engagemang ─ Det var precis i de här banorna jag också tänkte! Bilden jag bifogade tidigare var schematisk (för att jag ville se principen bakom en kodning) och när jag försöker omsätta din kod med de skarpa referenserna verkar det inte funka, sannolikt för att jag satt dessa fel...

    Jag bifogar ett "tvättat" utdrag från originalfilen med 5 poster så att du kan se strukturen i GEDCOM-filen, och om du har tid & lust är jag dig tacksam om du kan titta på den och ge förslag på åtgärd.

     

    mvh

    //Magnus

     

    P.S

    För att förtydliga:
    Jag vill alltså skapa ID:n som vidhäftas respektive post i.e. skapa primärnyckel för varje person i databasen!

    Ds

     

    Bok1.xlsx 13 kB · 3 downloads

    Jag hittade nu formeln för att plocka ut ID:
    =OM([@DATA]="INDI";EXTEXT([@KAT];LÄNGD([@KAT])-1;1);"")

    Det returnerar aktuellt post # men bara i de instanser där "INDI" förekommer. Lekte med idén att i OM-satsens "annars" (dvs längst till höger i strängen) hitta en relativ referens till föregående (ovanstående) cell om strängen returnerar "Falskt" men hittills gått bet!

    Alltså, jag vill att formeln ger, om villkoret inte uppfylls, värdet från den relativa cellen ovanför (som inte är rubrikcell) . Kan det ordnas med t ex INDIREKT i någon elegant kombination?
    //Magnus

     


  2. 16 timmar sedan, skrev MH_:

    Nu lekte jag lite med en GED-com fil

    cell C2

    =OM(ÄRFEL(SÖK("@ INDI";$A2));"";$A2)

    cell D2

    =OM(C2="";"";OM(PASSA("*"&D$1&"*";$A3:$A$8000;0)<PASSA("*@ INDI*";$A3:$A$8000;0);INDEX($A3:$A$8000;PASSA("*"&D$1&"*";$A3:$A$8000;0));" "))

    Kopiera högerut och kopiera ner formelraden

     

    Den kollar alltså efter "@ INDI" för att bestämma startrad.

    Sen tittar den efter texten i rubriken (rad1) och returnerar nästa förekomst före nästa "@ INDI"

     

    Ähh, lek med det.

    Hej!
    Stort tack för ditt engagemang ─ Det var precis i de här banorna jag också tänkte! Bilden jag bifogade tidigare var schematisk (för att jag ville se principen bakom en kodning) och när jag försöker omsätta din kod med de skarpa referenserna verkar det inte funka, sannolikt för att jag satt dessa fel...

    Jag bifogar ett "tvättat" utdrag från originalfilen med 5 poster så att du kan se strukturen i GEDCOM-filen, och om du har tid & lust är jag dig tacksam om du kan titta på den och ge förslag på åtgärd.

     

    mvh

    //Magnus

     

    P.S

    För att förtydliga:
    Jag vill alltså skapa ID:n som vidhäftas respektive post i.e. skapa primärnyckel för varje person i databasen!

    Ds

     

    Bok1.xlsx


  3. Hej!
    Nu har jag slitit mitt hår i förtvivlan över ett problem som jag tycker borde vara busenkelt för Excel att klara men jag måste tänka helt fel  - det är i alla fall vad Excel tycker...
    Problemet:

    Har en databas på ett Excel-ark där data är importerat från en släktdatabas. Vid importen kommer alla fält och poster i lodrät formering men jag vill transponera data så att fälten kommer vågrätt för vidare export till Access. Varje post ligger alltså travad under den andra där varje fält upprepas i respektive post vilket gör en tabell på 230 poster att bli nästan 8000 rader i Excel-arket!
    Vad jag vill göra:

    Jag vill försöka separera posterna med primärnycklar i form av ID, ett för varje person. Så jag tänkte först i min naiva enfald att det bara går att fixa med villkorsformel, men ack vad jag bedrog mig!

    1531786345_Bild1.jpg.0051366bc621b3f7dc883156a7ede880.jpg

    Jag har försökt med ett "OM" villkor att få Excel att för varje återkommande "ID" paginera så att Varje "ID" räknas upp ett steg från 1, 2, 3.. osv samt att alla andra fältnamn får samma värde som respektive "ID" typ:

    ID 1

    FNAMN 1

    ENAMN 1

    ADRESS 1

    TELEFON 1

    ID 2

    FNAMN 2

    ENAMN 2

    ADRESS 2

    TELEFON 2

    etc. men det är fullkomligt tji att få till det då det blir lätt en massa cirkelreferenser som ställer till det!

    Någon på E-forum som har ett listigt knep att delge hur jag ska få till det?

     

     

     

     

     


  4. Tack för svar!
    Grejen är att jag skapar en exe-fil av bat-varianten och jag tänkte att det skulle bara var himla käckt om det hade gått att få in i gränssnittet en option om användaren till äventyrs skulle ha fler Op installerade på olika diskar! Men detta är inget som jag ligger sömnlös om nätterna och grubblar på så jag nöjer mig med det jag har!
    Kul att du gillade idén i alla fall!
    //Magnus 


  5. Monshi

    Jo,  det var det första jag övervägde men jag bedömde att organisationen skulle ha lättare att ta emot Excel...  Men att Access är ett för ändamålet bättre alternativ får jag hålla med om!
    Jag tycker det ändå är märkligt, mist sagt, att Microsoft inte har kunnat lösa detta problem, och efter att ha sökt nätet efter svar på ett otal sajter kan jag konstatera att jag inte är ensam om att ha strul med detta fel samt att någon enkel lösning inte verkar stå att finna. 

    Jag tänker mig i min enfald att man skulle kunna använda en VBA-funktion för by-pass av limiten - för att tala ren svengelska! Är det något du som verkar så beläst och insatt i VBA har någon uppfattning om? 

    Som sagt, högst märkligt att man ska stupa på en sådan här irriterande detalj i ett annars så överlägset och mångsidigt program som Excel! Men nåväl, det är ju numer i huvudsak endast för min egen förkovran som jag tragglar med detta och alltid lär man sig något...

    Jag tror att jag löser detta genom att lägga kopplingskoden i Word-mallen i stället då det har fungerat tidigare!
    Tack för visat intresse i alla fall!

    //Magnus


  6. Hej Monshi och polken - Tack för era svar!
    Monshi:
    Förvisso kan man ladda hem filen varje gång men eftersom inventeringen görs löpande och arkivet 
    ofta kompletteras med nya poster där serier och registerstruktur justeras regelbundet behöver det
    vara automatiserat så mycket som möjligt.
    Dessutom har jag vid tidigare tillfälle fått mail merge att funka med i stort sett samma parametrar
    men då har jag varit på plats och kört det direkt från nätverket. Nu jobbar jag hemma med detta och
    det är väl mest för min egen förkovran jag vill hitta en lösning så att verktyget kan användas även i andra sammanhang med vederbörliga ändringar.

    Jag bifogar skriptet som det nu ser ut. Se även bifogad principskiss längst ner över de flöden jag vill ha!

    '*****************************************************
    ' Öppna mall för hyllindex (Word-dokument)
    '*****************************************************
    Sub HyllMall()
        
        Dim mailMergeStr, SrcH, SQLSheetH, SQLSortH, SQLFilterH, SQLDataH, SQLH As String
        Call Modul1.DisableEvents
        Call Modul1.Uppdatera
        VarPath
        SQLSheetH = "[Hyllindex$]"
        SQLFilterH = "WHERE [Hylla] <> []"
        SQLSortH = "ORDER BY [11] ASC AND [2] ASC AND [3] ASC"
        SQLDataH = "Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";" & _
                                     "Jet OLEDB:Engine Type=35;Jet OLEDB"
        SrcH = fldPath & wdNameHylla
        SQLConnH = "Connection:=" & "Data Source=" & SrcH & ";"""
        SQLH = "SELECT * FROM" & SQLSheetH & SQLFilterH & SQLSortH
        mailMergeStr = SQLDataH & SQLConnH & SQLH                '
        frmSQLnotice.show
    '    ---------------- Intiera Wordobjekt -------------
        Set objWord = CreateObject(Class:="Word.Application")
        objWord.Visible = True
        objWord.DisplayAlerts = wdAlertsNone
    '    ---------------- Kör mailmerge -------------------
        Set wDoc = objWord.Documents.Open(SrcH)
        Set wdMailMergeH = wDoc.MailMerge
    '    ---------------- Processa Mail merge -------------
        With wdMailMergeH
            .MainDocumentType = wdFormLetters
            .OpenDataSource Name:=SrcH & mailMergeStr
        End With
        Call Modul1.EnableEvents
        Call Modul1.Uppdatera
        Call Modul1.SkyddaBlad
        
    End Sub

    polken:
    Jag har aldrig mappat tidigare... Vad är det och hur kan det hjälpa till med just detta problem? Excel protesterar ju även om jag använder fördefinierade konstant-strängar så det verkar handla om att informationen jag vill skicka till Word helt enkelt är för lång oavsett hur den överförs. Det torde väl bli samma resultat med mapping, eller? 

    Principskiss över de flöden jag vill ha

    Bild1.png.9849f622c366ba39738a891ce865cc74.png


  7. Hej i forumet!
    Har tidigare ropat på hjälp med funktionen "mail-merge" i Excel men själv lyckats lösa de problemen. Det problem jag nu adresserar forumet med verkar lite knepigare och jag behöver få hjälp om det finns någon annan som har haft liknande problem och löst det.
    BAKGRUND:

    Har en databas jag gjort i Excel där jag behöver kunna skriva ut etiketter i en Word-mall som jag anropar med mail-merge i ett VBA makro. Både Excel-filen och Word mallen ligger i en mapp centralt på en nätverksplats. Excel-filen är utformad så att den sparas automatiskt på nätverket men också med en kopia lokalt på användarens HD. Meningen är att man ska arbeta på den lokala kopian och att den sedan uppdaterar på nätverket. Detta för att säkerställa att arbetsboken inte blockeras av en användare samt att det ska gå att jobba med databasen även i utrymmen där det inte finns WiFi.

    Det innebär alltså att man ska kunna anropa Word-dokumentet från BÅDE filen på nätverket OCH från den lokala kopian vid behov, varför sökvägarna måste vara relativa. 

    PROBLEMET:

    När jag kör koden och kommer till själva mail-merge sekvensen ger Excel felsvar att strängen innehåller fler än 255 tecken! Varför sker detta?  Har testat både att ha alla mail-merge argument utskrivna i sekvensen samt, som i detta fall, att ange argumenten i variabler ─ utan framgång!

     

    Error.jpg.93ec59b4baf8a316c5d6109fdf816925.jpg

     

    Har sökt med ljus och lykta efter svar på webben men det verkar inte som någon har ett bra svar att ge hur man kan komma runt detta problem! Skulle det kunna lösas med en systemfunktion eller ett makro som  tvingar Excel att skippa denna begränsning? Är min VBA felaktig på något sätt eller är detta en begränsning i Excel som inte går att åtgärda? Den enkla lösningen är ju att lägga all kopplings-kod i Word-mallen som körs när man öppnar dokumentet (vilket jag f.ö också har prövat) men då måste sökvägen vara absolut vilket inte funkar om man ska kunna etikettera från olika källor.

    Bifogar även en kopia på makrot jag har problem med.

    Med hopp om svar från forumet

     

    //Magnus

     

     

     


  8. Jag har knåpat ihop en .bat-fil och lagt på USB-sticka med vilken man enkelt kan köra systemverktyg ( sfc, DISM och chkdsk ) på datorn. Jag är ingen hejare på DOS-programmering utan har bara "klippt & klistrat" från andra programsekvenser jag hittat på nätet. Den fungerar förvisso utmärkt som ett smidigt verktyg men man måste köra .bat-filen från den drive som man vill fixa. Detta innebär att först måste kopiera över den till aktuell dators HD innan den kan användas. Jag tänker att det bara måste finns ett smidigare sätt där jag vill kunna få upp en lista med aktiva diskar att välja från typ: ("Välj disk: C, D, E... etc)  UTAN att behöva kopiera .bat-filen till aktuell HD. Någon som har ett bra tips?

    Bifogar skriptet som zippad fil!

     

    //Magnus 

    Systemverktyg.zip


  9. Hallå i forumet!
    Har tidigare adresserat detta forum angående problem med kopplad utskrift av db till Word och trodde först jag hittat svaret. Men efter månader av petande och sökande i så gott som det mesta som skrivits om mailmerge har jag fortfarande problem, om än ett par nivåer upp i kunskapshierarkin!

     

    Har samplat ihop ett VBA-skript från olika källor och som jag har modellerat om lite efter egna behov (Se bifogad fil "MailMerge.txt") och använder tillsammans med den databas jag skapat i Excel med relativt stort omfång (ca 8100 poster). Med denna vill jag via VBA koppla en etikettutskrift-funktion där ett av tre för-preppade Worddokument (Etiketter1, 2, 3.docm) öppnas med uppdaterad etikett-data beroende på mellan vilka årtal posterna har. Jag har tre perioder där villkoren är: (Före 1994), (Efter 1993 och Före 2013) samt (Efter 2012) som jag har angett två konstanter som får agera brytpunkter (1994 och 2012).

    Har som sagt prövat det mesta men har problem med kopplingen som genererar fel svar (se bif. bild "Dialog1.jpg")!
    Någon som kan se var felet ligger i bifogad kopia av VBA?

     

    Dialog1.jpg

    MailMergeVBA.txt


  10. Här är något riktigt mysko som jag råkat ut för:

    Har en tabell med data och i en kolumn använder jag funktionen "LETARAD" för att länka information mot en annan flik som innehåller "databasen" eller rådata. Allt frid & fröjd so far, MEN när jag infogar en ny rad i tabellen så ändrar Excel argumentet i min LETARAD-funktion så att kolumnreferensen ökar ett steg (från 9 till 10)! Se bifogad bild.

    Image.thumb.png.b7845e83c084af3c7d5d3c53d4414ca8.png 
    Någon som kan förklara varför detta sker?

     


  11. Tack för svar!
    Menar du att jag redan i källdokumentet (Excel-tabellen) kan styra filtret? Som det ser ut nu har jag följande kod i Excel:

    Sub Etiketter()
    
    	On Error Resume Next
            Set ws = Sheets("Lista")
            Dir = ThisWorkbook.Path
            Opt = ws.Range("O1")
            Set objWord = CreateObject("Word.Application")
            objWord.Activate
        objWord.Visible = True
        AppActivate (objWord.Windows(1).Caption)
            Select Case Opt
                
                Case Is = 2                                     ' Före 1970
                Result = objWord.Documents.Open(Dir & "\Etiketter_1.docm")
                AppActivate (objWord.Windows(2).Activate)
    '            & (objWord.Windows("Etiketter_1.docm").Close)
                    
                    Case Is = 3                                 ' Mellan 1970 och 1990
                    Result = objWord.Documents.Open(Dir & "\Etiketter_2.docm")
                    AppActivate (objWord.Windows(2).Activate)
    '                & (objWord.Windows("Etiketter_2.docm").Close)
                        
                        Case Is = 4                             ' Efter 1990
                        Result = objWord.Documents.Open(Dir & "\Etiketter_3.docm")
                        AppActivate (objWord.Windows(2).Activate)
    '                    & (objWord.Windows("Etiketter_3.docm").Close)
                            
                            Case Is = 1                         ' Om inget av ovanstående
                            Result = objWord.Documents.Open(Dir & "\Etiketter_3.docm")
                            AppActivate (objWord.Windows(2).Activate)
    '                        & (objWord.Windows("Etiketter_3.docm").Close)
            End Select
        Call Workbook_RefreshAll
    
    End Sub

    Jag har således tre olika dokument (Word) med etikettmallar som jag vill öppna beroende på hur jag filtrerat på tidsperiod.  Det vore ju bra om jag redan härifrån kunde styra urvalet!


  12. Jag har gjort en databas i Excel 2013 åt en kompis för hans stora skivsamling. Jag försöker att skapa ett automatiserat flöde där det enkelt ska gå att skriva ut etiketter ur samlingen att fästa på hyllor och lådor där skivorna förvaras. För detta ändamål har jag skapat tre etikettmallar i Word för olika tidsperioder (Mall 1 = 1950 - 1970. mall 2 = 1970 - 1990, mall 3 = Från 1990) som kan användas att märka upp de många lådor som skivsamlingen finns i.

    Jag har försökt hitta VBA-kod som kan bistå med detta så att man bara behöver klicka på en knapp i Excel-databasen för att automatiskt skapa en etikettserie  i Word (mailmerge). Det verkar funka så långt att Word öppnar och påbörjar mailmerge med sen hänger sig programmet i flera minuter och Word kraschar. 

    Så här ser min kod ut för första tidspannet (1950-1970):

    Private Sub Document_Open()
    
        Dim wd As Object
        Dim wDocSource As Object, wDocPath As String
        Dim strWorkbookName As String
        Set wDocSource = ThisDocument
        wDocPath = ThisDocument.Path
        strWorkbookName = wDocPath & "\Etiketter+Db.xlsm"
        On Error Resume Next
        Set wd = GetObject(, "Word.Application")
        If wd Is Nothing Then
        Set wd = CreateObject("Word.Application")
        End If
        On Error GoTo 0
        wDocSource.MailMerge.OpenDataSource Name:= _
            strWorkbookName, _
            Connection:="Data Source=" & strWorkbookName & ";Mode=Read", _
            SQLStatement:="SELECT * FROM `Db$`"
    
        With wDocSource.MailMerge
            .Destination = wdSendToNewDocument
            .SuppressBlankLines = True
            With .DataSource
                .FirstRecord = wdDefaultFirstRecord
                .LastRecord = wdDefaultLastRecord
            End With
            .Execute Pause:=False
        End With
        ActiveDocument.SaveAs2 FileName:= _
                    wDocPath & "\Etiketter_Pre-1970.docx", _
                    FileFormat:=wdFormatXMLDocument
        ChangeFileOpenDirectory _
            wDocPath
        ActiveDocument.SaveAs2 FileName:= _
            wDocPath & "\Etiketter_Pre-1970.docx", _
            FileFormat:=wdFormatXMLDocument, LockComments:=False, Password:="", _
            AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, _
            EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData _
            :=False, SaveAsAOCELetter:=False, CompatibilityMode:=15
    
    End Sub

    Då jag kapar sekvensen efter SQLStatement  (i.e. INNAN begäran om att fullfölja mailmerge) så verkar det gå bra, men då måste man "manuellt" välja "Slutför och koppla" för att etikettserien ska genereras och jag vill att hela processen ska funka automatiskt så att det bara är för användaren att skriva ut! Grunddelen av VBA-koden ovan har jag fått genom en makroinspelning och sedan har jag lagt till delar jag hittat på nätet. En märklig sak dock är att själva filtreringen jag gör underinspelningen i "Redigera mottagarlista" kommer av någon anledning inte med i koden - varför då?

    Jag har också prövat att lägga in "WHERE" argument i SQL-statement efter tips när jag Googlat runt men då hittar inte Word sökvägen till Excel-filen och dokumentet kan inte öppna!

    Känner spontant att detta bara måste funka men antagligen är det något knas med kodningen som ställer till det. Om det finns någon i forumet som har råkat ut för motsvarande och till äventyrs hittat en bra lösning vore jag stort tacksam för hjälp!

     

     


  13. Hej alla Excelkunniga!

    Har ett problem jag inte kan förstå hur det ska lösas. Har gjort en inventeringslista i Excel som jag vill kunna skriva ut etiketter på olika poster. Etiketterna kan ha tre olika symboler (bilder) i sig beroende på om posten skapades före ett visst årtal, mellan två år eller efter ett tredje årtal. Så jag har skapat tre wordmallar som jag vill anropa vid etikettutskrift från min Excelfil. Har snokat runt webben och landat i ett VBA-skript som verkade kunna göra jobbet. Jag har med mina något rudimentära kunskaper i VBA försökt anpassa skriptet att öppna beroende på vad man anger via en  combobox: Före 1994, mellan 1994-2011 samt efter 2011.

    Jag har använt case-anrop för kommandona (se skript nedan) men när jag försöker köra det så öppnar Excel visserligen rätt Worddokument men skriptet stannar sedan och felmeddelande visas:

    2080457937_Image1.jpg.579d787edd2697aa0b5878600f679199.jpg

     

    Har prövat att modda skriptet på olika sätt, googlat efter lösning på problemet men inte lyckats finna vad som fattas. Nu står mitt sista hopp till om någon VBA-kunnig på Eforum kan hjälpa mig.

    Sub Etiketter()
    
        Call TaBortSkydd
        Dim ws As Worksheet
        Dim Opt As Integer, Result As Action
        Dim objWord As Object
        Set ws = ActiveSheet
        Opt = ws.Range("$O$1").Value
        Set objWord = CreateObject("Word.Application")
        objWord.Visible = True
            Select Case Opt
                Case Is = 1
                Result = objWord.Documents.Open(Application.ActiveWorkbook.Path & "\Etiketter_1.docx")
                Case Is = 2
                Result = objWord.Documents.Open(Application.ActiveWorkbook.Path & "\Etiketter_2.docx")
                Case Is = 3
                Result = objWord.Documents.Open(Application.ActiveWorkbook.Path & "\Etiketter_3.docx")
            End Select
        ws.Range("$O$1").ClearContents
        Call Workbook_RefreshAll
        Call SkyddaBlad
        
        
    End Sub

    Med hopp om räddning...

×
×
  • Skapa nytt...