PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBAVBA hjälp önskasVBA hjälp önskas
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2023-08-21 15:53
 
 Ändrad av viking  på 2023-08-21 15:55:29

Hej

Jag kan ingenting om VBA men skulle väldigt gärna vilja ha hjälp med en makro snutt, jag inbillar mig att det inte är så svårt för någon som kan, det hänger nog mest på hur bra jag kan förklara.

Se dessa inklipp nedan så ska jag förklara under vad jag är ute efter.

Tillåtna 0 1 2 3 4 5 6 7 8 9 10 11 12 13
A 1 1 1 1 1 1 1 1 1 1 1 1 1 1
B 1 1 1 1 1 1 1 1 1 1 1 1 1 1
C 1 1 1 1 1 1 1 1 1 1 1 1 1 1
D 1 1 1 1 1 1 1 1 1 1 1 1 1 1
E 1 1 1 1 1 1 1 1 1 1 1 1 1 1
F 1 1 1 1 1 1 1 1 1 1 1 1 1 1
G 1 0 0 0 0 0 0 0 0 0 0 0 0 0
H 1 0 0 0 0 0 0 0 0 0 0 0 0 0
                             
                             
  1 2 3 4 5 6 7 8 9 10 11 12 13  
0 A A A A A A A A A A A A A  
1     B B B B B B B B B B B  
2     C C C C C C C C C C C  
3     D D D D D D D D D D D  
4     E E E E E E E E E E E  
5     F F F F F F F F F F F  
6                            
7                            

 

Jag vill få ut samtliga tänkbara kombinationer där varje rad innehåller 13 tecken (012345), ABCDEF används egentligen inte, annat än för att kunna styra eventuella begränsningar, totalt finns 1x1x6x6x6x6x6x6x6x6x6x6x6 = 362797056 unika kombinationer, och i rutan ovan vill jag kunna sätta begränsningar, sätta tillåtna antal, och ibland kan det vara läge att kunna utöka den nedre med fler bokstäver, men de förändringarna kan jag nog kunna gissa mig till i VBA makro, jag har försökt lära mig det så jag har ju bläddrat en del i något jag inte begriper.

Hur lång tid skulle det ta att köra en sådan snurra och skapa en textfil med nästan 363 miljoner möjliga kombinationer, datorn jag använder är av årets modell med I7 under huven så den orkar med en hel del arbete.

Jag tänker att textfilen sparar raderna i detta format.        " 1, 3, 1, 0, 1, 1, 3, 5, 5, 1, 4, 5, 4"

Hur som helst, finns det någon vänlig själ där ute som kan vara behjälplig med detta så vore jag tacksam.

Tack på förhand / V

 

Nytt inlägg
 2023-08-31 04:43
 

Hej och välkommen till forumet Viking!

Jag har skapat lite VBA-kod som jag tror gör det du önskar.

Eftersom native VBA vare sig har multiprocessor- eller multitråd-stöd så kan man lite förenklat uttrycka tiden det tar att köra igenom loopen som en linjär funktion av processorns klockfrekvens.

Jag har kört igenom loopen på en gammal AMD Athlon 1.2GHz och där tog det ungefär 6tim och 45min att skapa textfilen med de nästan 363 miljoner kombinationerna. Om din processor är på låt oss säga 3.6GHz så borde slingan ta ungefär en tredjedel (3,6 / 1,2=3) av den tiden.

Så här ser början av filen ut. Jag hoppas det är så du har tänkt dig.

