Gå till innehåll

MH_

Medlem
  • Innehållsantal

    180
  • Gick med

  • Dagar vunna

    20

Inlägg postade av MH_

  1. Kolla in summa.om()

    https://support.microsoft.com/sv-se/office/funktionen-summa-om-169b8c99-c05c-4483-a712-1697a653039b

    Exempel, letar i kolumn A och summerar kolumn H när villkoret är uppfyllt

    =SUMMA.OM(A:A;"IV_96GG2";H:H)

    Eller så här om du vill skriva in villkoret i cell K1

    =SUMMA.OM(A:A;K1;H:H)

    då kan du lägga en rullgardin/val -lista i K1

    https://support.microsoft.com/sv-se/office/video-skapa-och-hantera-listrutor-28db87b6-725f-49d7-9b29-ab4bc56cefc2

     

    Om du har flera tabeller så kan du ha en formel för varje tabell och lägga ihop värdet:

    =SUMMA.OM(A2:A9;K1;H2:H9)+SUMMA.OM(A12:A30;K1;H12:H30)

     

     

    • Like 1
  2. Hej. 

    Antag att vikten du letar efter står i E2 och din hjälptabell står i A2:B5. Då kan du använda XLETAUPP

    Funktionen XLETAUPP - Microsoft Support

    =XLETAUPP(E2;$A$2:$A$5;$B$2:$B$5;;1)

    Med Error-text:

    =XLETAUPP(E2;$A$2:$A$5;$B$2:$B$5;"Utanför tabellområdet";1)

    Den sista 1:an står för: matchningsläge "1 – Exakt matchning. Returnerar nästa större objekt om ingen hittas."

    Det betyder att om du skriver in vikten 501 i E2 så blir det fel. Så på sista raden får du skriva in något jättehög viktsiffra som gäller för alla paket som är större än näst högsta.

     

    testa.

  3. Du har en produkt som ligger rätt i tiden. Ni har äntligen identifierat rätt målgrupp. Gullig hund fotograferad och en stor/dyr annonsen slängs in i expressen. 

    Ta en kopp kaffe, njut och inse att de små detaljerna kan förstöra allt . Tex att att någon råkar byta ut för mot till 

    https://kampanj.expressen.se/alvarpet/insektsmat-darfor-har-det-blivit-populart-att-ge-till-hunden/

    image.png.6b832c00dcb36de9b8683874c9d52107.png

     

    Ok, det är bara Mikael som uppskattar såna här fel - men han måste ju också få ha det lite kul.

    • Haha 3
  4. Ok. Men då hamnar du i den besvärliga situationen att du måste (?) använda något slags händelsehanterare för att upptäcka att någon klickat. Exempel för dubbelklick:

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    
    'kopiera ibland, klistra in ibland
    
    End Sub

    Och då måste du veta om du verkligen är i "klipp och klistra läge" samt om du vill kopiera eller klistra in

    om di deklarerar en räknare (i) utanför själva händelsehanteraren och lägger till en etta varje gång den körs så kan du kolla om du är i udda (kopieringsläget) eller klistra in (jämt).  I exemplet kör jag en tilldelning eftersom VBA och klipp/klistra aldrig blir som jag vill.

    Dim i As Integer
    Dim källa As Range
    
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If i Mod 2 = 0 Then
            Set källa = Target
       Else
            Target.Value = källa.Value
    End If
    i = i + 1
    End Sub

    Men då är det aktivt så fort du dubbelklickar på bladet och du måste komma på något sätt att koppla på/av händelsebevakningen.

    Om du kör ett "vanligt" makro så vet jag i stället inte hur du skall känna av klick.

     

    Exempel där du har två start/stopmakron som du kanske styr via knappar eller liknande. 

    Option Explicit
    
    Dim i As Integer
    Dim bKör As Boolean
    Dim källa As Range
    
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If bKör = False Then Exit Sub
    Target.Activate
    If i Mod 2 = 1 Then
            Set källa = Target
            Else
            Target.Value = källa.Value
    End If
    i = i + 1
    End Sub
    
    Sub starta()
    bKör = True
    i = 1
    End Sub
    
    
    Sub sluta()
    bKör = False
    End Sub

    men om du kör det här ett par gånger så märker du att jag är snäll när jag påstår att det funkar "så där".

    i princip fins det inget som förhindrar att du kör "Worksheet_SelectionChange" istället. så slipper du dubbelklickandet

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If bKör = False Then Exit Sub
    Target.Activate
    If i Mod 2 = 1 Then
            Set källa = Target
            Else
            Target.Value = källa.Value
    End If
    i = i + 1
    End Sub

    men då är det ännu mer som kan gå snett. 

     

    Den stora nackdelen är väl att de här är bundet till ett blad. Du kan inte lägg ain makrot i någon masterbook. Även om du kan få dubbelklicksvarianten att funka för ett helt blad med

    Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
    ...
    End Sub

    Nej. Det kräver nog mer jobb än du har nytta.

     

    • Thanks 1
  5. Jag antar att du är ute efter samma sak som man kan göra med format-penseln? Dvs om man markerar en cell/område med önskat format och dubbelklickar på pensel-ikonen så får alla celler man markerar på det formatet, ända tills man stänger av funktionen genom att klickar på penseln igen.

    Så vitt jag vet kan man inte göra något liknande för innehåll i excel. Och ett makro skulle bli väldigt svårskrivet - i princip måste du ha ett "vanligt" makro som aktiverar en händelsehanterare som klistrar in så fot du aktiverar en cell osv. Sen skall händelse-makrot dödas/avaktiveras när du är färdig. Eller också ligger det aktivt hela tiden och körs varje gång du markerar en cell, men inklistringen aktiveras bara om villkor x är uppfyllt.

    Du kan få nästan samma funktion genom att kopiera din källcell. Sen aktiverar du alla målceller innan du klistrar in (håll inne Ctrl  och klicka på alla målceller innan du kör Ctrl+V).

    Det borde duga rätt långt.

    • Thanks 1
  6. Dubbelklicka på den lodrätta axeln. Då för du fram "formatera axel"

    image.png.18ac609017b157efe4aa7dc987a60bdd.png

    Där vill du ändra "huvudenhet" till 5 timmar. Problemet är att du inte får skriva in "5:0" så du får räkna lite manuellt.

     

    I excels tidsformat är en dag= 1 och en timme är  1/24. 

    Så 5 timmar är 5/24=2,083333333333...

    Så du får manuellt skriva in det (med lämpligt antal 3:or)

    För 50 gör du samma sak 50/24 =2.08333333333333

    och det låter vettigt eftersom 2 två dygn är 48 timmar.

    Fixa gärna visningsformatet till [t]

  7. Jag TROR inte att excels sök/ersätt någonsin går in i header/footer och söker. Kan du hitta en vanlig text i en sidfot med sökfunktionen? Det kan inte jag.

     

    Det är möjligt att du måste öppna varje Footer och kolla vad som står, typ så här:

    https://techcommunity.microsoft.com/t5/excel/macro-to-update-footers-on-multiple-worksheets/m-p/74507

    problemet är att det svenska "&[Flik]" ser ut som "&A" för VBA. i alla fall om man kollar med:

    MsgBox Blad.PageSetup.CenterFooter

    då kan du testa någonting i stil med:

    Sub Makro1()
    Dim Blad As Worksheet
    For Each Blad In Worksheets
        If Blad.PageSetup.CenterFooter = "&A" Then
            Blad.PageSetup.CenterFooter = "property of M63"
        End If
    Next Blad
    End Sub

    för att söka igenom centrum-foten i samtliga blad i boken (och &[Flik] måste stå ensam i sin del av sidfoten)

    • Thanks 1
  8. Reguljära uttryck är väl mest användbart när du vill bygga komplicerade uttryck med flera delar. T.ex om du vill hitta gamla registreringsnummer. med möstret 3 bokstäver följt av tre siffror.

    Syntaxexempel från words möstermatchning:

    [A-Ö]{3}[0-9]{3}

    Då kan du utvidga med att bokstäverna inte får vara "I" eller vad det nu är som är förbjudet. Dessutom kan du dela upp sökningen i delar och vända på ABC123 till 123ABC om du behöver det. Svenska words namn "mönstermatchning"  är ganska bra

    Sök efter: ([A-Ö]{3})([0-9]{3})
    Ersätt med: \2\1

    (varje parantes blir en egen sökdel och i "ersätt med" klistrar du in sökdel 2 + sökdel )

     

    I ditt fall handlar det väl mer om att köra ett antal bestämda sökningar efter varandra. Inte att hitta saker som följer ett mönster. Eller? Då är det bättre att modifiera ditt makro till att hämta sök/ersätt parametrarna någonstans på makrobladet och helt enkelt köra 18-20 sök/ersätt på varje "klient"blad. Dvs kopiera gränssnittet från ditt specialprogram.

  9. Jag gissar att "Hela ord" inte betyder samma sak som "hela cellen"/"hela frasen". Typ att "hela ord" skiljer på volvo och volvoxc70, men inte på volvo och volvo  xc70. Och då kan du nog fastna i en loop med ovanstående upplägg. 

    Jag vet inte hur ditt specialprogram läser excelfilerna. Om jag öppnar en excelfil i en texteditor så kan jag inte se hur cellavgränsarna ser ut (innehållet verkar vara komprimerat, även i en "moderna" xlsx fil). Annars skulle man kunna tänka sig att du sökte efter:

    <tab>volvo<tab>

    för att få en hel fras, typ.

    • Like 1
  10. Spontant, nej. inte med upplägget du har. 

    Din kod öppnar (väl?) filen som en excelfil och kör sök/ersätt. och då tar den en cell i taget. 

    Om du vill söka avgränsaren (tab) så tror jag att du måste behandla det som en textsträng och aldrig öppna filen i excel.

    kanske något i den här stilen (inte testat)

    https://stackoverflow.com/questions/37291553/excel-macro-to-find-and-replace-multiple-strings-in-any-text-file

     

    Om du öppnar det som en excelfil så kanske du kan hitta varje cell med [5x10] och kolla innehållet 2 celler till höger och vänster. men det blir ju ett helt annat upplägg.

  11. Spontant, nej, inte med excelfunktioner - Om du inte använder ett skrivmaskinstypsnitt med fast teckenbredd.

    VBA/javaskript(automat) - kanske. Om du skickar texten till en textruta med inställningen "anpassa storlek efter text" så borde du kunna avläsa storlek. Eller någon annan metod där du helt enkelt skapar din formaterade text och mäter bredden.

     

    • Like 1
  12. Eftersom tjoflöjt körs på alla förekomster av "Print_Area" så är det förmodligen bara så att det namngivna område som kommer senare i lista "vinner" och får bestämma vad utskriftsområdret blir.

    Du skulle kunna bygga en räknare och bara använda den äldsta eller något liknande (jag antar att namngivna 8mråd3n kommer 7 datum8rdning)

    Jag haaaaatar telefontamgentbord

  13. Om man snor din gamla kod som ni använde tidigare. Ttroligtvis baserad på det här: 

    https://exceloffthegrid.com/vba-code-loop-files-folder-sub-folders/


    Så borde något i den här stilen funka.

     

    Option Explicit
    
    Sub start()
    Dim startmapp As String
     
        Dim folder As String
        folder = GetFolder
    
    Call LoopAllSubFolders(folder)
    
    End Sub
    
    
    Function GetFolder() As String
        Dim fldr As FileDialog
        Dim sItem As String
        Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
        With fldr
            .Title = "Select a Folder"
            .AllowMultiSelect = False
            .InitialFileName = Application.DefaultFilePath
            If .Show <> -1 Then GoTo NextCode
            sItem = .SelectedItems(1)
        End With
    NextCode:
        GetFolder = sItem
        Set fldr = Nothing
    End Function
    
    
    
    
    
    Sub LoopAllSubFolders(ByVal folderPath As String)
    
    Dim fileName As String
    Dim fullFilePath As String
    Dim numFolders As Long
    Dim folders() As String
    Dim i As Long
    
    If Right(folderPath, 1) <> "\" Then folderPath = folderPath & "\"
    fileName = Dir(folderPath & "*.*", vbDirectory)
    
    While Len(fileName) <> 0
    
        If Left(fileName, 1) <> "." Then
     
            fullFilePath = folderPath & fileName
     
            If (GetAttr(fullFilePath) And vbDirectory) = vbDirectory Then
                ReDim Preserve folders(0 To numFolders) As String
                folders(numFolders) = fullFilePath
                numFolders = numFolders + 1
            ElseIf (InStr(1, fileName, ".xl") > 0) Then
                Call tjoflöjt(folderPath & fileName, fileName)
            End If
     
        End If
     
        fileName = Dir()
    
    Wend
    
    For i = 0 To numFolders - 1
    
        LoopAllSubFolders folders(i)
     
    Next i
    
    End Sub
    
    Sub tjoflöjt(sökväg, filnamn)
    Dim WS As Worksheet
    Dim namn As Name
    Dim adress As String
    'Öppna filen
    Workbooks.Open sökväg
    
    For Each WS In ActiveWorkbook.Worksheets
        For Each namn In WS.Names
        
                If ((InStr(namn.Name, "Print_Area") > 0) Or (InStr(namn.Name, "Print_Titles") > 0)) Then
                    adress = namn.RefersTo
                        If (InStr(namn.Name, "Print_Area") > 0) Then
                            namn.Delete
                            WS.PageSetup.PrintArea = adress
                        ElseIf (InStr(namn.Name, "Print_Titles") > 0) Then
                            namn.Delete
                            WS.PageSetup.PrintTitleRows = adress
                        End If
                End If
        Next namn
    Next WS
    'Spara och stäng (den vill inte ha sökvägen då)
    Workbooks(filnamn).Close SaveChanges:=True
    End Sub

     

    OBS Jag har bara testat med testat med att låta "tjoflöjt" öppna/stänga filerna och visa filnamnen. 

    Sub tjoflöjt(sökväg, filnamn)
        Workbooks.Open sökväg
        MsgBox sökväg
        Workbooks(filnamn).Close SaveChanges:=True
    End Sub

    Men det borde funka ändå

    • Thanks 1
×
×
  • Skapa nytt...