Avatar billede Agerbo Mester
25. januar 2018 - 17:02 Der er 9 kommentarer og
2 løsninger

Pinkode formel i makro

Jeg er løbet ind i et lille problem med hensyn til at afprøve div. talkombinationer.
Jeg har brug for at få lavet et papirark hvorpå der står 4 tal mellem 0-9.
4 cifre hvor tallene gerne må gå igen. eks 01234, 0112 osv
talene er fra 0-9

Der er 10000 kombinationer og alt andet lige så ville det være nemmere om Excel kunne lave dette ved at oprette en makro.

Håber der er nogen kloge hoveder derude som kan hjælpe mig ?
Avatar billede store-morten Ekspert
25. januar 2018 - 17:58 #1
Måske:
=SLUMPMELLEM(0;9)
i 4 celler, ny kode hver gang excel beregner. (tast F9)
Avatar billede store-morten Ekspert
25. januar 2018 - 18:01 #2
I en celle:
=SLUMPMELLEM(0;9) & " " & SLUMPMELLEM(0;9) & " " & SLUMPMELLEM(0;9) & " " & SLUMPMELLEM(0;9)
Avatar billede jens48 Ekspert
25. januar 2018 - 18:01 #3
Er det ikke blot en formel i stil med denne du har brug for?

=INT(RAND()*10000)

På dansk:

=HELTAL(SLUMP()*10000)

og så formateret, så du får de første nuller med
Avatar billede store-morten Ekspert
25. januar 2018 - 18:44 #4
Makro.
Laver en Pin-kode i A1 på det første faneblad.
Kan ændres til at lave flere unike Pin-koder i flere celler.
Sub LavUnikTabel()
'Laver en tabel med tilfældige heltal
'uden dubletter. Tricket til at undgå dubletter
'er at tilføje værdierne til en collection og
'samtidig lade værdien være "nøgle".
'Nøglerne i en collection skal nemlig være
'unikke, og hvis man forsøger at tilføje en
'allerede eksisterende nøgle, udløser det en
'fejl, og det er dette, vi udnytter.

'OBS! Ved meget store tabeller er dette en
'tidskrævende metode, idet der med stor
'sandsynlighed genereres tal, som allerede
'findes i tabellen, og så tager det ekstra
'tid at blive færdig. Normalt er hastigheden
'dog så høj, at det er ligegyldigt, og man kan
'reducere sandsynligheden for dubletter ved at
'øge intervallet for de tilfældige tal.

Dim rTabel As Range
Dim rCell As Range
Dim lMin As Long
Dim lMax As Long
Dim lVal As Long
Dim colValues As Collection

On Error GoTo ErrorHandle

'Tabelområdet defineres f.eks. som området A1 til J30
'Range("A1"; "J30")
'på det første faneblad.
'**Her under kun valgt 1 celle**'
Set rTabel = Worksheets(1).Range("A1")

'Definerer intervallet (her 1 til 9999).
lMin = 0
lMax = 9999

'Kontrol: Intervallet skal være mindst lige så
'stort som antallet af celler i tabellen.
If lMax - lMin < rTabel.Count Then
  MsgBox "Intervallet er for lille.", vbCritical
  GoTo BeforeExit
End If

'Resetter talgeneratoren så den får en ny seed value.
Randomize

Set colValues = New Collection

'Fidusen til kun at få unikke værdier ligger i at
'vi nu sætter fejlbehandlingen til "Resume Next".
'Uden On Error Resume Next ville programmet gå ned,
'hvis man prøvede at tildele en allerede eksisterende
'nøgle. Nu derimod fortsætter programmet bare.

On Error Resume Next

'Nu starter vi løkken som genererer tilfældige tal.
'Løkken kører, indtil colValues indeholder lige så
'mange tal, som der er celler i tabellen, rTabel.
Do Until colValues.Count = rTabel.Count
  'lVal sættes lig et tilfældigt heltal i
  'vores definerede interval.
  lVal = Int((lMax - lMin + 1) * Rnd() + lMin)

  'Føj til colValues med tallet som nøgle
  colValues.Add lVal, Str$(lVal)