"0,0,0,0,0,0,0,0,0,0,0,0,0"
"0,0,0,0,0,0,0,0,0,0,0,0,1"
"0,0,0,0,0,0,0,0,0,0,0,0,2"
"0,0,0,0,0,0,0,0,0,0,0,0,3"
"0,0,0,0,0,0,0,0,0,0,0,0,4"
"0,0,0,0,0,0,0,0,0,0,0,0,5"
"0,0,0,0,0,0,0,0,0,0,0,1,0"
"0,0,0,0,0,0,0,0,0,0,0,1,1"
"0,0,0,0,0,0,0,0,0,0,0,1,2"
"0,0,0,0,0,0,0,0,0,0,0,1,3"
"0,0,0,0,0,0,0,0,0,0,0,1,4"
"0,0,0,0,0,0,0,0,0,0,0,1,5"
"0,0,0,0,0,0,0,0,0,0,0,2,0"
"0,0,0,0,0,0,0,0,0,0,0,2,1"
"0,0,0,0,0,0,0,0,0,0,0,2,2"
"0,0,0,0,0,0,0,0,0,0,0,2,3"
"0,0,0,0,0,0,0,0,0,0,0,2,4"
"0,0,0,0,0,0,0,0,0,0,0,2,5"
"0,0,0,0,0,0,0,0,0,0,0,3,0"
"0,0,0,0,0,0,0,0,0,0,0,3,1"
"0,0,0,0,0,0,0,0,0,0,0,3,2"
"0,0,0,0,0,0,0,0,0,0,0,3,3"
"0,0,0,0,0,0,0,0,0,0,0,3,4"
"0,0,0,0,0,0,0,0,0,0,0,3,5"
 
och så här ser det ut på slutet;
 
"0,0,5,5,5,5,5,5,5,5,5,3,0"
"0,0,5,5,5,5,5,5,5,5,5,3,1"
"0,0,5,5,5,5,5,5,5,5,5,3,2"
"0,0,5,5,5,5,5,5,5,5,5,3,3"
"0,0,5,5,5,5,5,5,5,5,5,3,4"
"0,0,5,5,5,5,5,5,5,5,5,3,5"
"0,0,5,5,5,5,5,5,5,5,5,4,0"
"0,0,5,5,5,5,5,5,5,5,5,4,1"
"0,0,5,5,5,5,5,5,5,5,5,4,2"
"0,0,5,5,5,5,5,5,5,5,5,4,3"
"0,0,5,5,5,5,5,5,5,5,5,4,4"
"0,0,5,5,5,5,5,5,5,5,5,4,5"
"0,0,5,5,5,5,5,5,5,5,5,5,0"
"0,0,5,5,5,5,5,5,5,5,5,5,1"
"0,0,5,5,5,5,5,5,5,5,5,5,2"
"0,0,5,5,5,5,5,5,5,5,5,5,3"
"0,0,5,5,5,5,5,5,5,5,5,5,4"
"0,0,5,5,5,5,5,5,5,5,5,5,5"
 
Så här ser min tabell ut
 
 
Och här är koden:
 

Public Sub Ticker()

Dim j1 As Integer, j2 As Integer, j3 As Integer, j4 As Integer, j5 As Integer
Dim j6 As Integer, j7 As Integer, j8 As Integer, j9 As Integer, j10 As Integer
Dim j11 As Integer, j12 As Integer, j13 As Integer

