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

short

Medlem
  • Antal inlägg

    136
  • Gick med

  • Senaste besök

Foruminlägg postade av short


  1. Jag har två körtidsproblem:

    1. Följande kod genomlöps tre ggr (tre olika flikar där citerad kod är för den första fliken)

    For c = 58 To 2298 Step 56
                Range(Range("AnslagJan").Cells(c, 1), Range("AnslagJan").Cells(c + 7, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 9, 1), Range("AnslagJan").Cells(c + 9, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 11, 1), Range("AnslagJan").Cells(c + 13, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 15, 1), Range("AnslagJan").Cells(c + 17, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 19, 1), Range("AnslagJan").Cells(c + 24, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 26, 1), Range("AnslagJan").Cells(c + 30, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 32, 1), Range("AnslagJan").Cells(c + 34, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 36, 1), Range("AnslagJan").Cells(c + 39, 12)) = 0
                Range(Range("AnslagJan").Cells(c + 42, 1), Range("AnslagJan").Cells(c + 47, 12)) = 0
            Next c
    

    Det är alltså 4560 rader där 12 celler på varje rad ska nollas. Det tar ca 24 sek eller 8 sek per fik..

     

    2. Följande kod genomlöps en gång:

    For rad = 171 To 2355 Step 56
            For månad = 13 - Z To 12
                Sheets("Avgifter").Cells(rad, månad + 16) = _
                Sheets("Avgifter").Cells(rad - 27, månad + 16) * Sheets("Avgifter").Cells(rad - 48, 13)
                Sheets("Bidrag").Cells(rad, månad + 16) = _
                Sheets("Bidrag").Cells(rad - 27, månad + 16) * Sheets("Bidrag").Cells(rad - 48, 13)
            Next månad
        Next rad
    

    Det är alltså två flikar med vardera 80 rader där som mest 12 celler ska beräknas (Z står för antal månader som väljs och kan variera mellan 12 - 1. Det maximala antalet är alltså 160 rader med 12 celler vardera. Körtiden är i max-fallet 20 sek.

     

    Finns det någon smartare kod som ger samma resultat i fall 1 respektive fall 2 på kortare tid?


  2. 1. Man låser fönsterrutor t ex efter kolumn A och skjuter in bladet så att kolumn AAA syns

    2. Mellan A och AAA (och efter AAA) finns flera dolda kolumner som man kan öppna genom att trycka på en knapp som går till kod som tar fram dolda kolumner

    3. När man tryckt på knappen scrollar datorn automatiskt till kolumn A

     

    FRÅGA: Finns det något sätt att förhindra scrollningen till kolumn A - alternativt lagra undan adressen till där man stod för att sedan lägga in kod som hoppar tillbaka till utgångsläget . Användarna klagar över att de måste manuellt ta sig tillbaka till kolumn AAA (man vill se de dolda kolumner som finns i anslutning till AAA) 


  3. Om man kopierar ett antal celler som innehåller formler och klistrar in dem i en annan arbetsbok blir resultatet en länk till den sida man kopierat från. Finns det något sätt där man kan undvika själva länken och bara klistra in samma formel som står i cellen man kopierat? Har prövat alla inklistringsalternativ utan att lyckas.


  4. Antag att man i första kolumnen skriver olika typer av fruktträd t ex äpplen, Päron och i andra kolumnen skriver olika typer t ex astrakan, greve Molke. Därefter skapar man en Pivotabell (med antalsuppgifter) samt ett AutoFilter så kommer det fram en intressant skillnad. Om man i AutoFiltret väljer Äpple i första kolumnen försvinner alla äppelsorter i rullgardinen på den andra kolumnen. I en Pivottabell är det inte så. Där kan man fortfarande i kolumn 2:s rullgardin välja greve Molke fast det är ett päron. Detta får till följd att en oaktsam användare som väljer i en Pivottabells rullgardiner kan tro att han ser utfallet som inkluderar Greve Molke fast dessa siffror inte är med (för i presentationen finns dessa värdena för Greve Molke inte med).

     

    Går det att få Pivottabellens rullgardiner att fungera som AutoFiltrets dvs att icke längre valbara alternativ försvinner ur rullgardinen?


  5. Sub AA()
        Dim af As AutoFilter
        Dim v As Filter
        Dim a As Integer
        Dim i As Integer
        Dim k As Integer
        
        Set af = Sheets("Blad1").AutoFilter
        For i = 1 To 4
            With af.Filters(i)
                If .On = False Then
                    Cells(20, 5 + i) = 0
                Else
                    a = af.Filters(i).Count
                    Set v = ActiveSheet.AutoFilter.Filters(i)
                    If a = 2 Then
                        Cells(20, 5 + i) = v.Criteria1
                        Cells(21, 5 + i) = v.Criteria2
                    Else
                        If a = 1 Then
                            Cells(20, 5 + i) = v.Criteria1
                        Else
                            For k = 0 To a - 1
                                Cells(20 + k, 5 + i) = v.Criteria1(k + 1)
                            Next k
                        End If
                    End If
                End If
            End With
        Next i
        
    End Sub
    
    
    

    Jag fick just ihop det själv. Ovanstående kod verkar fungera.


  6. Det börjar närma sig - kanske. Din testrutin fungerar. Jag behöver dock läsa vilka värden AutoFiltret är inställt på. af.Filters(1) innehåller fem värden i min test men vilka är de? Jag försöker läsa innehållet i af.Filters men det går inte. Jag har försökt med Criteria1 men det går inte heller.


  7. Sub nn()
     Dim v As Filter
     Dim i As Integer
        If ActiveSheet.AutoFilterMode Then
            On Error Resume Next
            For i = 1 To 4
                If ActiveSheet.AutoFilter.Filters(i).On Then
                    Set v = ActiveSheet.AutoFilter.Filters(i)
                    Cells(20, 5 + i) = v.Criteria1
                    Cells(21, 5 + i) = v.Criteria2
                    Cells(22, 5 + i) = v.Criteria3
                    Cells(23, 5 + i) = v.Criteria4
                    Cells(24, 5 + i) = v.Criteria5
                Else
                    Cells(20, 5 + i) = 0
                End If
            Next i
            On Error GoTo 0
        End If
    End Sub
    
    

    Jag har försökt med ovanstående men jag får bara ut två kriterier per kolumn även om det finns flera. Det verkar som om det vid fler än två kriterier så lagras det en Array i Criteria1. Frågan är hur jag kommer åt detta (dvs om så är fallet).


  8. Jag testade med filter i två kolumner

    Sub nn()
     Dim v As Filter
        If ActiveSheet.AutoFilterMode Then
            Set v = ActiveSheet.AutoFilter.Filters(1)
            Debug.Print v.Criteria1
            Debug.Print v.Criteria2
            Debug.Print v.Criteria3
            Set v = ActiveSheet.AutoFilter.Filters(2)
            Debug.Print v.Criteria1
        End If
    
    End Sub
    

    Om jag för filter1 har två urvalskriteria så får jag programfel när jag försöker få tag på det tredje (som inte finns-jag vet ju inte hur många som finns). Jag får också programfel om jag för ett filter tillåter alla (dvs inte har filtrerat bort några värden). Hur undviker jag detta?


  9. Jag har fyra kolumner med data där varje kolumn har ett AutoFilter. Jag behöver ta reda på hur varje AutoFilter är inställt. Jag har försökt med hjälp av AutoFilter.Property men jag lyckas inte få till det.


  10. Thoshiba Satellite L50-B-1T2

    Windows 8.1

     

    Jag upptäckte nyss att program som jag skrivit i den nya datorn och som innehåller ActiveX-kontroller inte heller fungerar. Mig veterligt har jag inte rört några inställningar. Vad kan ha inträffat???


  11. I samband med datorbyte har jag förlorat möjligheten att använda ActiveX-kontroller. Jag får meddelandet "Objektet kan inte infogas". Det ställer till problem med äldre tillämpningar som innehåller ActiveX-kontroller som nu inte fungerar. Jag har ett dimmigt minne att man ska ställa in något för att kunna använda ActiveX men jag har glömt hur. Hjälp!!


  12. Nu har jag omarbetat flyttprogrammet och fått ned körtiden från 55 sek till 5 sek. Den största vinsten gav att stänga av den automatiska beräkningen (-37 sek). Sedan använde jag mig av Range().Value=Range().Value och tog bort aktiverandet av mottagarboken enl Monshis råd. När jag skulle flytta mer fler än en kolumn delade jag upp flytten och flyttade en kolumn i taget eftersom datorn nekade mig att ta flera kolumner i taget.

    Windows(Frånnamn).Activate
            Sheets("Timplanering helår").Range(Range("TP_Aktivitet").Columns(kolumn + 5), Range("TP_Aktivitet").Columns(kolumn + 17)).Copy
            Windows(Tillnamn).Activate
            Sheets("Timplanering helår").Range(Range("TP_Aktivitet").Columns(kolumn + 5), Range("TP_Aktivitet").Columns(kolumn + 17)) _
            .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    

    Detta delades upp i (endast kolumn 5 till 8 här i programmet 5 till 17)
            

    Windows(Frånnamn).Activate
            Workbooks(Tillnamn).Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 5).Value = _
            Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 5).Value
            
            Workbooks(Tillnamn).Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 6).Value = _
            Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 6).Value
            
            Workbooks(Tillnamn).Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 7).Value = _
            Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 7).Value
            
            Workbooks(Tillnamn).Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 8).Value = _
            Sheets("Timplanering helår").Range("TP_Aktivitet").Columns(kolumn + 8).Value
    

    Det senare gav -13 sek. Slutresultat 5 sek efter en minskning på 50 sek.

    Array-lösningen trasslade jag mig in i så till den grad att jag gav upp. Jag har lärt mig mycket - tack för all hjälp.


  13. Tack :thumbsup: för två ambitiösa svar. Jag ska testa de olika varianterna och återkommer med resultat om ett par dagar.

    Monshi: Din bästa lösning i praktiken har jag faktiskt funderat på men synd bara att jag inte hade den innan jag spred ut arbetsböckerna. Man måste väl då ha två extra blad, ett med formler som kopierar inmatningen och ett som kan ta emot nya data för  att sedan behandlas av ett program som flyttar in data på "ordinarie" plats.


  14. Jag fattar nu hur man utökar en Array samt hur man listar innehållet i den. Det jag fortfarande inte begriper det är att hur man skapar ett innehåll i en Array utöver Tabell=Range(Cells(1,1),Cells(2,2)) som är den superenkla inläsningen i början. Antag att det man då läst in är A1 tom B2. Efter utökningen av arrayen till 4 kolumner vill jag lägga till innehållet i E1 tom F2. Hur gör jag då om jag inte ska läsa in cell för cell i en for-next slinga? Jag vill ju samtidigt behålla A1 tom B2 (alltså Preserve). Hade jag vilja läsa in C1 tom D2 så vore det enkelt Tabell=Range(Cells(1,1),Cells(2,4)) men som sagt hur gör jag om fälten inte hänger ihop?


  15. Sub nn()
    Dim Tabell As Variant
    Dim R As Long
    Dim C As Long
    
    
        Tabell = Range(Cells(2, 1), Cells(11, 3))
        Debug.Print UBound(Tabell, 1); UBound(Tabell, 2)
        ReDim Preserve Tabell(1 To 10, 3 To 4)
        Tabell = Range(Cells(2, 6), Cells(10, 6))
        Debug.Print UBound(Tabell, 1); UBound(Tabell, 2)
        
        For R = 1 To UBound(Tabell, 1) ' First array dimension is rows.
        For C = 1 To UBound(Tabell, 2) ' Second array dimension is columns.
            Debug.Print Tabell(R, C)
        Next C
    Next R
    
    End Sub
    

    Det blev väldigt konstigt så jag försöker igen. Vid första debug så blir Tabelldimensionerna 10,3 vilket  stämmer. Andra gången blir det 9,1 vilket borde vara 10,4 ????

    När jag läser in det som ska stå i fjärde kolumnen så har det som fanns i de tre första kolumnerna försvunnit (de finns ju inte längre efter Redim


  16. 
    

    Sub nn() Dim Tabell As Variant Dim R As Long Dim C As LongTabell = Range(Cells(2, 6), Cells(10, 6))

     

    Tabell = Range(Cells(2, 1), Cells(11, 3)) Debug.Print UBound(Tabell, 1); UBound(Tabell, 2) ReDim Preserve Tabell(1 To 10, 3 To 4) Tabell = Range(Cells(2, 6), Cells(10, 6)) Debug.Print UBound(Tabell, 1); UBound(Tabell, 2) For R = 1 To UBound(Tabell, 1) ' First array dimension is rows. For C = 1 To UBound(Tabell, 2) ' Second array dimension is columns. Debug.Print Tabell(R, C) Next C Next R End Sub

    Första gången jag kör Debug.print ger det 10,3 vilket stämmer men andra gången ger det 9,1 det borde ge 10,4???? När jag skriver ut innehållet i Tabell så kommer bara sista raden med dvs cells(2,6) till Cells(10,6)


  17. 1. Att man inte behöver aktivera boken man skriver till stämmer om det bara är en kolumn man ska kopiera. Ska man kopiera flera kolumner måste man aktivera boken man ska skriva till och då går inte heller din sats nr 5. (Se kodexempel)

    Windows(Frånnamn).Activate    Sheets("Lönekostnader månadslön").Range(Range("LK_Aktivitet").Columns(2), Range("LK_Aktivitet").Columns(3)).Copy
        
        Windows(Tillnamn).Activate
        Sheets("Lönekostnader månadslön").Range(Range("LK_Aktivitet").Columns(2), Range("LK_Aktivitet").Columns(3)) _
        .PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    

    4. Att stänga av formlerna under själva flytten och sedan sätta på den igen verkar ge en hel del.


  18. Jag har i timmar försökt få till det men icke... När ReDim satsen ska köras svarar datorn Utanför index. Jag försöker öka en tabell från 10 rader och tre kolumner till fyra kolumner utan att mista de redan inlästa uppgifterna-

    Dim Tabell As Variant
    
        Tabell = Range(Cells(2, 1), Cells(11, 3))
        ReDim Preserve Tabell(10, UBound(Tabell, 2) + 1)
        Tabell = Range(Cells(2, 6), Cells(11, 6))
    
    End Sub
    
×
×
  • Skapa nytt...