Loop

On Error GoTo ErrorHandle

'colValues gennemløbes, og værdierne sættes
'ind i tabellen.
With colValues
  For lVal = 1 To .Count
      rTabel.Item(lVal).Value = .Item(lVal)
  Next
End With

BeforeExit:
Set rCell = Nothing
Set rTabel = Nothing
Set colValues = Nothing

Exit Sub
ErrorHandle:
MsgBox Err.Description & " Fejl i proceduren LavUnikTabel."
Resume BeforeExit
End Sub
Avatar billede Agerbo Mester
25. januar 2018 - 21:37 #5
store-morten:
Det var noget lige som det du har beskrevet.
Jeg får dog kun en pinkode i A1, hvad du også har skrevet i Makroen.
Det jeg skulle bruge, var at alle pinkoder (10000) automatisk blev listet op på et antal a4 ark og gerne med et afkrydsnings felt til højre for hver pinkode
Avatar billede store-morten Ekspert
25. januar 2018 - 22:21 #6
Jeg har ingen ide om hvor mange mulige koder der kan laves :-)

Men prøv at ændre i koden:

lMin = 0
lMax = 10000

Og

Set rTabel = Worksheets(1).Range("A1", "J1000")

Så vil du få 1000 rækker og 10 kolonner udfyldt
A1:J1000
Avatar billede store-morten Ekspert
25. januar 2018 - 22:26 #7
Du får så 10000 koder, men hvis 0000 kommer frem, vil der mangle 1 kode.
Avatar billede store-morten Ekspert
25. januar 2018 - 23:32 #8
Prøv denne, med rammer og afkrydsnings felt til højre, 20 sider.
Sub LavUnikTabel()
'Laver en tabel med tilfældige heltal
'uden dubletter. Tricket til at undgå dubletter
'er at tilføje værdierne til en collection og
'samtidig lade værdien være "nøgle".
'Nøglerne i en collection skal nemlig være
'unikke, og hvis man forsøger at tilføje en
'allerede eksisterende nøgle, udløser det en
'fejl, og det er dette, vi udnytter.

'OBS! Ved meget store tabeller er dette en
'tidskrævende metode, idet der med stor
'sandsynlighed genereres tal, som allerede
'findes i tabellen, og så tager det ekstra
'tid at blive færdig. Normalt er hastigheden
'dog så høj, at det er ligegyldigt, og man kan
'reducere sandsynligheden for dubletter ved at
'øge intervallet for de tilfældige tal.

Dim rTabel As Range
Dim rCell As Range
Dim lMin As Long
Dim lMax As Long
Dim lVal As Long
Dim colValues As Collection

Application.ScreenUpdating = False

On Error GoTo ErrorHandle

'Tabelområdet defineres f.eks. som området A1 til J1000
'på det første faneblad.
Set rTabel = Worksheets(1).Range("A1", "J1000")

'Definerer intervallet (her 0 til 10000).
lMin = 0
lMax = 10000

'Kontrol: Intervallet skal være mindst lige så
'stort som antallet af celler i tabellen.
If lMax - lMin < rTabel.Count Then
  MsgBox "Intervallet er for lille.", vbCritical
  GoTo BeforeExit
End If

'Resetter talgeneratoren så den får en ny seed value.
Randomize

Set colValues = New Collection

'Fidusen til kun at få unikke værdier ligger i at
'vi nu sætter fejlbehandlingen til "Resume Next".
'Uden On Error Resume Next ville programmet gå ned,
'hvis man prøvede at tildele en allerede eksisterende
'nøgle. Nu derimod fortsætter programmet bare.

On Error Resume Next

'Nu starter vi løkken som genererer tilfældige tal.
'Løkken kører, indtil colValues indeholder lige så
'mange tal, som der er celler i tabellen, rTabel.
Do Until colValues.Count = rTabel.Count
  'lVal sættes lig et tilfældigt heltal i
  'vores definerede interval.
  lVal = Int((lMax - lMin + 1) * Rnd() + lMin)

  'Føj til colValues med tallet som nøgle
  colValues.Add lVal, Str$(lVal)