Dim fso As New FileSystemObject
Dim fs As TextStream
Set fs = fso.OpenTextFile(ActiveWorkbook.Path & "\" & "test_data.csv", ForWriting, True)

Dim value(1 To 13) As Integer
Dim arr() As Variant
Dim lineArr As String
Dim r As Integer
Dim c As Integer
Dim rowOffset As Integer
Dim colOffset As Integer
Dim numRows As Integer
Dim numCols As Integer

rowOffset =
2 'table start in row 2
colOffset = 4 'table start in column 4 ("D")
numRows = 6   'number of table rows
numCols = 13  'number of table columns

arr = ActiveSheet.Cells(rowOffset, colOffset).Resize(numRows, numCols).value2

r = UBound(arr,
1) - 1

For j1 = 0 To 0
If arr(j1 + 1, 1) = 0 Then GoTo j1
    value(
1) = j1
   
For j2 = 0 To 0
    
If arr(j2 + 1, 2) = 0 Then GoTo j2
        value(
2) = j2
       
For j3 = 0 To r
       
If arr(j3 + 1, 3) = 0 Then GoTo j3
            value(
3) = j3
           
For j4 = 0 To r
           
If arr(j4 + 1, 4) = 0 Then GoTo j4
                value(
4) = j4
               
For j5 = 0 To r
               
If arr(j5 + 1, 5) = 0 Then GoTo j5
                    value(
5) = j5
                   
For j6 = 0 To r
                   
If arr(j6 + 1, 6) = 0 Then GoTo j6
                        value(
6) = j6
                        
For j7 = 0 To r
                       
If arr(j7 + 1, 7) = 0 Then GoTo j7
                            value(
7) = j7
                           
For j8 = 0 To r
                           
If arr(j8 + 1, 8) = 0 Then GoTo j8
                                value(
8) = j8
                               
For j9 = 0 To r
                               
If arr(j9 + 1, 9) = 0 Then GoTo j9
                                    value(
9) = j9
                                   
For j10 = 0 To r
                                    
If arr(j10 + 1, 10) = 0 Then GoTo j10
                                        value(
10) = j10
                                       
For j11 = 0 To r
                                       
If arr(j11 + 1, 11) = 0 Then GoTo j11
                                            value(
11) = j11
                                           
For j12 = 0 To r
                                           
If arr(j12 + 1, 12) = 0 Then GoTo j12
                                                value(
12) = j12
                                               
For j13 = 0 To r
                                               
If arr(j13 + 1, 13) = 0 Then GoTo j13
                                                    value(
13) = j13
                                                    
                                                        lineArr =
""""
                                                       
For c = 1 To 13
                                                           
If arr(j13 + 1, c) = 0 Then GoTo j13
                                                            lineArr = lineArr & value(c) &
","
                                                       
Next c
                                                    lineArr = Left(lineArr, Len(lineArr) -
1) & """"
                                                    fs.WriteLine lineArr
j13:
                                               
Next j13
j12:
                                           
Next j12
j11:
                                       
Next j11
j10:
                                   
Next j10
j9:
                               
Next j9
j8:
                           
Next j8
j7:
                       
Next j7
j6:
                   
Next j6
j5:
               
Next j5
j4:
           
Next j4
j3:
       
Next j3
j2:
   
Next j2
j1:
Next j1
   
   
fs.Close

End Sub


 

Nytt inlägg
 2023-09-06 17:41
 
Gondi skrev:

Hej och välkommen till forumet Viking!

Jag har skapat lite VBA-kod som jag tror gör det du önskar.

Eftersom native VBA vare sig har multiprocessor- eller multitråd-stöd så kan man lite förenklat uttrycka tiden det tar att köra igenom loopen som en linjär funktion av processorns klockfrekvens.

Jag har kört igenom loopen på en gammal AMD Athlon 1.2GHz och där tog det ungefär 6tim och 45min att skapa textfilen med de nästan 363 miljoner kombinationerna. Om din processor är på låt oss säga 3.6GHz så borde slingan ta ungefär en tredjedel (3,6 / 1,2=3) av den tiden.

Så här ser början av filen ut. Jag hoppas det är så du har tänkt dig.

"0,0,0,0,0,0,0,0,0,0,0,0,0"
"0,0,0,0,0,0,0,0,0,0,0,0,1"
"0,0,0,0,0,0,0,0,0,0,0,0,2"
"0,0,0,0,0,0,0,0,0,0,0,0,3"
"0,0,0,0,0,0,0,0,0,0,0,0,4"
"0,0,0,0,0,0,0,0,0,0,0,0,5"
"0,0,0,0,0,0,0,0,0,0,0,1,0"
"0,0,0,0,0,0,0,0,0,0,0,1,1"
"0,0,0,0,0,0,0,0,0,0,0,1,2"
"0,0,0,0,0,0,0,0,0,0,0,1,3"
"0,0,0,0,0,0,0,0,0,0,0,1,4"
"0,0,0,0,0,0,0,0,0,0,0,1,5"
"0,0,0,0,0,0,0,0,0,0,0,2,0"
"0,0,0,0,0,0,0,0,0,0,0,2,1"
"0,0,0,0,0,0,0,0,0,0,0,2,2"
"0,0,0,0,0,0,0,0,0,0,0,2,3"
"0,0,0,0,0,0,0,0,0,0,0,2,4"
"0,0,0,0,0,0,0,0,0,0,0,2,5"
"0,0,0,0,0,0,0,0,0,0,0,3,0"
"0,0,0,0,0,0,0,0,0,0,0,3,1"
"0,0,0,0,0,0,0,0,0,0,0,3,2"
"0,0,0,0,0,0,0,0,0,0,0,3,3"
"0,0,0,0,0,0,0,0,0,0,0,3,4"
"0,0,0,0,0,0,0,0,0,0,0,3,5"
 
och så här ser det ut på slutet;
 
"0,0,5,5,5,5,5,5,5,5,5,3,0"
"0,0,5,5,5,5,5,5,5,5,5,3,1"
"0,0,5,5,5,5,5,5,5,5,5,3,2"
"0,0,5,5,5,5,5,5,5,5,5,3,3"
"0,0,5,5,5,5,5,5,5,5,5,3,4"
"0,0,5,5,5,5,5,5,5,5,5,3,5"
"0,0,5,5,5,5,5,5,5,5,5,4,0"
"0,0,5,5,5,5,5,5,5,5,5,4,1"
"0,0,5,5,5,5,5,5,5,5,5,4,2"
"0,0,5,5,5,5,5,5,5,5,5,4,3"
"0,0,5,5,5,5,5,5,5,5,5,4,4"
"0,0,5,5,5,5,5,5,5,5,5,4,5"
"0,0,5,5,5,5,5,5,5,5,5,5,0"
"0,0,5,5,5,5,5,5,5,5,5,5,1"
"0,0,5,5,5,5,5,5,5,5,5,5,2"
"0,0,5,5,5,5,5,5,5,5,5,5,3"
"0,0,5,5,5,5,5,5,5,5,5,5,4"
"0,0,5,5,5,5,5,5,5,5,5,5,5"
 
Så här ser min tabell ut
 
 
Och här är koden:
 

Public Sub Ticker()

Dim j1 As Integer, j2 As Integer, j3 As Integer, j4 As Integer, j5 As Integer
Dim j6 As Integer, j7 As Integer, j8 As Integer, j9 As Integer, j10 As Integer
Dim j11 As Integer, j12 As Integer, j13 As Integer

Dim fso As New FileSystemObject
Dim fs As TextStream
Set fs = fso.OpenTextFile(ActiveWorkbook.Path & "\" & "test_data.csv", ForWriting, True)

Dim value(1 To 13) As Integer
Dim arr() As Variant
Dim lineArr As String
Dim r As Integer
Dim c As Integer
Dim rowOffset As Integer
Dim colOffset As Integer
Dim numRows As Integer
Dim numCols As Integer

rowOffset =
2 'table start in row 2
colOffset = 4 'table start in column 4 ("D")
numRows = 6   'number of table rows
numCols = 13  'number of table columns

arr = ActiveSheet.Cells(rowOffset, colOffset).Resize(numRows, numCols).value2

r = UBound(arr,
1) - 1

For j1 = 0 To 0
If arr(j1 + 1, 1) = 0 Then GoTo j1
    value(
1) = j1
   
For j2 = 0 To 0
    
If arr(j2 + 1, 2) = 0 Then GoTo j2
        value(
2) = j2
       
For j3 = 0 To r
       
If arr(j3 + 1, 3) = 0 Then GoTo j3
            value(
3) = j3
           
For j4 = 0 To r
           
If arr(j4 + 1, 4) = 0 Then GoTo j4
                value(
4) = j4
               
For j5 = 0 To r
               
If arr(j5 + 1, 5) = 0 Then GoTo j5
                    value(
5) = j5
                   
For j6 = 0 To r
                   
If arr(j6 + 1, 6) = 0 Then GoTo j6
                        value(
6) = j6
                        
For j7 = 0 To r
                       
If arr(j7 + 1, 7) = 0 Then GoTo j7
                            value(
7) = j7
                           
For j8 = 0 To r
                           
If arr(j8 + 1, 8) = 0 Then GoTo j8
                                value(
8) = j8
                               
For j9 = 0 To r
                               
If arr(j9 + 1, 9) = 0 Then GoTo j9
                                    value(
9) = j9
                                   
For j10 = 0 To r
                                    
If arr(j10 + 1, 10) = 0 Then GoTo j10
                                        value(
10) = j10
                                       
For j11 = 0 To r
                                       
If arr(j11 + 1, 11) = 0 Then GoTo j11
                                            value(
11) = j11
                                           
For j12 = 0 To r
                                           
If arr(j12 + 1, 12) = 0 Then GoTo j12
                                                value(
12) = j12
                                               
For j13 = 0 To r
                                               
If arr(j13 + 1, 13) = 0 Then GoTo j13
                                                    value(
13) = j13
                                                    
                                                        lineArr =
""""
                                                       
For c = 1 To 13
                                                           
If arr(j13 + 1, c) = 0 Then GoTo j13
                                                            lineArr = lineArr & value(c) &
","
                                                       
Next c
                                                    lineArr = Left(lineArr, Len(lineArr) -
1) & """"
                                                    fs.WriteLine lineArr
j13:
                                               
Next j13
j12:
                                           
Next j12
j11:
                                       
Next j11
j10:
                                   
Next j10
j9:
                               
Next j9
j8:
                           
Next j8
j7:
                       
Next j7
j6:
                   
Next j6
j5:
               
Next j5
j4:
           
Next j4
j3:
       
Next j3
j2:
   
Next j2
j1:
Next j1
   
   
fs.Close

End Sub


Hej Gondi

 

Det makrot stannade rätt så fort på rad:

 

Dim fso As New FileSystemObject

Hmm, det verkar ju ta sin tid det där, det är nämligen 36 såna filer som jag hade tänkt köra, hade i nästa steg velat kolla en min - max summa men det känns ju som det skulle ta flera dygn att köra detta :(

Nytt inlägg
 2023-09-07 09:14
 
 Ändrad av Gondi  på 2023-09-07 09:17:22

Hej igen Viking,

Koden "fastnar" inte någonstans - den tar bara lång tid att köra eftersom den skriver nästan 363 miljoner rader till en textfil. På din dator gissar jag att loopen tar drygt 2 timmar enligt mitt tidigare inlägg.

För att säkerställa att koden fungerar som den ska kan du kommentera ut ett par loopar så att den går fortare att köra igenom.

Kommentera ut följande och kör koden igen. Med nedan rader utkommenterade borde loopen ta runt 3-4 minuter på din dator och skapa en textfil som är ungefär 275MB stor.

’        For j3 = 0 To r
        If arr(j3 + 1, 3) = 0 Then GoTo j3
            value(3) = j3
            For j4 = 0 To r
            If arr(j4 + 1, 4) = 0 Then GoTo j4

                value(4) = j4

<------>

j4:

            Next j4
j3:

   Next j3

Jag vet inte vad du vill åstadkomma med denna kod, men betänk att filerna blir extremt stora. Den fulla loopen som skapar en textfil med nästan 363 miljoner rader blir ungefär 10GB på disk och går därför inte ens att öppna eller redigera med editorer som Notepad eller Notepad++ för de stödjer inte så stora filer. Om du ändå vill köra koden 36 gånger så finns det risk att du t.o.m. fyller upp din hårddisk eftersom 36 * 10 GB = 360GB.

 

 

Nytt inlägg
 2023-09-09 11:18
 
Gondi skrev:

Hej igen Viking,

Koden "fastnar" inte någonstans - den tar bara lång tid att köra eftersom den skriver nästan 363 miljoner rader till en textfil. På din dator gissar jag att loopen tar drygt 2 timmar enligt mitt tidigare inlägg.

För att säkerställa att koden fungerar som den ska kan du kommentera ut ett par loopar så att den går fortare att köra igenom.

Kommentera ut följande och kör koden igen. Med nedan rader utkommenterade borde loopen ta runt 3-4 minuter på din dator och skapa en textfil som är ungefär 275MB stor.

’        For j3 = 0 To r
        If arr(j3 + 1, 3) = 0 Then GoTo j3
            value(3) = j3
            For j4 = 0 To r
            If arr(j4 + 1, 4) = 0 Then GoTo j4

                value(4) = j4

<------>

j4:

            Next j4
j3:

   Next j3

Jag vet inte vad du vill åstadkomma med denna kod, men betänk att filerna blir extremt stora. Den fulla loopen som skapar en textfil med nästan 363 miljoner rader blir ungefär 10GB på disk och går därför inte ens att öppna eller redigera med editorer som Notepad eller Notepad++ för de stödjer inte så stora filer. Om du ändå vill köra koden 36 gånger så finns det risk att du t.o.m. fyller upp din hårddisk eftersom 36 * 10 GB = 360GB.

 Ah, ok, kanske VB inte är rätt språk att göra detta i, anledningen att dela upp det hela till 36 filer var för jag tänkte att 13 miljarder skulle vara omöjligt att köra på en gång.
 
Det jag vill åstadkomma är, förutom att siffrorna kommer att bytas ut mot andra siffror, det var exempel på hur det skulle se ut, nåväl, varje sådan rad med 13 olika siffror ska bara summeras och sedan kollas i ett min - max intervall och är summan rätt så skulle man vilja få den utskriven i excel, därav kopplingen till excel då jag behöver göra en slutgiltig kontroll av de och gör det helst i excel.
 
Så egentligen är det ju inget måste att skapa en fil i steg 1 om det inte är ett måste, jag googlade runt lite, det skrivs att Python är lätt att lära sig men det vete tusan om det gäller alla, jag tycker det verkar obegripligt iaf. men om det är snabbare än VB att köra och kanske skriva, men var ska man vända sig då, denna del av forumet gäller väl bara VB ?
Nytt inlägg
 2023-09-11 10:15
 
 Ändrad av Gondi  på 2023-09-12 15:39:35

Hej Viking,

Val av programmeringsspråk har inte någon signifikant betydelse för att "snabba upp" dessa typer av loopar. Vad som däremot snabbar upp exekveringen är om man kan bearbeta all data i minnet istället för att skriva ut till Excel eller en textfil. Jag skrev dock den här snurran åt dig baserat på din ursprungliga kravspecifikation - vilken inte innehöll några krav på att byta ut siffror eller jämföra med ett max-min intervall.

Om du vill få en optimerad kod för dina behov är det bra om du tar med alla krav och önskemål på en gång.

Rent allmänt kan jag dock med enkel matematik förklara för dig att det inte kommer gå att hålla 13 miljarder rader med värden i minnet eftersom varje rad innehåller 27 tecken (bytes).

27 Bytes * 6 ^ 13 = 352 638 738 432 Bytes = 328 Gigabyte

Så mycket internminne antar jag att din dator inte har - även om den är av senaste modell... ;-)

PS. Angående Phyton så finns det stöd för det språket i Excel också numera om du använder Excel 365 och är med i Insider-programmet. DS.

Nytt inlägg
 2023-09-16 11:28
 

Hej igen Gondi eller någon annan som läser :)

Ok, jag trodde språk var lite olika uppbyggda och därmed olika optimerade för kanske olika saker och då blir snabbheten olika.

Men du efterfrågade vad jag egentligen ville göra, och om det är som du säger att det är sparande på fil som gör detta omöjligt, så har jag funderat lite mer och om man kan göra allt i minnet så hade ju det varit förträffligt bra, jag tänkte att datorn inte kunde hålla så mycket i minnet och därför behövde få det sparat i fil först, men med rätt loop så behöver det nog inte bli så kämpigt för datorn, det känns som du förstått det mesta jag skrivit innan i alla fall.

Så här kan siffrorna se ut

5,89007774 4,919157968 6,208290584 5,043889514 7,173021749 7,394305324 6,450268298 7,78611588 7,066683506 7,228468689 6,87322245 7,036172505 8,698302286
16,33663071 10,9626949 17,13488201 12,27788895 19,91568392 20,31206764 16,50338916 20,12142306 18,09070977 18,43997115 18,56478641 17,87187816 20,87592549
24,95220253 20,19443797 24,83316234 20,06708731 26,4505177 26,26014975 25,58486308 26,49122267 25,77024184 26,4198417 26,02289425 27,07860328 26,80443605
23,46453734 23,98089509 23,60176586 24,42721361 22,75313351 22,59921734 23,60665202 22,55423995 23,25284033 22,93295904 22,73717528 22,3958373 21,90683539
18,03836308 23,11411575 17,30796163 21,95575435 15,11458154 14,78861065 17,44643997 14,67874305 16,4460998 15,85190502 16,22328182 15,95703407 14,19562933
11,3181886 16,82869831 10,91393759 16,22816626 8,593061588 8,645649302 10,40838748 8,368255385 9,373424754 9,126854406 9,578639797 9,660474683 7,518871467

 

Och då vill jag helt enkelt att alla 13 miljoner rader summerar ihop dessa värden och för att raden ska bli godkänd och sparas på en excel fil så vill jag kunna sätta en summa med en felmarginal, t.ex. 200 i summa och 0.00001 i felmarginal.

Jag tänkte först att man kunde välja ett visst antal utifrån de rader med minsta felmarginal men då tror jag man måste spara alla rader i minnet först så jag tänkte att om man kunde använda felmarginalen så har man ju Min - Max intervall klart och passar inte raden in där så kastas den bort ur minnet från datorn så den inte behöver lagra en massa onödigt som inte behövs, vad tror du om det ?

 

 

Nytt inlägg
 2023-09-16 14:56
 
 Ändrad av Gondi  på 2023-09-16 17:40:47

Hej Viking,

Det stämmer att programmeringsspråk är olika uppbyggda och är bäst lämpade för olika ändamål. Vissa språk har exempelvis inbyggt stöd för multiprocessor och multitrådskörning, medan andra (som VBA) inte har det. Det är dock alltid upp till utvecklaren att skriva kod som är ändamålsenlig och nyttjar de olika utvecklingsmiljöerna på bästa sätt.

Eftersom du har ställt en fråga angående VBA - som är den utvecklingsmiljö vi diskuterar på detta forum - så baseras våra svar på vad man kan göra i den miljön, och inte exempelvis vad man kan göra med Python, C# eller andra språk.

Det är inte enbart utvecklingsmiljön (språket) som har inverkan på prestandan utan även hur koden är skriven. Om VBA skulle stödja multitrådsexekvering så skulle man kunna dela upp den långa loopen på exempelvis 6 (eller flera) separata trådar som körs parallellt på olika kärnor och på så sätt förbättra prestandan. Men eftersom den möjligheten inte finns i VBA så skrev jag enklast möjliga (sekvensiella) kod åt dig.

I ditt specifika exempel kan man nog göra precis som du föreslår, dvs. att istället för att skriva ut varje enskild rad till Excel eller till en textfil enbart behålla de "godkända" raderna i minnet, om de inte blir för många så minnet tar slut.

Dock skulle jag föreslå att du först kör igenom hela loopen utan att göra någonting med resultaten genom att helt enkelt kommentera ut raderna som skriver till textfilen.

’                                                                                      lineArr = """"
                                                        For c = 1 To 13
                                                            If arr(j13 + 1, c) = 0 Then GoTo j13
                                                            lineArr = lineArr & value(c) & ","
                                                        Next c
                                                    lineArr = Left(lineArr, Len(lineArr) - 1) & """"
                                                    fs.WriteLine lineArr 

 

Tiden det tar att köra igenom loopen med ovan rader utkommenterade är den absolut kortaste tiden det kommer ta att köra igenom de nästan 363 miljoner raderna i VBA. Multiplicera sen denna tid med 36 så får du fram minimitiden den fulla loopen med 13 miljarder itterationer kommer ta i anspråk på din hårdvara.

Är det fortfarande för långsamt så är inte VBA rätt miljö, då får du söka dig om efter ett annat språk och ställa frågan i forum där dessa experter finns. 

 

Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBAVBA hjälp önskasVBA hjälp önskas

PNG32 PNG32
Excelforum drivs av Excelspecialisten som bedriver utbildning i Excel och VBA, tillhandahåller support och hjälp med Excel, utvecklar program i Excel. Är ni i behov av en konsult inom Excel, VBA eller VSTO, eller söker en excelkurs, kontakta oss.
Copyright 2013 ExcelSpecialisten XLS AB   Användarvillkor  Personliga uppgifter