|
|
viking |
Medlem sedan: 2023-08-21
4 inlägg
|
|
|
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
|
|
|
|
| |
|
Gondi |
Medlem sedan: 2023-03-28
341 inlägg
|
|
|
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
|
|
|
|
| |
|
viking |
Medlem sedan: 2023-08-21
4 inlägg
|
|
|
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 :(
|
|
|
|
| |
|
Gondi |
Medlem sedan: 2023-03-28
341 inlägg
|
|
|
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.
|
|
|
|
| |
|
viking |
Medlem sedan: 2023-08-21
4 inlägg
|
|
|
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 ?
|
|
|
|
| |
|
Gondi |
Medlem sedan: 2023-03-28
341 inlägg
|
|
|
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.
|
|
|
|
| |
|
viking |
Medlem sedan: 2023-08-21
4 inlägg
|
|
|
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 ?
|
|
|
|
| |
|
Gondi |
Medlem sedan: 2023-03-28
341 inlägg
|
|
|
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.
|
|
|
|
| |