Loop

On Error GoTo ErrorHandle

'colValues gennemløbes, og værdierne sættes
'ind i tabellen.
With colValues
  For lVal = 1 To .Count
      rTabel.Item(lVal).Value = .Item(lVal)
  Next
End With

    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("D:D").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("F:F").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("H:H").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("J:J").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("L:L").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("N:N").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("P:P").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("R:R").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("T:T").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
   
    Range("A:A,C:C,E:E,G:G,I:I,K:K,M:M,O:O,Q:Q,S:S").Select
    Selection.ColumnWidth = 4.5
    Range("T:T,R:R,P:P,N:N,L:L,J:J,H:H,F:F,D:D,B:B").Select
    Selection.ColumnWidth = 2
   
        Range("A:A,C:C,E:E,G:G,I:I,K:K,M:M,O:O,Q:Q,S:S").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Selection.NumberFormat = "####0000"
   
    Range("A1:T1000").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Range("A1").Select
   
    Application.ScreenUpdating = True

BeforeExit:
Set rCell = Nothing
Set rTabel = Nothing
Set colValues = Nothing
Application.ScreenUpdating = True

Exit Sub
ErrorHandle:
Application.ScreenUpdating = True
MsgBox Err.Description & " Fejl i proceduren LavUnikTabel."
Resume BeforeExit
End Sub
Avatar billede jens48 Ekspert
25. januar 2018 - 23:53 #9
Hvis du vil have splittet pinkoden op i 4 kolonner kan du bruge denne makro:

Sub fyld()
For d = 1 To 10
For c = 1 To 10
For b = 1 To 10
For a = 1 To 10
Cells(a + 10 * (b - 1) + 100 * (c - 1) + 1000 * (d - 1), 4) = a - 1
Cells(a + 10 * (b - 1) + 100 * (c - 1) + 1000 * (d - 1), 3) = b - 1
Cells(a + 10 * (b - 1) + 100 * (c - 1) + 1000 * (d - 1), 2) = c - 1
Cells(a + 10 * (b - 1) + 100 * (c - 1) + 1000 * (d - 1), 1) = d - 1
Next
Next
Next
Next
End Sub
Avatar billede Agerbo Mester
26. januar 2018 - 08:51 #10
Stor tak til store-morten og Jens48 fordi I har taget jer tid til at hjælpe mig med dette.

Kan man let lave det således at cifrene står i kronologisk orden ?

f.eks.: 0000-0001...osv

1000 tak for jeres tid
Avatar billede store-morten Ekspert
26. januar 2018 - 11:13 #11
Det er jo en helt anden snak ;-)
Som hurtigt kunne laves manuelt.
Men du får da en makro:
Sub Kronologisk_Tabel()

    Application.ScreenUpdating = False
   
        Range("B:B,D:D,F:F,H:H,J:J,L:L,N:N,P:P,R:R,T:T").ColumnWidth = 2
   
        Range("A:A,C:C,E:E,G:G,I:I,K:K,M:M,O:O,Q:Q,S:S").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlBottom
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
        .ColumnWidth = 4.5
        .NumberFormat = "####0000"
    End With
   
    Range("A1:T1000").Select
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
   
    Range("A1").FormulaR1C1 = "0"
    Range("A2").FormulaR1C1 = "=R[-1]C+1"
    Range("C1").FormulaR1C1 = "1000"
    Range("C2").FormulaR1C1 = "=R[-1]C+1"
    Range("A1:D2").AutoFill Destination:=Range("A1:T2"), Type:=xlFillDefault
    Range("A2:T2").AutoFill Destination:=Range("A2:T1000"), Type:=xlFillDefault
    Range("A1:T1000").Copy
    Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
       
    Application.ScreenUpdating = True
       
    Range("A1").Select
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Stort udvalg af Excel kurser til alle niveauer og jobfunktioner

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
TIDSBEGRÆNSET KAMPAGNE: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner GRATIS.